我的原创视频"test1.mp4"具有以下属性
Stream #0:0(eng): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 283 kb/s, 34.55 fps, 50 tbr, 50k tbn, 50 tbc (default).
我从运行ffmpeg -i test1.mp4
得到的。
我必须将视频编解码器更改为h264
。所以我使用下面的命令
转换了上面的视频ffmpeg -i test1.mp4 test1.mp4
.
但是转换后的视频的道具发生了变化。FPS是50,TBR是50。而且帧数也比原始视频增加了。
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 114 kb/s, 50 fps, 50 tbr, 12800 tbn, 100 tbc (default)
在遵循此链接https://superuser.com/questions/1307863/why-is-ffmpeg-changing-framerate-from-60-to-120之后,我发现ffmpeg在转换时使用tbr
值而不是fps
,以便不丢失任何帧,但以重复帧为代价。正如上面的链接所建议的,我在转换视频时使用了vsync 0
选项。
ffmpeg -i test1.mp4 -vsync 0 test1_sync.mp4.
现在帧数与输入视频相同(使用ffprobe
检查)。但fps
与原始视频仍有些许不同。
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 61 kb/s, 12.88 fps, 50 tbr, 12800 tbn, 100 tbc (default).
为什么帧数保持不变,即使fps是不同的?
对于我的用例,我需要转换的视频在与原始视频相同的时间戳具有相同的帧数,我只需要将编解码器更改为h264
。我不希望重复或丢失帧。
我怎样才能做到这一点?
使用-r可以表示fps
ffmpeg -i test1.mp4 -r 34.55 test1_sync.mp4
持续时间:00:00:54.18,起始时间:0.000000,比特率:273 kb/s流#0:0(und):视频:h264(高)(avc1/0x31637661), yuv420p, 202x360 [SAR 1:1: DAR 101:180], 269 kb/s, 34.55 fps, 34.55 tbr, 11056 tbn, 69.10 tbc(默认)