2011-06-18 156 views
1

我正在嘗試使用ffmpeg庫查找視頻中給定的幀。我知道有av_seek_frame()函數,但推薦使用avformat_seek_file()來代替。類似的東西提到here。我知道avformat_seek_file()不能總是帶你到你想要的確切框架,但這對我來說確實很好。我只想跳到最近的關鍵幀。所以我打開視頻,找到videostream並像這樣調用它: avformat_seek_file(formatContext, streamId, 0, frameNumber, frameNumber, AVSEEK_FLAG_FRAME)。它總是返回0,所以我理解它是正確的完成。但是,它不適用。我在調用avformat_seek_file()之前和之後檢查字節位置,如here。實際上,它會改變,但只要我試圖放置不同的目標幀數,它總是以相同的方式改變!我的意思是,在這個調用之後的字節位置總是相同的,即使是不同的frameNumber值。顯然,我做錯了什麼,但我不知道究竟是什麼。我不知道它是否重要,但我使用.h264文件。我嘗試了不同的標誌,不同的文件,使用時間戳而不是幀,前後沖洗緩衝區等,但它對我無效。如果有人能告訴我它有什麼問題,我將非常感激。ffmpeg函數的問題avformat_seek_file()

回答

5

我有同樣的問題,看到代碼波紋管(我的作品):

... 
    checkPosition(input_files[file_index].ctx); 
    ... 

    void checkPosition(AVFormatContext *is) { 
     int stream_index = av_find_default_stream_index(is); 
     //Convert ts to frame 
     tm = av_rescale(tm, is->streams[stream_index]->time_base.den, is-    >streams[stream_index]->time_base.num); 
     tm /= 1000; 

     //SEEK 
     if (avformat_seek_file(is, stream_index, INT64_MIN, tm, INT64_MAX, 0) < 0) { 
      av_log(NULL, AV_LOG_ERROR, "ERROR av_seek_frame: %u\n", tm); 
     } else { 
      av_log(NULL, AV_LOG_ERROR, "SUCCEEDED av_seek_frame: %u newPos:%d\n", tm, is->pb->pos); 
      avcodec_flush_buffers(is->streams[stream_index]->codec); 
     } 
    } 
+0

嗨,這是工作ffmpeg 0.11.1及以下版本。但是,當我使用以上版本(ffmpeg 2.1及以上版本)時,我遇到問題意味着當我們應用seek時,一些mp3歌曲的播放時間也超過了。你會告訴任何解決方案嗎? – user543

0

你的問題可能涉及到的事實,你輸入的原始.h264。嘗試使用例如mp4box將其複製到一個.mp4文件中,然後用ffmpeg加載mp4文件並嘗試再次尋找關鍵幀。例如:

mp4box -new -add my_file.h264 my_file.mp4