9

ffmpegのwrite_frame関数に介入し、出力データを別々のファイルに書き込むセグメンターを作成しています。セグメント化された各ファイルには、約3秒のビデオのセグメントが含まれています。

コードは次のようになります。

1 - Get transcoded packet  
2 - Check if it contains key frame data, if yes goto 3. 
3 - Check the duration of current segment, if it exceed 3 seconds, goto 4 
4 - Close file, and create new segment, write packet to segment file, goto-1

一般的に、すべてのセグメントには少なくとも3秒のビデオデータが含まれ、キーフレームで始まります。

問題は、出力ビデオの長さが大きく異なり、3秒が含まれるものもあれば、5または6が含まれるものもあることです。

トランスコーディング中にffmpegがキーフレームを生成する方法に起因する問題が疑われます。2つの隣接するキーフレーム間の「距離」が6秒の場合、6秒のセグメントが得られます。

これが私の質問です:

  1. ffmpegが不規則な間隔でキーフレームを生成するというのは本当ですか(そして間隔時間は最大数秒(例:6)になる可能性があります)?

  2. ffmpegキーフレームの生成をどのように制御できますか?(これにはffmpegコマンドの引数があるはずです、-force_key_framesかもしれませんが、よくわかりません)

4

1 に答える 1

12
  1. ffmpegは、シーンの変化の検出に基づいて、不規則な間隔でキーフレームを生成することができます。

  2. キーフレーム間隔は、GOPサイズで制御できます。次のオプションを使用できます

-g(FFmpeg)キーフレーム間隔。GOP長とも呼ばれます。これにより、Iフレーム間の最大距離が決まります。GOPの長さが非常に長いと、圧縮が少し効率的になりますが、ビデオでの検索がやや難しくなります。

-keyint_min(FFmpeg)最小GOP長、Iフレーム間の最小距離。

于 2013-01-02T11:32:13.177 に答える