2010-06-13 12 views
12

Tôi đang cố gắng để có được hàm av_seek_frame() để đi đến một vị trí byte tôi chỉ định. Tôi đang thực hiện một cơ chế tìm kiếm khung chính xác cho ứng dụng của mình và cách tôi xem nó, tôi sẽ quét toàn bộ tệp video và lưu trữ các vị trí byte cho mỗi khung hình chính trong một cấu trúc. Tôi tìm ra nơi để có được vị trí byte hiện tại: AVPacket.pos. bây giờ tôi kiểm tra vị trí này với av_seek_frame như thế này:vấn đề: FFMPEG tìm kiếm với av_seek_frame sử dụng vị trí byte

av_seek_frame(pFormatCtx, videoStream, 110285594, AVSEEK_FLAG_BYTE); 

Tuy nhiên, điều này dường như không làm điều đúng, khi tôi gọi av_read_frame, nó chỉ bắt đầu với khung 23. Nếu tôi không tìm kiếm, nó bắt đầu lúc khung 1.

+0

Có phải vấn đề vì bạn đang cố gắng tìm một khung không phải là khung chính? – dmazzoni

+0

Xin chào Dmazzoni, tôi không đảm bảo vị trí là Khung hình chính. Tôi có thể thêm vào nó, rằng nó là một video h264. –

Trả lời

9

Đối với những người quan tâm, tôi đã tìm ra giải pháp. Sau nhiều giờ googling và một số hình thức đơn giản của kỹ thuật đảo ngược, tôi tìm thấy làm thế nào để có được và thiết lập vị trí byte của video mở.

Để có được vị trí file: AVFormatContext.pb.pos

ví dụ:

int64_t byteposition = pFormatCtx->pb->pos; 

Để thiết lập vị trí file: url_seek (AVFormatContext.pb, Chức vụ, SEEK_SET);

ví dụ:

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

Đừng quên để tuôn ra bộ đệm nếu bạn thay đổi vị trí trong khi chơi. Nếu bạn làm điều này trước khi bạn làm av_read_frame lần đầu tiên, xả nước là không cần thiết.

Kind Regards, Nick Verlinden

3

Trong các phiên bản gần đây của libav, url_seek đã được thực hiện một chức năng nội bộ. Giờ đây, bạn nên sử dụng chức năng sau:

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