FFmpeg - 对多个输出使用相同的编码音频

FFmpeg - 对多个输出使用相同的编码音频

我有一个输入文件,我正在用多种输出分辨率进行编码。我想使用精确的每个输出视频文件使用相同的音频编码参数(-c:a aac -b:a 64k -ac 1)。为了提高性能,有没有办法不必对相同的音频进行三次不同的编码?

我知道我可以单独编码音频并稍后进行混合,但是音频是否只能编码一次并通过单个命令应用于所有输出文件?

我已经进行了大量搜索,但找不到答案。

这是我的编码字符串:

ffmpeg -i in.flv -r 30 -filter_complex "[0:v]hqdn3d=0:0:6:6,setpts=PTS-STARTPTS[dn]; [dn]split=3[dn1][dn2][dn3]; 
[dn1]copy[v1out]; [dn2]scale=w=854:h=480[v2out]; [dn3]scale=w=640:h=360[v3out]" 
-map [v1out] -c:v:0 libx264 -x264-params "keyint=150:min-keyint=150" -preset slow -crf 26 -map 0:a:0 -c:a:0 aac -b:a:0 64k -ac 1 -f mp4 out.720.mp4 
-map [v2out] -c:v:1 libx264 -x264-params "keyint=150:min-keyint=150" -preset slow -crf 26 -map 0:a:0 -c:a:1 aac -b:a:1 64k -ac 1 -f mp4 out.480.mp4 
-map [v3out] -c:v:2 libx264 -x264-params "keyint=150:min-keyint=150" -preset slow -crf 26 -map 0:a:0 -c:a:2 aac -b:a:2 64k -ac 1 -f mp4 out.360.mp4

答案1

我们可能会使用球座伪多路复用器如上所述这里

ffmpeg -y -i in.flv -filter_complex "[0:v]fps=30,hqdn3d=0:0:6:6,setpts=PTS-STARTPTS[dn];[dn]split=3[dn1][dn2][dn3];[dn1]copy[v1out];[dn2]scale=w=854:h=480[v2out]; [dn3]scale=w=640:h=360[v3out]" -map [v1out] -map [v2out] -map [v3out] -map 0:a:0 -c:v:0 libx264 -x264-params "keyint=150:min-keyint=150" -preset:v:0 slow -crf:0 26 -c:v:1 libx264 -x264-params "keyint=150:min-keyint=150" -preset:v:1 slow -crf:1 26 -c:v:2 libx264 -x264-params "keyint=150:min-keyint=150" -preset:v:2 slow -crf:2 26 -c:a aac -ac 1 -b:a 64k -f tee "[select=\'v:0,a\']out.720.mp4|[select=\'v:1,a\']out.480.mp4|[select=\'v:2,a\']out.360.mp4"

-f tee "[select=\'v:0,a\']out.720.mp4|[select=\'v:1,a\']out.480.mp4|[select=\'v:2,a\']out.360.mp4"

将相同的编码音频流与三个不同的视频流进行复用。


测试:

构建1280x720合成视频模式(用作测试输入):

ffmpeg -y -f lavfi -i testsrc=size=1280x720:rate=1 -f lavfi -i sine=frequency=400 -c:v libx264 -acodec aac -ar 24000 -pix_fmt yuv420p -t 10 in.flv

执行原始命令并进行一些修改。
注意:

  • FFmpeg 抱怨您原始命令的排序和流选择。

更新的命令:

ffmpeg -y -i in.flv -filter_complex "[0:v]fps=30,hqdn3d=0:0:6:6,setpts=PTS-STARTPTS[dn];[dn]split=3[dn1][dn2][dn3];[dn1]copy[v1out];[dn2]scale=w=854:h=480[v2out]; [dn3]scale=w=640:h=360[v3out]" -b:a:0 64k -b:a:1 64k -b:a:2 64k -preset:v:0 slow -preset:v:1 slow -preset:v:2 slow -crf:0 26 -crf:1 26 -crf:2 26 -map [v1out] -c:v:0 libx264 -x264-params "keyint=150:min-keyint=150" -map 0:a:0 -c:a:0 aac -ac:0 1 -f mp4 out.720.mp4 -map [v2out] -c:v:1 libx264 -x264-params "keyint=150:min-keyint=150" -map 0:a:0 -c:a:1 aac -ac:1 1 -f mp4 out.480.mp4 -map [v3out] -c:v:2 libx264 -x264-params "keyint=150:min-keyint=150" -map 0:a:0 -c:a:2 aac -ac:2 1 -f mp4 out.360.mp4

使用 tee muxer 执行命令,并比较结果。


这两个命令的输出之间的视频流有些不同。
我无法找出问题所在 - 我想知道这是否与内部并行化有关?

相关内容