2010-06-13 59 views
12

我試圖讓av_seek_frame()函數轉到我指定的字節位置。我爲我的應用程序和我看到它的方式實現了幀精確搜索機制,我將掃描整個視頻文件,並將每個關鍵幀的字節位置存儲在結構中。我找到了當前字節位置的位置:AVPacket.pos。我現在測試這個位置av_seek_frame這樣的:問題:FFMPEG尋找av_seek_frame使用字節位置

av_seek_frame(pFormatCtx, videoStream, 110285594, AVSEEK_FLAG_BYTE); 

然而,這似乎並沒有做正確的事情,當我打電話av_read_frame,它只是與框架23開始。如果我不求,它開始於框架1.

+0

問題是因爲您試圖尋找一個不是關鍵幀的幀? – dmazzoni 2010-06-13 18:03:01

+0

嗨Dmazzoni,不,我確定這個位置是一個關鍵幀。我可以補充一下,它是一個h264視頻。 – 2010-06-13 22:17:35

回答

9

對於那些有興趣的人,我找到了解決方案。經過幾個小時的Google搜索和一些簡單的逆向工程,我發現如何獲取和設置打開視頻的字節位置。

要獲取文件位置: AVFormatContext.pb.pos

例如:

int64_t byteposition = pFormatCtx->pb->pos; 

設置文件位置: url_seek(AVFormatContext.pb,位置,SEEK_SET);

例如:

url_seek(pFormatCtx->pb, 27909056, SEEK_SET); 

不要忘記如果你改變了位置,而玩刷新緩衝區。如果在第一次執行av_read_frame之前執行此操作,則不需要刷新。

親切的問候, 尼克Verlinden

3

在最近版本libav的,url_seek已取得的內部函數。現在應該使用以下功能:

/** 
* fseek() equivalent for AVIOContext. 
* @return new position or AVERROR. 
*/ 
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence);