这段视频是使用ffmpeg命令从一系列具有数字和预期时间戳的图像中创建的(假设120 fps恒定帧速率):
ffmpeg -framerate 120 -i %03d.png -crf 0 -x264opts keyint=1:min-keyint=1 120.mp4
它应该是恒定的帧速率,所有的帧都是i帧。我预计框架6将在时间0.05秒( 0.05,0.0583333)出现,正如pts_time在ffmpeg和ff探头中显示的那样:
Parsed_showinfo_0 @ 0x7fba11404080 n: 6 pt: 768 pts_time:0.05 pos: 36021 fmt:yuv444p sar:0/1 s:1552x878 i:P iskey:1类型:i校验和:2 CDED07A plane_checksum:A86DBAAD C4CB8EF2 DDC586CC平均值:163 133 121 stdev:9.0 media_type=video stream_index=0 key_frame=1 pkt_pts=768 pkt_pts_time=0.050000 pkt_dts=768 best_effort_timestamp=768 best_effort_timestamp_time=0.050000 pkt_duration=128 pkt_duration=128pkt_duration_time=0.008333 pkt_pos=36021 pkt_size=2531 width=1552 height=878 pix_fmt=yuv444p样品纵横比=N/A pict_type=I coded_picture_number=6 display_picture_number=0 interlaced_frame=0 top_field_first=0 repeat_pict=0 color_range=unknown color_space=unknown color_primaries=unknown color_transfer=unknown chroma_location=left /FRAME
但在现实中,它从0.049943秒就出现了。我使用ffmpeg提取0.0001秒的时间。
ffmpeg -ss 00:00:00.049943 -i 120_keyint_1.mp4 -t 00:00:00.0001 out.mp4
然后得到这段视频,它显示了框架6。
我还试着用chrome播放这个视频,并设置了currentTime of videoNode。它显示帧5在0.049943,但显示帧6自0.049968 (之前!)
但是,我尝试了另一种编码方法,并获得了另一个定帧率视频。
ffmpeg -framerate 120 -i %03d.png -vcodec libx264 -f mp4 -movflags faststart 120.mp4
从理论上讲,框架6也应该出现在时间范围内[0.0583333,0.0583333],但在Chrome中,框架6要到currentTime >= 0.051秒才会出现。更有趣的是,我在0.049943秒时使用ffmpeg获得了第6帧,上面的提取命令是相同的。
这是否意味着在MPEG4 h.264视频中,我们不能依靠来自ffmpeg的pts_time来确定特定帧和特定视频播放器的确切显示时间?
发布于 2020-09-17 15:27:39
我认为问题是在您的文件中电影标题1000的比例,这是硬连线默认的ffmpeg。(libavformat\movenc.h行32:#define MOV_TIMESCALE 1000
)
您的120 fps的帧速率不能在1/1000 s内表示,因此ffmpeg会产生舍入错误。
1000作为默认的时间尺度是一个糟糕的选择,如果不修改ffmpeg的源代码,就不能改变它。
我会将#define MOV_TIMESCALE 1000
更改为#define MOV_TIMESCALE 600
或其他可被120除的值,然后重新编译ffmpeg。
https://stackoverflow.com/questions/63940003
复制相似问题