问题描述
我想创建多个分辨率不同但音频相同的输出视频。 Afaik音频编码是一种输出选项。
ffmpeg \
-hwaccel qsv -c:v h264_qsv \
-i <input> \
-filter_complex '[0:a]aformat=channel_layouts=stereo,aresample=async=1,asplit=3[a1][a2][a3];[0:v]vpp_qsv=detail=50:framerate=25,split=3[v1][v2][v3];[v2]vpp_qsv=width=1280[v2o];[v3]vpp_qsv=width=800[v3o]' \
-c:v h264_qsv -c:a aac -b:a 96k -map '[v1]' -map '[a1]' <output> \
-c:v h264_qsv -c:a aac -b:a 96k -map '[v2o]' -map '[a2]' <output> \
-c:v h264_qsv -c:a aac -b:a 96k -map '[v3o]' -map '[a3]' <output>
上面我有两种冗余的音频编码。
如何只对音频编码一次并复制到不同的输出?
解决方法
使用tee muxer:
ffmpeg \
-hwaccel qsv -c:v h264_qsv -i <input> \
-filter_complex '[0:a]aformat=channel_layouts=stereo,aresample=async=1[a];[0:v]vpp_qsv=detail=50:framerate=25,split=3[v1][v2][v3];[v2]vpp_qsv=width=1280[v2o];[v3]vpp_qsv=width=800[v3o]' \
-map '[v1]' -map '[v2o]' -map '[v3o]' -map '[a]' \
-c:v h264_qsv -c:a aac -b:a 96k -f tee -flags +global_header \
"[select=\'v:0,a\']output.mkv|[select=\'v:1,a\':f=flv:onfail=ignore]rtmp://server0/app/instance/playpath|[select=\'v:2,a\':movflags=+faststart]output.mp4"
,
我发现了一种解决方法,其中有一些用于合并和解复用的开销,但从长远来看可以节省:
ffmpeg -i <input> \
-af 'aformat=channel_layouts=stereo,aresample=async=1' \
-c:a libopus -b:a 64k -ar 48k \
-c:v copy \
-f mpegts - | \
ffmpeg \
-hwaccel qsv -c:v h264_qsv \
-f mpegts -i - \
-filter_complex '[0:v]vpp_qsv=detail=50:framerate=25,split=3[v][v2][v3];[v2]vpp_qsv=width=1280[720p];[v3]vpp_qsv=width=800[450p]' \
-map '[v]' -map 0:a -c:v h264_qsv -c:a copy <output> \
-map '[720p]' -map 0:a -c:v h264_qsv -c:a copy <output> \
-map '[450p]' -map 0:a -c:v h264_qsv -c:a copy <output>