FFMPEG-vsync丢弃和再生

FFMPEG-vsync丢弃和再生,ffmpeg,Ffmpeg,根据ffmpeg文档 -垂直同步参数 视频同步方法。出于兼容性原因,旧值可以指定为数字。新增加的价值将必须进行调整 始终指定为字符串 下降 作为passthrough,但销毁所有时间戳,使muxer 根据帧速率生成新的时间戳 mpegts mux似乎没有正确地重新生成时间戳(PTS/DTS);但是,vsync之后的输出管道会下降到第二个进程,因为原始h264会强制mpegts重新生成PTS 生成测试流 ffmpeg -f lavfi -i testsrc=duration=20:size=128

根据ffmpeg文档

-垂直同步参数

视频同步方法。出于兼容性原因,旧值可以指定为数字。新增加的价值将必须进行调整 始终指定为字符串

下降

作为passthrough,但销毁所有时间戳,使muxer 根据帧速率生成新的时间戳

mpegts mux似乎没有正确地重新生成时间戳(PTS/DTS);但是,vsync之后的输出管道会下降到第二个进程,因为原始h264会强制mpegts重新生成PTS

生成测试流

ffmpeg -f lavfi -i testsrc=duration=20:size=1280x720:rate=50 -pix_fmt yuv420p -c:v libx264 -b:v 4000000 -x264-params ref=1:bframes=0:vbv-maxrate=4500:vbv-bufsize=4000:nal-hrd=cbr:aud=1:bframes=0:intra-refresh=1:keyint=30:min-keyint=30:scenecut=0 -f mpegts -muxrate 5985920 -pcr_period 20 video.ts -y
生成具有正确间隔的PTS值的输出ts

ffmpeg -i video.ts -vsync drop -c:v copy -bsf:v h264_mp4toannexb -f h264   - | ffmpeg -fflags +igndts -fflags +nofillin -fflags +genpts -r 50 -i - -c:v copy -f mpegts -muxrate 5985920  video_all_pts_ok.ts -y
生成所有PT为零的输出ts

ffmpeg -i video.ts -vsync drop -c:v copy -bsf:v h264_mp4toannexb -f mpegts - | ffmpeg -fflags +igndts -fflags +nofillin -fflags +genpts -r 50 -i - -c:v copy -f mpegts -muxrate 5985920 video_all_pts_zero.ts -y
看起来vsync drop确实摧毁了它们,但是mpegts没有重新生成它们?关于需要添加什么才能使其作为单个ffmpeg命令工作,您有什么想法吗


在Linux和Windows上测试,结果相同

尝试使用-vsync 1重新编码视频,而不使用-fflags+genpts。我在这里找到了一些好信息。这家伙在谈论流媒体视频。所以最高质量不是他的目标。但是有一些有用的信息

第一节-恒定帧速率

“-r用于指定输出帧速率。这必须与输入帧速率相同,以消除抖动。这与-vsync参数一起使用,使用1选项将相应地重定时PTS/DTS时间戳”

第六节-音频[也有一些好的建议]

“-af”aresample=async=1:min\u hard\u comp=0.100000:first\u pts=0“有助于使音频与视频开头保持一致。对于一个容器来说,视频的开头和音频的开头在不同的点上是很常见的。通过使用此选项,您的容器应该几乎没有音频漂移或偏移,因为如果音频实际上没有在视频开始时启动,它将使用静音填充音频,或者使用负PTS时间戳修剪音频。”

我还没有尝试过,目前没有同步问题的视频