我使用的是多声道音频文件(高阶电流电子学),通常至少有16个频道。
有时,我只对音频通道的一个子集感兴趣(例如,包含更多频道的文件的前25个通道)。
为此,我有一个脚本,如下所示,它需要一个多通道输入文件、一个输出文件和我想要提取的通道数:
#!/bin/sh
infile=$1
outfile=$2
channels=$3
channelmap=$(seq -s"|" 0 $((channels-1)))
ffmpeg -y -hide_banner \
-i "${infile}" \
-filter_complex "[0:a]channelmap=${channelmap}" \
-c:a libopus -mapping_family 255 -b:a 160k -sample_fmt s16 -vn -f webm -dash 1 \
"${outfile}"
实际的通道提取是通过过滤器完成的,这是用类似于-filter:complex "[0:a]channelmap=0|1|2|3"
的东西调用的。
这对1,2,4或16个频道很有用。
然而,它失败了9个通道,25和17个(通常任何与>>16通道)。
我得到的错误是:
$ ffmpeg -y -hide_banner -i input.wav -filter_complex "[0:a]channelmap=0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16" -c:a libopus -mapping_family 255 -b:a 160k -sample_fmt s16 -vn -f webm -dash 1 output.webm
Input #0, wav, from 'input.wav':
Duration: 00:00:09.99, bitrate: 17649 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 25 channels, s16, 17640 kb/s
[Parsed_channelmap_0 @ 0x5568874ffbc0] Output channel layout is not set and cannot be guessed from the maps.
[AVFilterGraph @ 0x5568874fff40] Error initializing filter 'channelmap' with args '0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16'
Error initializing complex filters.
Invalid argument
因此,ffmpeg无法猜测17个通道文件的频道布局。ffmpeg -layouts
只列出1,2,3,4,5,6,7,8和16的频道布局。
然而,我真的不关心频道的布局。整个“频道布局”的概念都围绕着这样的理念,即每个音频频道都应该去一个不同的演讲者。但我的音频频道根本不是扬声器馈送。
因此,我尝试提供类似于-filter_complex "[0:a]channelmap=map=0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16:channel_layout=unknown"
的显式通道布局,但这会导致解析通道布局时出现错误:
$ ffmpeg -y -hide_banner -i input.wav -filter_complex "[0:a]channelmap=map=0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16:channel_layout=unknown" -c:a libopus -mapping_family 255 -b:a 160k -sample_fmt s16 -vn -f webm -dash 1 output.webm
Input #0, wav, from 'input.wav':
Duration: 00:00:09.99, bitrate: 17649 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 25 channels, s16, 17640 kb/s
[Parsed_channelmap_0 @ 0x55b60492bf80] Error parsing channel layout: 'unknown'.
[AVFilterGraph @ 0x55b604916d00] Error initializing filter 'channelmap' with args 'map=0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16:channel_layout=unknown'
Error initializing complex filters.
Invalid argument
我还尝试了像any
、all
、none
、0x0
和0xFF
这样的值,结果是一样的。我尝试使用mono
(因为通道是独立的),但是ffmpeg
试图变得聪明,并且告诉我单通道布局不能有17个通道。
我知道ffmpeg
不需要布局就可以处理多通道文件。例如,在没有-filter_complex "..."
的情况下转换一个25通道文件是没有问题的,而ffprobe
给了我一个unknown
通道布局。
所以:在创建一个只包含输入通道子集的输出文件时,我如何告诉ffmpeg
不要关心channel_layout?
发布于 2020-12-02 15:53:00
基于音频通道操作,您可以尝试将n
分离成单独的流,然后将它们重新组合在一起:
-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];\
[0:a]pan=mono|c0=c12[a12];\
[0:a]pan=mono|c0=c13[a13];\
[0:a]pan=mono|c0=c14[a14];\
[0:a]pan=mono|c0=c15[a15];\
[0:a]pan=mono|c0=c16[a16];\
[a0][a1][a2][a3][a4][a5][a6][a7][a8][a9][a10][a11][a12][a13][a14][a15][a16]amerge=inputs=17"
发布于 2021-08-25 08:32:37
基于@aergistal的回答,并使用包含10个音频流的mxf文件,我不得不修改过滤器,以便为每个pan过滤器指定输入。使用"pan=mono“时,它只使用一个标识为c0的通道。
-filter_complex "\
[0:a:0]pan=mono|c0=c0[a0];\
[0:a:1]pan=mono|c0=c0[a1];\
[0:a:2]pan=mono|c0=c0[a2];\
[0:a:3]pan=mono|c0=c0[a3];\
[0:a:4]pan=mono|c0=c0[a4];\
[0:a:5]pan=mono|c0=c0[a5];\
[0:a:6]pan=mono|c0=c0[a6];\
[0:a:7]pan=mono|c0=c0[a7];\
[0:a:8]pan=mono|c0=c0[a8];\
[0:a:9]pan=mono|c0=c0[a9];\
[a0][a1][a2][a3][a4][a5][a6][a7][a8][a9]amerge=inputs=10"
https://stackoverflow.com/questions/65109784
复制相似问题