web-dev-qa-db-ja.com

ffmpegエンコードタイムスタンプフレームレートはフレームをスキップするようです

フレームにタイムスタンプ(映画の開始から)が表示されているビデオを作成しようとしています。私はこれを次のように行っています:

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に変わる1分のマークに到達するまで続きます。どうやら2フレームスキップしているようです。入力フレームレートと出力フレームレートの両方をいくらいじっても、同じ結果が得られます。私は両方の場所で-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
Doug J

これは古い質問だと思いますが、他の誰か(私のような)がそれに遭遇した場合、答えは、表示されるタイムコードのスキップはエラーではなく、意図したとおりに機能するということです。

29.97 fpsのドロップフレームを(タイムコードにセミコロンを使用して)指定したので、2フレームのスキップは仕様に従っています(詳細はこちら: https://en.wikipedia.org/wiki/SMPTE_timecode# Drop_frame_timecode )。

つまり、29.97は小数の速度であり、ビデオファイルに小数のフレームを含めることはできないため、タイムコードと実時間の相関関係を維持するには、フレームを削除する必要があります。実際のビデオフレームはドロップされず、タイムコードのみがスキップされることに注意してください。仕様では、分値が10で割り切れる場合を除いて、毎分の最初の1秒で、最初の2つのフレーム(0と1)がスキップされると規定されています。

したがって、タイムコードが00:00:59:29から00:01:00:02に変わるのを見ると、予想される動作になります。これを取得しないようにするには、別のフレームレートに切り替えて、コロンのみを使用してタイムコードを記述する必要があります:00:00:00:00。

2
user934402

同じトピックに関するStackOverflowの投稿を見つけました。解決策はもう少しエレガントだと思うので これをチェックしてください

ビデオを調べるためにどのような方法を使用していますか?ビデオデコーダーがフレームをスキップするのではなく、ビデオ自体に問題があることをどういうわけか確認しましたか?

0
apraetor