我有多个(> 100)视频,它们具有各种恒定的帧频(例如7 FPS,8 FPS,16 FPS,25 FPS),但编解码器和分辨率相同。
我想将它们串联(使用ffmpeg concat)到一个具有可变帧速率(VFR)的视频中,以便串联的视频以各自的帧速率播放每个部分。
到现在为止,我仅设法将所有文件合并为一个具有恒定(CFR)的视频。 25 FPS。
不利的一面是,所有<25 FPS的零件的播放速度都更快。
我使用-vsync 2 -r 25
尝试告诉ffmpeg使用最大FPS为25的VFR,但是mediainfo
报告了CFR为25 FPS的视频。
如果我仅使用-vsync 2
(不使用-r
),则会获得VFR视频输出,但是mediainfo
报告说这是一个最低11.9 FPS,最高12 FPS的视频(所有视频的平均FPS)。
如何将各种视频合并为一个VFR视频?
这是我使用的命令:
ffmpeg -y -vsync 2 -r 25 -f concat -safe 0 -i /tmp/filelist.txt -c:v h264_omx -pix_fmt yuv420p -b:v 524231 -maxrate 524231 -bufsize 1048462 -an /tmp/${DATE}.mp4
我在ffmpeg version 3.2.12-1~deb9u1+rpt
上使用(Raspbian 6.3.0-18+rpi1+deb9u1
答案 0 :(得分:0)
由于我的问题主要在评论中回答,因此我想发布一种不带中间文件的其他解决方案。
我使用命名管道并发送每个代码段,这些代码段会转换为例如5 FPS,作为该管道的原始视频。
使用exec
保持管道打开至关重要。
将多个720p AVI视频合并为单个MKV视频的简单bash脚本如下:
#!/bin/bash
send2pipe() {
# Open the pipe permanently
exec 7<>outpipe
# Decode and send every raw frame to the pipe
for l in $(ls *avi); do ffmpeg -nostdin -i $l -an -filter:v fps=fps=5 -f rawvideo pipe:1 > outpipe 2> /dev/null ; done &
# Close the pipe (aka send EOF), which causes the encoding app to terminate
exec 7>&-
}
# Create the pipe
mkfifo outpipe
# Start sending videos to the pipe in the background
send2pipe &
# Encode the frames in the pipe to a single video
ffmpeg -fflags +genpts -f rawvideo -s:v 1280x720 -r 5 -i outpipe -an -c:v libx264 -preset ultrafast -crf 35 -y output.mkv
# Remove the pipe
rm outpipe