4

照会されたときに次のフレームとプレゼンテーションのタイムスタンプを提供するメソッドを作成しようとしています。コードは現在、次のようになっています。

while( getNextFrame(image, pts) )
{
    // show current image
    drawImage(currentImage);
    sleep(pts);
    currentImage = image;
}

私はここまでドレンジャーのチュートリアルに従ってきましたが、フレームの PTS 値を確実に取得するのに行き詰まりました ( http://www.dranger.com/ffmpeg/tutorial05.html )。返される PTS 値は常に 0 です。

また、get_buffer()廃止されたため、get_buffer2()メソッドを使用してグローバルpts値を設定しています。ただし、このrelease_bufferメソッドも廃止されており、代替品が見つからないようです。これにより、チュートリアルで説明されている方法は、このタスクを達成するための最良の方法ではない可能性があると私は信じています.

要するに、最新の ffmpeg を使用して、フレームの pts 値を確実に取得する最良の方法は何ですか?

4

1 に答える 1

12

OK、あなたは多くの情報を提供していないので、あなたのコードについていくつかの仮定を立てます。

int err, got_frame;
AVFormatContext *avctx;
AVPacket avpkt;
AVFrame *frame;
// You open file, initialize structures here
// You read packet here using av_read_frame()
{
    AVStream *stream = avctx->streams[avpkt.stream_index];
    if ( 0 > ( err = avcodec_decode_video2 ( stream->codec, frame, &got_frame, &avpkt ) && got_frame ) )
    {
        int64_t pts = av_frame_get_best_effort_timestamp ( frame );
        // TODO test for AV_NOPTS_VALUE
        pts = av_rescale_q ( pts,  stream->time_base, AV_TIME_BASE_Q );
        // pts is now in microseconds.
    }
}
于 2013-11-20T22:55:51.153 に答える