2013-05-29 43 views
3

我試圖用毫秒與ffmpeg尋求視頻。我一直在嘗試使用this question中的代碼,它使用avformat_seek_file(我將它與-1一起用於流號碼和AVSEEK_FLAG_ANY標誌)。如何用mfc尋找ffmpeg?

後調用,我試着讀下一幀,即:

if (av_read_frame(fmt_ctx, &pkt) >= 0) 
{ 
    int ret = 0; 

    if (pkt.stream_index == video_stream_idx) { 
     /* decode video frame */ 
     ret = avcodec_decode_video2(video_dec_ctx, frame, got_frame, &pkt); 
     if (ret < 0) { 
      fprintf(stderr, "Error decoding video frame\n"); 
      return ret; 
     } 
//do something with frame 
} 

然而,檢索到的幀的frame->pts始終保存着之前讀取最後幀後立刻幀的時間求。

編輯:儘管frame-> pts形成了不間斷的序列,但尋找確實發生。對於一些奇怪的原因,我讀的第一幀是第一幀。事實上,在我運行後:

int got_frame = 0; 
    do 
    if (av_read_frame(fmt_ctx, &pkt) >= 0) { 
     decode_packet_ro(&got_frame, 0); 
     av_free_packet(&pkt); 
    } 
    else 
    { 
     read_cache = true; 
     pkt.data = NULL; 
     pkt.size = 0; 
     break; 
    } 
    while(!got_frame || this->frame->pts*av_q2d(video_dec_ctx->time_base) * 1000 < tsms); 

我讀的下一幀總是第一個。

+0

你能解決這個問題嗎?我也遇到了同樣的問題,無論我在哪裏總是得到第一幀(關鍵幀?) – autonomy

+0

我是;我會嘗試找到最終的代碼並將其作爲答案發布 – Srv19

回答

0

最終,我能尋求與下面的代碼:

/*! 
* \brief ffmpeg_reader::seekMs seek to millisecond 
* \param tsms timestamp 
* \return success of seeking 
*/ 
bool ffmpeg_reader::seekFrame(int s_frame) 
{ 
    if (!isOk()) 
     return false; 

    printf("\t avformat_seek_file to %d\n",s_frame); 
    int flags = AVSEEK_FLAG_FRAME; 
    if (s_frame < this->frame->pkt_dts) 
    { 
     flags |= AVSEEK_FLAG_BACKWARD; 
    } 

    if(av_seek_frame(fmt_ctx,video_stream_idx,s_frame,flags)) 
    { 
     printf("\nFailed to seek for time %d",s_frame); 
     return false; 
    } 

    avcodec_flush_buffers(video_dec_ctx); 
    /*read frame without converting it*/ 
    int got_frame = 0; 
    do 
    if (av_read_frame(fmt_ctx, &pkt) == 0) { 
     decode_packet(&got_frame, 0, false); 
     av_free_packet(&pkt); 
    } 
    else 
    { 
     read_cache = true; 
     pkt.data = NULL; 
     pkt.size = 0; 
     break; 
    } 
    while(!(got_frame && this->frame->pkt_dts >= s_frame)); 
    return true; 
} 

我沒有用它想出了自己,但我(可惜)不記得在哪裏信貸到期。