Splitting one stream 12 channel audio into separate mono channels?
Solution 1
I finally got it. For whatever reason when I use "filter_complex" solution provided by the FFMPEG god LordNeckBeard..it splits the channels correctly but players and video software only recognize the first audio track. This solution works correctly. The channels are split and audio is recognized!
C:\FFMPEG\bin\ffmpeg -i "C:\Test\InputFile.mov" -map 0:0 -vcodec copy -c:a pcm_s24le -map 0:1 -filter:a:0 "pan=mono|c0=c0" -map 0:1 -filter:a:1 "pan=mono|c0=c1" -map 0:1 -filter:a:2 "pan=mono|c0=c2" -map 0:1 -filter:a:3 "pan=mono|c0=c3" -map 0:1 -filter:a:4 "pan=mono|c0=c4" -map 0:1 -filter:a:5 "pan=mono|c0=c5" -map 0:1 -filter:a:6 "pan=mono|c0=c6" -map 0:1 -filter:a:7 "pan=mono|c0=c7" -map 0:1 -filter:a:8 "pan=mono|c0=c8" -map 0:1 -filter:a:9 "pan=mono|c0=c9" -map 0:1 -filter:a:10 "pan=mono|c0=c10" -map 0:1 -filter:a:11 "pan=mono|c0=c10" "C:\Test\OutputFile.mov"
Hope this helps some of you in some of your troubles!
Solution 2
What went wrong
You're trying to map input streams that don't exist. Here are your input streams:
Stream #0:0 Video: prores
Stream #0:1 Audio: pcm_s24le
Stream #0:2 Data: tmcd
You're telling ffmpeg
to map 0:0
-0:11
, but only 0:0
, 0:1
, and 0:2
exist.
Example solution
You can use the pan filter to turn a single multichannel stream into multiple single channel streams.
ffmpeg -i input.mov -filter_complex \
"[0:a]pan=mono|c0=c0[a0]; \
[0:a]pan=mono|c0=c1[a1]; \
[0:a]pan=mono|c0=c2[a2]; \
[0:a]pan=mono|c0=c3[a3]; \
[0:a]pan=mono|c0=c4[a4]; \
[0:a]pan=mono|c0=c5[a5]; \
[0:a]pan=mono|c0=c6[a6]; \
[0:a]pan=mono|c0=c7[a7]; \
[0:a]pan=mono|c0=c8[a8]; \
[0:a]pan=mono|c0=c9[a9]; \
[0:a]pan=mono|c0=c10[a10]; \
[0:a]pan=mono|c0=c11[a11]" \
-map 0 -map -0:a -map "[a0]" -map "[a1]" -map "[a2]" -map "[a3]" \
-map "[a4]" -map "[a5]" -map "[a6]" -map "[a7]" \
-map "[a8]" -map "[a9]" -map "[a10]" -map "[a11]" \
-c copy -c:a pcm_s24le \
output.mov
Another method would be to use -map
and -map_channel
, but the syntax is more confusing.
Mapping
In this case you can't rely on the default stream selection behavior, so you have to tell ffmpeg
what streams you want with the -map
option. The various -map
options in the example may seem confusing at first:
-map 0
- Include all input streams from the first (and only) input to the output.-
-map -0:a
- A negative mapping to omit all input audio streams to the output. This gets applied after-map 0
. The original audio stream is excluded because the audio outputs from the filters will be used instead.- An alternative method would be to omit
-map 0 -map -0:a
and use-map 0:v -map 0:d
instead to map the video and data streams, but what if your input also contained subtitles? Then you would need to add-map 0:s
. You can see how using "include everything but audio" is more flexible, efficient, and lazy.
- An alternative method would be to omit
-map "[a0]" ... -map "[a11]"
- Include the audio streams that are outputted from the pan filters.
So after all of these maps your input will contain: the video stream, the data tmcd
stream, and the 12 audio streams.
Your ffmpeg
is old
Development is very active. Download a recent build.
Related videos on Youtube
Kevin
Been "programming" for a number of years. I am very thankful for the stackoverflow god and is members who have helped me in great times of need!
Updated on September 18, 2022Comments
-
Kevin almost 2 years
I have a 12 channel QuickTime single audio stream which I am attempting to split into separate 12 audio streams in one output file. From MediaInfo my source audio configuration looks like the following:
ID : 2 Format : PCM Format settings, Endianness : Little Format settings, Sign : Signed Codec ID : lpcm Duration : 1mn 40s Bit rate mode : Constant Bit rate : 12.8 Mbps Channel(s) : 12 channels
I have done this successfully with 6 channels but not sure how to do this with 12 channels. The 6 channel command likes like the following:
ffmpeg -i "C:\FFMPEG\bin\SomeTestFile.mov" -filter_complex "channelsplit=channel_layout=5.1[0:2][0:3][0:4][0:5][0:6]" -map "[0:2]" -acodec pcm_s16le -ar 44.1k -ac 1 -map "[0:3]" -acodec pcm_s16le -ar 44.1k -ac 1 -map "[0:4]" -acodec pcm_s16le -ar 44.1k -ac 1 -map "[0:5]" -acodec pcm_s16le -ar 44.1k -ac 1 -map "[0:6]" -acodec pcm_s16le -ar 44.1k -ac 1 -threads 1 "Output.mov"
But from the layout parameters list in ffmpeg this doesn't seem possible as it only goes up to 8.1. I tried to change the "channel_layout=11.1" and adding the additional mapping parameters but I get:
[Parsed_channelsplit_0 @ 0000000000338820] Error parsing channel layout '12.0'. [AVFilterGraph @ 0000000000352420] Error initializing filter 'channelsplit' with args 'channel_layout=11.1' Error configuring filters.
I found a command in a forum post with this:
ffmpeg -i "C:\FFMPEG\bin\SomeTestFile.mov" -acodec copy -filter_complex channelsplit -f mov "Output.mov"
but get:
[auto-inserted resampler 0 @ 0000000002bf3d00] [SWR @ 0000000002bc82c0] Rematrix is needed between 12 channels and stereo but there is not enough information to do it [auto-inserted resampler 0 @ 0000000002bf3d00] Failed to configure output pad on auto-inserted resampler 0
I tried the following command:
ffmpeg -i "C:\FFMPEG\bin\input.mov" -map 0:2 -acodec pcm_s16le -ar 44.1k -ac 1 -map 0:3 -acodec pcm_s16le -ar 44.1k -ac 1 -map 0:4 -acodec pcm_s16le -ar 44.1k -ac 1 -map 0:5 -acodec pcm_s16le -ar 44.1k -ac 1 -map 0:6 -acodec pcm_s16le -ar 44.1k -ac 1 -map 0:7 -acodec pcm_s16le -ar 44.1k -ac 1 -map 0:8 -acodec pcm_s16le -ar 44.1k -ac 1 -map 0:9 -acodec pcm_s16le -ar 44.1k -ac 1 -map 0:10 -acodec pcm_s16le -ar 44.1k -ac 1 -map 0:11 -acodec pcm_s16le -ar 44.1k -ac 1 -threads 1 output.mov
but getting the following output error..
ffmpeg version N-66639-g6b347f5 Copyright (c) 2000-2014 the FFmpeg developers built on Oct 5 2014 22:10:17 with gcc 4.9.1 (GCC) configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-zlib libavutil 54. 9.100 / 54. 9.100 libavcodec 56. 2.101 / 56. 2.101 libavformat 56. 7.104 / 56. 7.104 libavdevice 56. 1.100 / 56. 1.100 libavfilter 5. 1.102 / 5. 1.102 libswscale 3. 1.100 / 3. 1.100 libswresample 1. 1.100 / 1. 1.100 libpostproc 53. 1.100 / 53. 1.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\FFMPEG\bin\input.mov': Metadata: major_brand : qt minor_version : 537199360 compatible_brands: qt creation_time : 2015-08-20 21:58:39 Duration: 00:01:40.18, start: 0.000000, bitrate: 149980 kb/s Stream #0:0(eng): Video: prores (apch / 0x68637061), yuv422p10le, 1920x1080, 136073 kb/s, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 24k tbn, 24k tbc (default) Metadata: creation_time : 2015-08-20 21:58:39 handler_name : Apple Alias Data Handler encoder : Apple ProRes 422 (HQ) timecode : 00:00:00:00 Stream #0:1(eng): Audio: pcm_s24le (lpcm / 0x6D63706C), 48000 Hz, 12 channels, s32 (24 bit), 13824 kb/s (default) Metadata: creation_time : 2015-08-20 21:58:39 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 Stream #0:2(eng): Data: none (tmcd / 0x64636D74) (default) Metadata: creation_time : 2015-08-20 21:58:39 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 Stream map '0:3' matches no streams.
Update: After struggle with this issue for a while and discovering that I was able to split the channels successfully I noticed some video software suites and players would only recognize one of the channels instead of all 12 when played by default. I had a "-map 0:a" parameter after my filter graph and once I removed that it worked. I discovered the correct command is as follows:
C:\FFMPEG\bin\ffmpeg -i "C:\Test\TESTCLIP.mov" -filter_complex "[0:a]pan=mono|c0=c0[a0];[0:a]pan=mono|c0=c1[a1];[0:a]pan=mono|c0=c2[a2];[0:a]pan=mono|c0=c3[a3];[0:a]pan=mono|c0=c4[a4];[0:a]pan=mono|c0=c5[a5];[0:a]pan=mono|c0=c6[a6];[0:a]pan=mono|c0=c7[a7];[0:a]pan=mono|c0=c8[a8];[0:a]pan=mono|c0=c9[a9];[0:a]pan=mono|c0=c10[a10];[0:a]pan=mono|c0=c11[a11]" -map 0 -map "[a0]" -map "[a1]" -map "[a2]" -map "[a3]" -map "[a4]" -map "[a5]" -map "[a6]" -map "[a7]" -map "[a8]" -map "[a9]" -map "[a10]" -map "[a11]" -c copy -c:a pcm_s24le "C:\TEST\OUTPUT.mov"
Console Output:
ffmpeg version N-66639-g6b347f5 Copyright (c) 2000-2014 the FFmpeg developers built on Oct 5 2014 22:10:17 with gcc 4.9.1 (GCC) configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-zlib libavutil 54. 9.100 / 54. 9.100 libavcodec 56. 2.101 / 56. 2.101 libavformat 56. 7.104 / 56. 7.104 libavdevice 56. 1.100 / 56. 1.100 libavfilter 5. 1.102 / 5. 1.102 libswscale 3. 1.100 / 3. 1.100 libswresample 1. 1.100 / 1. 1.100 libpostproc 53. 1.100 / 53. 1.100 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\Test\TESTCLIP.mov': Metadata: major_brand : qt minor_version : 537199360 compatible_brands: qt creation_time : 2015-08-25 22:11:49 Duration: 00:01:40.18, start: 0.000000, bitrate: 148100 kb/s Stream #0:0(eng): Video: prores (apch / 0x68637061), yuv422p10le, 1920x1080, 134192 kb/s, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 24k tbn, 24k tbc (default) Metadata: creation_time : 2015-08-25 22:11:49 handler_name : Apple Alias Data Handler encoder : Apple ProRes 422 (HQ) timecode : 00:00:00:00 Stream #0:1(eng): Audio: pcm_s24le (lpcm / 0x6D63706C), 48000 Hz, 12 channels, s32 (24 bit), 13824 kb/s (default) Metadata: creation_time : 2015-08-25 22:11:49 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 Stream #0:2(eng): Data: none (tmcd / 0x64636D74) (default) Metadata: creation_time : 2015-08-25 22:11:49 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 [Parsed_pan_0 @ 0000000005d32500] Pure channel mapping detected: 0 [Parsed_pan_1 @ 00000000003956c0] Pure channel mapping detected: 1 [Parsed_pan_2 @ 00000000003958a0] Pure channel mapping detected: 2 [Parsed_pan_3 @ 0000000000395a80] Pure channel mapping detected: 3 [Parsed_pan_4 @ 00000000003adf00] Pure channel mapping detected: 4 [Parsed_pan_5 @ 0000000000395d00] Pure channel mapping detected: 5 [Parsed_pan_6 @ 00000000003bfcc0] Pure channel mapping detected: 6 [Parsed_pan_7 @ 00000000003bfee0] Pure channel mapping detected: 7 [Parsed_pan_8 @ 00000000003bfd80] Pure channel mapping detected: 8 [Parsed_pan_9 @ 00000000051b2840] Pure channel mapping detected: 9 [Parsed_pan_10 @ 0000000000332680] Pure channel mapping detected: 10 [Parsed_pan_11 @ 0000000000332740] Pure channel mapping detected: 11 [mov @ 00000000051ca260] You requested a copy of the original timecode track so timecode metadata are now ignored Output #0, mov, to 'C:\TEST\OUTPUTFILE.mov': Metadata: major_brand : qt minor_version : 537199360 compatible_brands: qt encoder : Lavf56.7.104 Stream #0:0(eng): Video: prores (apch / 0x68637061), yuv422p10le, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 134192 kb/s, 23.98 fps, 24k tbn, 24k tbc (default) Metadata: creation_time : 2015-08-25 22:11:49 handler_name : Apple Alias Data Handler encoder : Apple ProRes 422 (HQ) timecode : 00:00:00:00 Stream #0:1(eng): Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, 12 channels, s32 (24 bit), 13824 kb/s (default) Metadata: creation_time : 2015-08-25 22:11:49 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 encoder : Lavc56.2.101 pcm_s24le Stream #0:2(eng): Data: none (tmcd / 0x64636D74) (default) Metadata: creation_time : 2015-08-25 22:11:49 handler_name : Apple Alias Data Handler timecode : 00:00:00:00 Stream #0:3: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream #0:4: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream #0:5: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream #0:6: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream #0:7: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream #0:8: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream #0:9: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream #0:10: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream #0:11: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream #0:12: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream #0:13: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream #0:14: Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, mono, s32, 1152 kb/s Metadata: encoder : Lavc56.2.101 pcm_s24le Stream mapping: Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:1 (pcm_s24le) -> pan (graph 0) Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (pcm_s24le (native) -> pcm_s24le (native)) Stream #0:2 -> #0:2 (copy) pan (graph 0) -> Stream #0:3 (pcm_s24le) pan (graph 0) -> Stream #0:4 (pcm_s24le) pan (graph 0) -> Stream #0:5 (pcm_s24le) pan (graph 0) -> Stream #0:6 (pcm_s24le) pan (graph 0) -> Stream #0:7 (pcm_s24le) pan (graph 0) -> Stream #0:8 (pcm_s24le) pan (graph 0) -> Stream #0:9 (pcm_s24le) pan (graph 0) -> Stream #0:10 (pcm_s24le) pan (graph 0) -> Stream #0:11 (pcm_s24le) pan (graph 0) -> Stream #0:12 (pcm_s24le) pan (graph 0) -> Stream #0:13 (pcm_s24le) pan (graph 0) -> Stream #0:14 (pcm_s24le) Press [q] to stop, [?] for help frame= 118 fps=0.0 q=-1.0 size= 854kB time=00:00:04.87 bitrate=1433.4kbits/s frame= 314 fps=313 q=-1.0 size= 70872kB time=00:00:13.05 bitrate=44472.7kbits/s frame= 412 fps=272 q=-1.0 size= 123393kB time=00:00:17.14 bitrate=58967.9kbits/s frame= 516 fps=256 q=-1.0 size= 172269kB time=00:00:21.47 bitrate=65700.3kbits/s frame= 617 fps=245 q=-1.0 size= 277313kB time=00:00:25.69 bitrate=88421.2kbits/s frame= 715 fps=237 q=-1.0 size= 376683kB time=00:00:29.77 bitrate=103620.3kbits/s frame= 859 fps=244 q=-1.0 size= 528409kB time=00:00:35.78 bitrate=120962.3kbits/s frame= 957 fps=238 q=-1.0 size= 633018kB time=00:00:39.87 bitrate=130054.3kbits/s
As you can see in Adobe Premiere..I am able to recreate the mappings correctly. The left is my ffmpeg cut with 12 separate mono channels using the pan filter and the right is the single stream 12 channel sample. Both match! Special thanks to LordNeckBeard!
-
agtoever almost 9 yearsYou don't need to use
-filter_complex
to filter/map the streams. What happens if you try this:ffmpeg -i infile.mov -map 0:1 1.wav -map 0:2 2.wav [etc...]
? Note that I also don't use double quotes or brackets to identify the streams. Check the help page for more explanation and examples. -
Elisa Cha Cha almost 9 yearsI have a possible answer, but I would need to see the complete console output from your
ffmpeg
command to make sure it will work.
-
-
Kevin almost 9 yearsWhen I use the pan filter most video suites only recognize one of the audio channels. If I use the map channel feature all 12 channels are recognized. Is there a way to make all audio channels be recognized?
-
Elisa Cha Cha almost 9 years@Kevin Please show your commands and the complete console outputs. Links to pastebin sites will suffice. What only recognizes one of the audio channels?
-
Kevin almost 9 yearsThanks LordNeckBeard. I have updated my original post with my command and the CCL output under the "Update" section. I have also included some screenshots to illustrate what I meant when tracks are "not recognized". Basically I want all 12 seperate mono tracks to be played when file is opened in QuickTime. If I use the pan filter only one of them will be played..
-
Elisa Cha Cha almost 9 years@Kevin What software is the first screenshot from? Do you have command and console output using
-map_channel
? -
Kevin almost 9 yearsLockNeckBeard, just added my "map_channel_ outout in the "map channel" section. The screenshot in which you see visualization of the audio channels is "Adobe Premier". The others with the drop down list are QuickTime Player 7 on Windows using the movie inspector.
-
Kevin almost 9 yearsLordNeckBeard I thought I had got it.. but turns out that was wrong. I have posted the final working solution!