7

ffmpeg の例、decoding_encoding.c と filtering_video.c に従って、iPhone で撮影した 1 つのビデオ ファイルを処理します。ビデオ ファイル: .mov、ビデオ サイズ。480x272、ビデオ コーデック: H.264/AVC、毎秒 30 フレーム、ビットレート: 605 kbps。

まず、YUV である各フレームを抽出します。YUV を RGB24 に変換し、RGB24 を処理してから、RGB24 を .ppm ファイルに書き込みます。.ppm ファイルが正しいことを示しています。

次に、処理された RGB24 フレームをビデオ ファイルにエンコードする予定です。MPEG は RGB24 の画像フォーマットをサポートしていないため、AV_CODEC_ID_HUFFYUV を使用しました。ただし、出力ビデオ ファイル (18.5 MB を表示) は再生されません。Ubuntu の Movie Player はエラーを主張します: ストリームのタイプを特定できませんでした。VCLでも試してみました。エラー情報がなければ、単に機能しません。

2 番目の質問は次のとおりです。入力ビデオ ファイルから抽出された各フレームについて、filtering_video.c に従って次のようにそのポイントを取得します。

frame->pts = av_frame_get_best_effort_timestamp(frame);

各フレームのポイントを出力すると、以下のように 20 ずつ増加することがわかります。

pFrameRGB_count: 0,  frame->pts: 0
pFrameRGB_count: 1,  frame->pts: 20
pFrameRGB_count: 2,  frame->pts: 40
pFrameRGB_count: 3,  frame->pts: 60

ここで、frame は入力ビデオから抽出されたフレームであり、pFrameRGB_count は RGB24 形式で処理されたフレームのカウントです。

なぜ彼らは間違っているのですか?

4

3 に答える 3

7

H.264 ビデオは、90 kHz clockエンコードに を使用しますtimestamps。あなたのビデオは30 fpsであるため、連続する 2 つのフレーム間の PTS デルタは3000ではなく になり20ます。

値 20 は、次のいずれかまたは両方を示します。

  • 指定された 30 fps のフレーム レートに対して、エンコーディング クロック (つまり、サンプリング レート) が正しく構成されていません (600 Hz)。

  • 1 秒あたりのフレーム数が正しく構成されていません (4500 fps)。

PTS デルタを計算する一般式は次のとおりです。

PTS delta = (1/fps) * Encoder sampling rate
于 2013-03-17T08:27:34.763 に答える
0

入力ビデオファイルのコーデックコンテキストを取得するためにデバッグします。dec_ctx->time_base.den= 1200; 入力ビデオファイルを右クリックしてそのプロパティを確認することで、fps、30を知っています(Ubuntu 12.04)したがって、フレーム期間は1200/30=40基本単位である必要があるようです。ただし、frame-> pts = av_frame_get_best_effort_timestamp(frame);を使用すると20になります。

入力ビデオの読み取りパケットの継続時間は20です。

dec_ctx-> ticks_per_frame = 2でした。ticks_per_frameは40から20になると思います。おそらく、次のような内部式があります。基本単位のフレーム期間=フレーム期間x ticks_per_frame(ただし、ffmpegで述べられているものとは異なるようです) time_baseなどのドキュメントは1/フレームレートに等しい。)

于 2013-03-18T04:20:53.527 に答える
0

私は答えを見つけると思います。ffmpeg の詳細なドキュメントがないため、ユーザーは誤解を招く可能性があります。正しいポイントを取得するには、常に次を使用する必要があることがわかりました: video_st->time_base NOT video_st->codec->time_base

(a) フレームの絶対時間:

packet->dts * (1/video_st->time_base.den)

(b) フレームと次のフレームの間の絶対時間:

frame->repeat_pict * (1/video_st->time_base.den)

于 2013-03-19T19:30:21.890 に答える