根据ffmpeg文件
-vsync参数
视频同步方法出于兼容性原因,可以将旧值指定为数字。新添加的值必须始终指定为字符串。
丢弃
作为传递,但破坏了所有的时间戳,使得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
生成所有PTS为零的输出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拖放确实破坏了它们,但是mpegts没有重新生成它们?对于需要添加什么才能使它作为一个ffmpeg命令工作,有什么想法吗?
在Linux和Windows上进行测试,结果相同
发布于 2021-05-09 15:56:39
尝试使用-vsync 1对视频进行重新编码,而不使用-fflags +源文件。我在这里找到了一些好消息。这家伙说的是流媒体视频。所以最高品质不是他的目标。但也有有用的信息。
https://videoblerg.wordpress.com/2017/11/10/ffmpeg-and-how-to-use-it-wrong/
第一节-固定帧速率
-r用于指定输出帧速率。这必须与输入帧速率相同,以消除抖动。使用1选项与-vsync参数一起使用,该选项将相应地重新计时PTS/DTS时间戳。
第六部分-音频也有一些好的建议。
“"aresample=async=1:min_hard_comp=0.100000:first_pts=0”可以帮助您的音频与视频的开头保持一致。容器通常会在不同的点上显示视频的开头和音频的开头。使用这种方式,容器应该没有多少音频漂移或偏移,因为如果音频在视频开始时没有实际启动,它就会用静音或带有负PTS时间戳的装饰音频。“
我还没有尝试过这个,目前还没有同步问题的视频。
https://stackoverflow.com/questions/67075693
复制相似问题