如何在FFMpeg中串联两个或多个具有不同帧速率的视频?

时间:2019-04-22 12:13:03

标签: video ffmpeg concatenation raspberry-pi3

我有多个(> 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

1 个答案:

答案 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