我正在尝试制作一个在帧上显示时间戳(从电影开始)的视频。我使用以下方法进行操作:
ffmpeg -loop 1 -framerate 30 -t 3600 -i /path/to/my.png -s 1280x720 -vf drawtext="fontfile=/path/to/my.ttf:fontcolor=white: timecode='00\:00\:00;00': r='30000/1001': text='': fontsize=148: x=190: y=260:" -c:v libx264 -vb 1000k -pix_fmt yuv420p -preset fast -f mp4 -r 30 -y out.mp4
第一帧以时间戳开始00:00:00;00
,然后是下一帧,00:00:00;01
依此类推,直到我们到达一分钟标记,时间戳从00:00:59;29
到,这似乎跳过了两帧。无论我如何调整输入帧速率和输出帧速率,我都会得到相同的结果。我在两个地方00:01:00;02
都试过了。-r 29.97
编辑:完整输出 -
ffmpeg version 2.1.3 Copyright (c) 2000-2013 the FFmpeg developers
built on Feb 11 2014 20:59:04 with Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.1.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libvpx --enable-librtmp --enable-ffplay
libavutil 52. 48.101 / 52. 48.101
libavcodec 55. 39.101 / 55. 39.101
libavformat 55. 19.104 / 55. 19.104
libavdevice 55. 5.100 / 55. 5.100
libavfilter 3. 90.100 / 3. 90.100
libavresample 1. 1. 0 / 1. 1. 0
libswscale 2. 5.101 / 2. 5.101
libswresample 0. 17.104 / 0. 17.104
libpostproc 52. 3.100 / 52. 3.100
Input #0, image2, from 'a.png':
Duration: 00:00:00.03, start: 0.000000, bitrate: N/A
Stream #0:0: Video: png, pal8, 1904x1232, 30 fps, 30 tbr, 30 tbn, 30 tbc
[libx264 @ 0x7fe479800600] using cpu capabilities: MMX2 SSE2Fast SSSE3 FastShuffle SSE4.2 AVX
[libx264 @ 0x7fe479800600] profile High, level 3.1
[libx264 @ 0x7fe479800600] 264 - core 125 - H.264/MPEG-4 AVC codec - Copyleft 2003-2012 - http://www.videolan.org/x264.html - options: cabac=1 ref=2 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=6 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=30 rc=abr mbtree=1 bitrate=1000 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'out.mp4':
Metadata:
encoder : Lavf55.19.104
Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1280x720, q=-1--1, 1000 kb/s, 15360 tbn, 30 tbc
Stream mapping:
Stream #0:0 -> #0:0 (png -> libx264)
Press [q] to stop, [?] for help
frame=13780 fps= 35 q=-1.0 Lsize= 57239kB time=00:07:39.26 bitrate=1021.0kbits/s
video:57076kB audio:0kB subtitle:0 global headers:0kB muxing overhead 0.285284%
[libx264 @ 0x7fc50180a600] frame I:56 Avg QP: 2.82 size:706101
[libx264 @ 0x7fc50180a600] frame P:3473 Avg QP: 7.90 size: 2664
[libx264 @ 0x7fc50180a600] frame B:10251 Avg QP:14.77 size: 942
[libx264 @ 0x7fc50180a600] consecutive B-frames: 0.8% 0.0% 0.0% 99.2%
[libx264 @ 0x7fc50180a600] mb I I16..4: 15.2% 10.9% 73.9%
[libx264 @ 0x7fc50180a600] mb P I16..4: 0.0% 0.0% 0.2% P16..4: 0.8% 0.1% 0.4% 0.0% 0.0% skip:98.4%
[libx264 @ 0x7fc50180a600] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 0.2% 0.1% 0.3% direct: 0.1% skip:99.3% L0:49.2% L1:43.3% BI: 7.5%
[libx264 @ 0x7fc50180a600] final ratefactor: 5.65
[libx264 @ 0x7fc50180a600] 8x8 transform intra:9.1% inter:16.8%
[libx264 @ 0x7fc50180a600] coded y,uvDC,uvAC intra: 95.4% 97.6% 97.1% inter: 0.4% 0.5% 0.4%
[libx264 @ 0x7fc50180a600] i16 v,h,dc,p: 35% 16% 31% 19%
[libx264 @ 0x7fc50180a600] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 35% 14% 13% 4% 6% 9% 5% 8% 7%
[libx264 @ 0x7fc50180a600] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 30% 13% 11% 7% 7% 8% 7% 10% 7%
[libx264 @ 0x7fc50180a600] i8c dc,h,v,p: 38% 18% 34% 9%
[libx264 @ 0x7fc50180a600] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x7fc50180a600] ref P L0: 79.1% 20.9%
[libx264 @ 0x7fc50180a600] ref B L0: 78.4% 21.6%
[libx264 @ 0x7fc50180a600] ref B L1: 84.4% 15.6%
[libx264 @ 0x7fc50180a600] kb/s:1017.91
答案1
我意识到这是一个老问题,但万一其他人(像我一样)偶然发现它,答案是您看到的时间代码跳过不是一个错误,而是按预期工作。
由于您已指定 29.97 fps 丢帧(通过在时间码中使用分号),因此跳过两帧符合规范(在此处阅读更多信息:https://en.wikipedia.org/wiki/SMPTE_timecode#Drop_frame_timecode)。
简而言之:由于 29.97 是分数速度,而视频文件不能包含分数帧,因此必须丢弃帧以保持时间码和挂钟时间之间的相关性。请注意,不会丢弃任何实际视频帧,只会跳过时间码。规范规定,在每分钟的第一秒,会跳过前两帧(零帧和一帧),除非分钟值可以被十整除。
因此,看到时间码从 00:00:59:29 变为 00:01:00:02 是预期行为。为了避免出现这种情况,您必须切换到另一个帧速率,并且仅使用冒号编写时间码:00:00:00:00。
答案2
我在 StackOverflow 上找到了一篇关于同一主题的帖子;我认为这个解决方案更优雅一些,所以看一下这个。
您使用什么方法检查视频?您是否已确认是视频本身的问题,而不是视频解码器跳过了帧?