2013-11-20 10 views
4

나는 질의 될 때 다음 프레임과 프레젠테이션 타임 스탬프를 제공 할 메서드를 작성하려고 시도하고있다. 코드는 현재이 같은 같습니다안정적으로 ffmpeg에서 PTS 값을 얻으시겠습니까?

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

나는이 점에 Dranger 자습서를 다음 봤는데,하지만 확실하게 프레임의 PTS 값 (http://www.dranger.com/ffmpeg/tutorial05.html)를 얻기에 정체했다. 반환되는 PTS 값은 항상 0입니다.

또한 get_buffer()은 사용되지 않으므로 이제 get_buffer2() 메서드를 사용하여 전역 pts 값을 설정합니다. 그러나 release_buffer 메서드는 더 이상 사용되지 않으며 대체 메서드로 사용할 수 없습니다. 이것은 내가 튜토리얼에 제시된 방법이 더 이상이 작업을 수행하는 최선의 방법이 아닐 것이라고 믿게한다.

요약하면 최신 ffmpeg를 사용하면 프레임 pts 값을 안정적으로 얻는 가장 좋은 방법은 무엇입니까?

+1

[소스 코드가 업데이트 된 튜토리얼] (https://github.com/chelyaev/ffmpeg-tutorial)이 있습니다. – LordNeckbeard

답변

12

많은 정보를 제공하지 않으므로 코드에 대해 몇 가지 가정을합니다.

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. 
    } 
} 
+1

'av_frame_get_best_effort_timestamp' - 이것은 제가 찾고 있던 정확하게 것입니다. 감사! –