You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

FFmpeg将多音频轨道合并为单12声道音频轨的命令修正求助

FFmpeg将多音频轨道合并为单12声道音频轨的命令修正求助

嘿,我帮你分析下问题所在,然后给你修正后的命令:

问题根源

你原来的命令里,[0:a]是指输入文件的所有音频轨道合并成的一个复合流,而不是单独的每个单声道轨道。所以你每次用pan=mono|c0=cX的时候,其实都是从这个混合流里取对应声道,而不是从单个源音频轨道取——这就导致所有源轨道的声音都被挤到了输出的第一个声道,剩下的声道自然没声音。

解决方案思路

我们需要单独引用每个源单声道音频轨道(用0:a:00:a:10:a:2...这样的索引,分别对应第1、第2、第3个源音频轨道),然后把每个源轨道映射到12声道输出的对应位置,剩下的声道用静音填充。

修正后的命令

针对固定轨道数的情况(比如4个源轨道)

如果你的源文件轨道数固定,直接用这个命令:

-i <input>.mp4 -c:v prores_ks -profile:v 0 -quant_mat 2 -c:a pcm_s16le \
-filter_complex "\
# 把每个源单声道轨道映射到12声道的对应位置,其余声道留空
[0:a:0]pan=12c|c0=c0[a0]; \
[0:a:1]pan=12c|c1=c0[a1]; \
[0:a:2]pan=12c|c2=c0[a2]; \
[0:a:3]pan=12c|c3=c0[a3]; \
# 生成12声道的静音流
aevalsrc=0:channel_layout=12c:duration=-1[silence]; \
# 合并所有映射后的轨道和静音流,确保最终是12声道
[a0][a1][a2][a3][silence]amix=inputs=5:dropout_transition=0[aout]" \
-map 0:v -map "[aout]" <out>.mov

适配任意源轨道数的通用命令(适合FFAStrans自动化场景)

因为你用FFAStrans做自动化,需要适配不同轨道数的文件,我们可以利用FFAStrans的内置变量%source_audio_streams%获取源文件的音频轨道数,再动态构建映射逻辑:

-i <input>.mp4 -c:v prores_ks -profile:v 0 -quant_mat 2 -c:a pcm_s16le \
-filter_complex "\
# 先把所有源单声道轨道合并成一个多声道流
[0:a]amerge=inputs=%source_audio_streams%[merged]; \
# 将合并后的多声道流扩展为12声道,多余的位置自动填充静音
[merged]pan=12c|c0=c0|c1=c1|c2=c2|c3=c3|c4=c4|c5=c5|c6=c6|c7=c7|c8=c8|c9=c9|c10=c10|c11=c11[aout]" \
-map 0:v -map "[aout]" <out>.mov

这个命令的逻辑是:先把所有源单声道轨道合并成一个N声道流(N是源轨道数),再用pan滤镜把这个N声道流的每个声道对应到12声道输出的前N个位置,剩下的声道默认填充静音。

验证建议

你可以用ffmpeg -i <out>.mov查看输出文件的音频信息,确认是12声道的PCM流,然后再用Switch Telestream Player检查声道映射是否正确。

备注:内容来源于stack exchange,提问作者nek_unconcious

火山引擎 最新活动