我正在寫一個視頻編輯器,我需要尋求確切的幀,知道幀號。我如何尋求用ffmpeg來編號X?
在stackoverflow上的其他帖子告訴我,ffmpeg可能會給我一些後,尋找破碎的幀,這不是一個播放問題,但對視頻編輯的一個大問題。
我需要通過幀數,不受時間,轉換爲幀數時將變得不準確尋求。
我讀過dranger的TUTS(現在已經過時),並結了:
av_seek_frame(fmt_ctx, video_stream_id, frame, AVSEEK_FLAG_ANY);
它總是設法框架No. 0
,始終return 0
,這意味着成功。 然後我嘗試閱讀Blender的源代碼,發現它非常複雜(也許我應該實現一個圖像緩衝區?)。
那麼,有沒有簡單的方法尋求一個簡單的電話,如seek(context, frame_number)
(同時得到一個完整的框架,而不是一個破碎的一個)?或者,有沒有簡化這個的輕量級庫?
編輯: 由於praks411,我找到了解決辦法:
void AV_seek(AV * av, size_t frame)
{
int frame_delta = frame - av->frame_id;
if (frame_delta < 0 || frame_delta > 5)
av_seek_frame(av->fmt_ctx, av->video_stream_id,
frame, AVSEEK_FLAG_BACKWARD);
while (av->frame_id != frame)
AV_read_frame(av);
}
void AV_read_frame(AV * av)
{
AVPacket packet;
int frame_done;
while (av_read_frame(av->fmt_ctx, &packet) >= 0) {
if (packet.stream_index == av->video_stream_id) {
avcodec_decode_video2(av->codec_ctx, av->frame, &frame_done, &packet);
if (frame_done) {
...
av->frame_id = packet.dts;
av_free_packet(&packet);
return;
}
}
av_free_packet(&packet);
}
}
你保證一個固定的穩定的FPS?然後你可以按時間尋找。另見僅用戶知道的關於「關鍵幀」 – rogerdpack
的討論。它可能是一個可變幀頻視頻。 – Giumo