2009-02-02 10 views
15

Tôi đang cố gắng tìm kiếm một bộ phim bằng phương pháp av_seek_frame của ffmpeg tuy nhiên tôi đang gặp khó khăn nhất khi xác định cách tạo dấu thời gian để tìm kiếm. Giả sử tôi muốn tìm kiếm số lượng khung hình x về phía trước hoặc phía sau và tôi biết khung phim hiện đang hoạt động như thế nào, tôi sẽ làm thế nào?ffmpeg av_seek_frame

+0

Bạn không thể tính toán thời gian bù đắp bằng cách sử dụng tốc độ khung hình? –

+0

Từ những gì tôi hiểu, thời gian bù đắp cần phải được trong đơn vị time_base nhưng tôi không chắc chắn chính xác làm thế nào để chuyển đổi nó cho các đơn vị (hoặc thậm chí nếu đó là những gì tôi cần phải làm). Nếu đó là những gì tôi cần làm, tôi không chắc chắn những gì các đơn vị của time_base là trong (giây, khung hình, khung hình mỗi giây). –

Trả lời

8

Câu trả lời đơn giản: Bạn nên có đối tượng AVFormatContext nằm xung quanh. Thuộc tính duration của bạn cho bạn biết tệp của bạn có thời gian bao lâu bằng số nhân với 1000 có thể được sử dụng trong av_seek_frame, vì vậy hãy coi nó là 100%. Sau đó, bạn có thể tính toán khoảng cách của video mà bạn muốn tìm kiếm.

nếu bạn muốn chuyển tiếp một khung, chỉ cần gọi av_read_frame và avcodec_decode_video cho đến khi nó điền vào got_picture_ptr với giá trị khác 0. Trước khi gọi avcodec_decode_video, hãy đảm bảo gói từ av_read_frame là từ luồng video. avcodec_decode_video sau đó sẽ điền vào cấu trúc AVFrame mà bạn có thể sử dụng để làm bất cứ điều gì.

13

Sau đây là cách tôi đã làm nó:

// Duration of one frame in AV_TIME_BASE units 
int64_t timeBase; 

void open(const char* fpath){ 
    ... 
    timeBase = (int64_t(pCodecCtx->time_base.num) * AV_TIME_BASE)/int64_t(pCodecCtx->time_base.den); 
    ... 
} 

bool seek(int frameIndex){ 

    if(!pFormatCtx) 
     return false; 

    int64_t seekTarget = int64_t(frameIndex) * timeBase; 

    if(av_seek_frame(pFormatCtx, -1, seekTarget, AVSEEK_FLAG_ANY) < 0) 
     mexErrMsgTxt("av_seek_frame failed."); 

} 

Các AVSEEK_FLAG_ANY phép tìm cách mỗi khung và không chỉ các khung hình chính.

+0

+1 để chỉ ra những gì 'AVSEEK_FLAG_ANY' thực hiện – puk