How to convert raw PCM data to a valid WAV file with ffmpeg?
FFmpeg can't update metadata in WAVE files when output is written over a non-seekable protocol like a pipe. Quicktime seems to rely on metadata to determine file validity. You have to write to file or some other seekable protocol.
ffmpeg -f f32le -i pipe:0 -f wav file-out.wav
BTW, your input is stereo, so it should be
ffmpeg -f f32le -channels 2 -i pipe:0 -f wav file-out.wav
Related videos on Youtube
Maxime Dupré
Updated on September 18, 2022Comments
-
Maxime Dupré almost 2 years
I run this command:
ffmpeg -f f32le -i pipe:0 -f wav pipe:1
ffmpeg version 4.1-tessus https://evermeet.cx/ffmpeg/ Copyright (c) 2000-2018 the FFmpeg developers built with Apple LLVM version 10.0.0 (clang-1000.11.45.5) configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libaom --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libmysofa --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay libavutil 56. 22.100 / 56. 22.100 libavcodec 58. 35.100 / 58. 35.100 libavformat 58. 20.100 / 58. 20.100 libavdevice 58. 5.100 / 58. 5.100 libavfilter 7. 40.101 / 7. 40.101 libswscale 5. 3.100 / 5. 3.100 libswresample 3. 3.100 / 3. 3.100 libpostproc 55. 3.100 / 55. 3.100 Guessed Channel Layout for Input Stream #0.0 : mono Input #0, f32le, from 'pipe:0': Duration: N/A, bitrate: 1411 kb/s Stream #0:0: Audio: pcm_f32le, 44100 Hz, mono, flt, 1411 kb/s Stream mapping: Stream #0:0 -> #0:0 (pcm_f32le (native) -> pcm_s16le (native)) Output #0, wav, to 'pipe:1': Metadata: ISFT : Lavf58.20.100 Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, mono, s16, 705 kb/s Metadata: encoder : Lavc58.35.100 pcm_s16le size= 15144kB time=00:02:55.82 bitrate= 705.6kbits/s speed= 352x size= 30684kB time=00:05:56.24 bitrate= 705.6kbits/s speed= 356x size= 32043kB time=00:06:12.01 bitrate= 705.6kbits/s speed= 354x video:0kB audio:32042kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000238%
Where
pipe:0
is the raw PCM data of the left channel of this file. Here is the output wav.The output seems to be semi valid. It won't play in Quicktime or iTunes. When attempting to add it to an Ableton project, I get "output.wav could not be read. It may be corrupt or not licensed."
However, it does play fine if I simply drag the output wav in Chrome.
The ffprobe output confirms some sort of problem with the file. For this command:
ffprobe -loglevel verbose /Users/maximedupre/Desktop/Dropbox/Programming/api/gg.wav
ffprobe version 3.4.2 Copyright (c) 2007-2018 the FFmpeg developers built with Apple LLVM version 9.0.0 (clang-900.0.39.2) configuration: --prefix=/usr/local/Cellar/ffmpeg/3.4.2 --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --disable-jack --enable-gpl --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma libavutil 55. 78.100 / 55. 78.100 libavcodec 57.107.100 / 57.107.100 libavformat 57. 83.100 / 57. 83.100 libavdevice 57. 10.100 / 57. 10.100 libavfilter 6.107.100 / 6.107.100 libavresample 3. 7. 0 / 3. 7. 0 libswscale 4. 8.100 / 4. 8.100 libswresample 2. 9.100 / 2. 9.100 libpostproc 54. 7.100 / 54. 7.100 [wav @ 0x7f81e3004a00] Ignoring maximum wav data size, file may be invalid [wav @ 0x7f81e3004a00] parser not found for codec pcm_s16le, packets or times may be invalid. [wav @ 0x7f81e3004a00] Estimating duration from bitrate, this may be inaccurate Input #0, wav, from '/Users/maximedupre/Desktop/Dropbox/Programming/api/gg.wav': Metadata: encoder : Lavf58.20.100 Duration: 00:06:12.01, bitrate: 705 kb/s Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 1 channels, s16, 705 kb/s
How can I modify my ffmpeg command to produce a valid wav file?
Cheers!
-
Maxime Dupré about 5 yearsThis seems to be correct. I'm trying to find official documentation for this, are you aware of some? Thanks!
-
Gyan about 5 yearsMany muxers which store metadata have limitations with non-seekable output. Not explicitly documented, but may be a good idea. Will look into it.