我正在写一个视频编辑器,我需要寻找精确的帧,知道帧号.
stackoverflow上的其他帖子告诉我,ffmpeg可能会在搜索后给我一些破帧,这对于播放来说不是问题,但对于视频编辑来说是个大问题.
我需要通过帧号来寻找,而不是按时间来寻找,这在转换为帧号时会变得不准确.
我读过dranger的tuts(现在已经过时了),最后得到:
av_seek_frame(fmt_ctx, video_stream_id, frame, AVSEEK_FLAG_ANY);
Run Code Online (Sandbox Code Playgroud)
它总是寻求框架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 …Run Code Online (Sandbox Code Playgroud)