2016-04-13 13 views
10

私はFFmpegでビデオを録画していますが、少なくとも右の野球場に書かれているフレームレートを希望します。今、私は自分の入力が持っていると主張しているフレームレートを取得し、それを使って出力ビデオストリームのフレームレート(time_base)を設定します。しかし、これは時々私が得ている実際のフレームレートとは大きく異なっています(私は50fpsを要求するストリームを見ていますが、9fpsでパブリッシュしています)。FFmpegでフレームレートが不明なビデオを録画する

私がやりたいことは、経過したタイマーを使用して、録画したフレームを数えて、録画が終了したときに録画した実際のフレームレートを計算することです。私はフレームレートが設定されているように見えますが、AVStreamはフレームを書き込む前にavcodec_open2で使用されています。後で設定した場合(フレームを書き出している間など)、再生することができます(時間の増分ビットは6ではないという不満を言います)。他のビデオプレーヤーではできません。のフレームを書き込んだ後、ファイル全体のフレームレートを設定する方法はありますか??そうでない場合は、有効な録画ファイルが記録されている間に、フレーム自体に何らかのタイムスタンプまたはフレームレートを伝える方法がありますか?

+0

こんにちは、私はもっと見ていきますが、avconvについて質問したかっただけです。それは、ファイルのフレームレートを変更することができるように見えます。おそらく、あなたは任意のフレームレートでファイルを書き込んでから、本当のレートを検出した後、書き込みを終えて、avconvを新しいレートで実行することができますか?ちょうど考え、本当の答えではない;)は見ている。お知らせ下さい。 – nephi12

+0

avconvはlibavプロジェクトのバイナリ名です。 (http://superuser.com/questions/507386/why-would-i-choose-libav-over-ffmpeg-or-is-there-even-a-difference)には、すべての名前のかなりまともな要約があります私はかなりの時間混乱しています。 avconvは、それが使用するライブラリで可能でなければなりません。 – Chris

答えて

0

トリックは、私よりも賢明な方法でAVCodecContext time_baseAVFrame ptsを使用するように思われます。固定フレームレートで録画する場合、time_baseは1 /フレームレートに設定され、ptsは記録されたフレームのちょうど増分された数になります。

代わりに私は録音を開始し、タイマーの粒度よりもtime_baseを1に設定しています(私の場合、ミリ秒の精度は1000です)。フレームptsをエンコードする前の経過時間に設定します。この組み合わせにより、正しく再生される可変フレームレートのビデオファイルが作成されます。

0

Chris。新しいビデオストリーム書き込みエンジンを開発する必要があります。 フレームレートを[N]に設定すると、書き込みエンジンはレートごとにフレームを書き込みます。

  • を書くときに、あなたが第二のためにN未満のフレームを持っている場合は、重複するフレームを作成する必要があり、各フレームのタイムスタンプを確認します。
  • 1秒間にNより多くのフレームがある場合、いくつかのフレームを削除する必要があります。

書き込む前に、正確なフレームレートを指定する必要があります。

あなたのビデオファイル書き込みエンジンは、指定されたフレームレートで動作する必要があります。

これはffmpegを使用して実装できます。

+0

これは可変フレームレートでできる最高のようですが、固定されていて不明な場合はどうなりますか?私がストリームに50fpsのクレームを提示した場合、実際には9であるので、あなたのアプローチがうまくいく間に、私は必要以上に5倍以上のフレームを録音します。基本的にはこれをうまく動作させるには、開始する前にフレームレートを知っている必要があります。 – Chris

関連する問題