我有一个输入文件,我正在用多种输出分辨率进行编码。我想使用精确的每个输出视频文件使用相同的音频编码参数(-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 执行命令,并比较结果。
这两个命令的输出之间的视频流有些不同。
我无法找出问题所在 - 我想知道这是否与内部并行化有关?