目标是创建多个输出文件,这些文件的比特率与单个源文件不同。记录的解决方案有效,但效率低下。我发现最有效的解决方案没有记录在任何我能看到的地方。我将其发布在此处进行审核,并询问其他人是否知道可以进行其他优化。
Source file MPEG-2 Video (Letterboxed) 1920x1080 @>10Mbps
MPEG-1 Audio @ 384Kbps
Destiation files H264 Video 720x400 @ multiple bitrates
AAC Audio @ 128Kbps
Machine Multi-core Processor
每个比特率的视频质量非常重要,因此我们使用“中等”预设的双通模式运行
VIDEO_OPTIONS_P2 = -vcodec libx264 -preset medium -profile:v main -g 72 -keyint_min 24 -vf scale=720:-1,crop=720:400
第一种方法是将它们全部编码在并行过程中
ffmpeg -y -i $INPUT_FILE $AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 250k -threads auto -f mp4 out-250.mp4 & ffmpeg -y -i $INPUT_FILE $AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 500k -threads auto -f mp4 out-500.mp4 & ffmpeg -y -i $INPUT_FILE $AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 700k -threads auto -f mp4 out-700.mp4 &
明显的低效率是对每个进程读取,解码,缩放和裁剪源文件。我们怎么能这样做一次,然后用结果喂编码器?
希望在单个ffmpeg命令中生成所有编码可以优化重复步骤。
ffmpeg -y -i $INPUT_FILE \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 250k -threads auto -f mp4 out-250.mp4 \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 500k -threads auto -f mp4 out-500.mp4 \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 700k -threads auto -f mp4 out-700.mp4
然而,编码时间几乎与之前的多进程方法相同。这让我相信所有步骤都会重复执行。
为了强制ffmpeg只读取,解码和缩放一次,我将这些步骤放在一个ffmpeg进程中,并将结果传送到执行编码的另一个ffmpeg进程。这使整体处理时间缩短了15%-20%。
INPUT_STREAM="ffmpeg -i $INPUT_FILE -vf scale=720:-1,crop=720:400 -threads auto -f yuv4mpegpipe -"
$INPUT_STREAM | ffmpeg -y -f yuv4mpegpipe -i - \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 250k -threads auto out-250.mp4 \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 500k -threads auto out-500.mp4 \
$AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -b:v 700k -threads auto out-700.mp4
有没有人看到这样做的潜在问题,或者知道更好的方法?
答案 0 :(得分:4)
如果将音频/视频选项应用于第一个进程的管道输出,则可以节省一些CPU,因为它会将3个编码交换为单个编码。
ffmpeg -i $INPUT_FILE -vf scale=720:-1,crop=720:400 $AUDIO_OPTIONS_P2 $VIDEO_OPTIONS_P2 -f yuv4mpegpipe -\
| ffmpeg -y -f yuv4mpegpipe -i - \
-b:v 250k out-250.mp4 \
-b:v 500k out-500.mp4 \
-b:v 700k out-700.mp4
这是旧版ffmpeg的推荐方法。自本月早些时候开始有一种更新的方法(没有测试它):http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs
答案 1 :(得分:0)
我认为OP更想要的是使用过滤器一次,编码几次。使用的方法很好,但你可以通过" tee"过滤器,另请参阅最近添加到http://ffmpeg.org/trac/ffmpeg/wiki/Creating%20multiple%20outputs&#34的底部;同一输入的多个编码"