首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ffmpeg中使用多通道音频时忽略"channel_layout“

在ffmpeg中使用多通道音频时忽略"channel_layout“
EN

Stack Overflow用户
提问于 2020-12-02 14:12:54
回答 2查看 1.8K关注 0票数 3

我使用的是多声道音频文件(高阶电流电子学),通常至少有16个频道。

有时,我只对音频通道的一个子集感兴趣(例如,包含更多频道的文件的前25个通道)。

为此,我有一个脚本,如下所示,它需要一个多通道输入文件、一个输出文件和我想要提取的通道数:

代码语言:javascript
运行
复制
#!/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通道)。

我得到的错误是:

代码语言:javascript
运行
复制
$ 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"的显式通道布局,但这会导致解析通道布局时出现错误:

代码语言:javascript
运行
复制
$ 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

我还尝试了像anyallnone0x00xFF这样的值,结果是一样的。我尝试使用mono (因为通道是独立的),但是ffmpeg试图变得聪明,并且告诉我单通道布局不能有17个通道。

我知道ffmpeg不需要布局就可以处理多通道文件。例如,在没有-filter_complex "..."的情况下转换一个25通道文件是没有问题的,而ffprobe给了我一个unknown通道布局。

所以:在创建一个只包含输入通道子集的输出文件时,我如何告诉ffmpeg不要关心channel_layout?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-02 15:53:00

基于音频通道操作,您可以尝试将n分离成单独的流,然后将它们重新组合在一起:

代码语言:javascript
运行
复制
-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"
票数 4
EN

Stack Overflow用户

发布于 2021-08-25 08:32:37

基于@aergistal的回答,并使用包含10个音频流的mxf文件,我不得不修改过滤器,以便为每个pan过滤器指定输入。使用"pan=mono“时,它只使用一个标识为c0的通道。

代码语言:javascript
运行
复制
-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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65109784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档