Reputation: 1878
I've got a (very large!) Apple ProRes 422 file with 16ch audio. To be able to use it on a less powerful computer, I'd like to convert it to a standard MP4 file (h264 video codec, stereo audio). The original file has 16 channels of audio, however, and FFmpeg gives an error when I try to convert it ('Rematrix is needed'). How do I do rematrixing of audio channels? Are there additional steps needed?
This is the FFmpeg command I used:
ffmpeg -y -i Capture0000.mov -vcodec libx264 -vb 2000k -pix_fmt yuv420p -coder 0 -profile:v baseline -acodec libfaac -ab 128k /tmp/out.mp4
This is the FFmpeg output:
ffmpeg version 2.2.git Copyright (c) 2000-2014 the FFmpeg developers
built on May 8 2014 14:17:45 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
configuration: --prefix=/usr/local/ffmpeg_build --extra-cflags=-I/usr/local/ffmpeg_build/include --extra-ldflags=-L/usr/local/ffmpeg_build/lib --bindir=/usr/local/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-x11grab --enable-libxvid --enable-libfaac
libavutil 52. 81.100 / 52. 81.100
libavcodec 55. 60.103 / 55. 60.103
libavformat 55. 37.102 / 55. 37.102
libavdevice 55. 13.101 / 55. 13.101
libavfilter 4. 5.100 / 4. 5.100
libswscale 2. 6.100 / 2. 6.100
libswresample 0. 18.100 / 0. 18.100
libpostproc 52. 3.100 / 52. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Capture0000.mov':
Metadata:
creation_time : 2014-08-17 18:30:31
Duration: 01:01:22.52, start: 0.000000, bitrate: 202001 kb/s
Stream #0:0(eng): Video: prores (apch / 0x68637061), yuv422p10le, 1920x1080, 183513 kb/s, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 2500 tbn, 2500 tbc (default)
Metadata:
creation_time : 2014-08-17 18:30:31
handler_name : Apple Alias Data Handler
encoder : Apple ProRes 422 (HQ)
Stream #0:1(eng): Audio: pcm_s24le (lpcm / 0x6D63706C), 48000 Hz, 16 channels, s32, 18432 kb/s (default)
Metadata:
creation_time : 2014-08-17 18:30:31
handler_name : Apple Alias Data Handler
[auto-inserted resampler 0 @ 0x3943da0] [SWR @ 0x39441a0] Rematrix is needed between 16 channels and 5.1 but there is not enough information to do it
[auto-inserted resampler 0 @ 0x3943da0] Failed to configure output pad on auto-inserted resampler 0
Error opening filters!
This is the FFprobe output:
ffprobe version 2.2.git Copyright (c) 2007-2014 the FFmpeg developers
built on May 8 2014 14:17:45 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
configuration: --prefix=/usr/local/ffmpeg_build --extra-cflags=-I/usr/local/ffmpeg_build/include --extra-ldflags=-L/usr/local/ffmpeg_build/lib --bindir=/usr/local/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-nonfree --enable-x11grab --enable-libxvid --enable-libfaac
libavutil 52. 81.100 / 52. 81.100
libavcodec 55. 60.103 / 55. 60.103
libavformat 55. 37.102 / 55. 37.102
libavdevice 55. 13.101 / 55. 13.101
libavfilter 4. 5.100 / 4. 5.100
libswscale 2. 6.100 / 2. 6.100
libswresample 0. 18.100 / 0. 18.100
libpostproc 52. 3.100 / 52. 3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Capture0000.mov':
Metadata:
creation_time : 2014-08-17 18:30:31
Duration: 01:01:22.52, start: 0.000000, bitrate: 202001 kb/s
Stream #0:0(eng): Video: prores (apch / 0x68637061), yuv422p10le, 1920x1080, 183513 kb/s, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 2500 tbn, 2500 tbc (default)
Metadata:
creation_time : 2014-08-17 18:30:31
handler_name : Apple Alias Data Handler
encoder : Apple ProRes 422 (HQ)
Stream #0:1(eng): Audio: pcm_s24le (lpcm / 0x6D63706C), 48000 Hz, 16 channels, s32, 18432 kb/s (default)
Metadata:
creation_time : 2014-08-17 18:30:31
handler_name : Apple Alias Data Handler
Upvotes: 3
Views: 5824
Reputation: 3334
The posted solution completely discards all audio channels except for the first 2. For a 16 channel audio source it's unclear how to mix this manually since I don't know what each channel means, but if you just rely on ffmpeg's built in audio channel conversion it should be better than just ignoring all channels but the first two.
$ ffmpeg -i Capture0000.mov -c:v copy -ac 2 stereo_output.mp4
In the above example -ac 2
will tell ffmpeg to downmix the audio to stereo. It'll then choose a reasonable default audio codec for a .mp4 file. You can of course also choose the audio encoding settings like you did in your question.
Upvotes: 2
Reputation: 1878
Found it! After extracting only the audio, it turned out the first two channels were stereo, and the other four empty, so I added this:
-af 'pan=stereo:c0=FL:c1=FR'
Which takes only the front left and front right channel for the stereo mix.
EDIT: newer versions of FFMpeg require the use of | instead of :, so it would be
stereo|c0=FL|c1=FR
Upvotes: 3