我如何用ffmpeg来寻找X号框架?
发布时间:2020-12-16 05:39:14 所属栏目:百科 来源:网络整理
导读:我正在写一个视频编辑器,我需要寻找准确的帧,知道帧数. stackoverflow上的其他帖子告诉我,ffmpeg可能会在寻求后给我一些破碎的帧,这不是播放问题,而是视频编辑器的一个大问题. 而我需要通过帧号查找,而不是时间,当转换为帧号时,它将变得不准确. 我已经阅读了
我正在写一个视频编辑器,我需要寻找准确的帧,知道帧数.
stackoverflow上的其他帖子告诉我,ffmpeg可能会在寻求后给我一些破碎的帧,这不是播放问题,而是视频编辑器的一个大问题. 而我需要通过帧号查找,而不是时间,当转换为帧号时,它将变得不准确. 我已经阅读了dranger的提示(现在已经过时了),最终得到: av_seek_frame(fmt_ctx,video_stream_id,frame,AVSEEK_FLAG_ANY); 它始终追求0号,并始终返回0,这意味着成功. 那么,有没有什么简单的方法来寻找一个简单的调用,如seek(上下文,frame_number)(同时得到一个完整的框架,而不是一个破碎的)框架?或者,有没有简化这个的轻量级库? 编辑: 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,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); } } 解决方法
av_seek_frame将仅基于时间戳寻找关键帧.因为它寻求关键帧,你可能不会得到你想要的.因此,建议寻求最近的关键帧,然后逐帧读取您到达所需的帧.
但是,如果您正在处理固定的FPS值,则可以轻松将时间戳映射到帧索引. 在寻求之前,如果您指定了流,则需要将您的时间转换为AVStream.time_base单位.在avformat.h中阅读av_seek_frame的ffmpeg文档. 例如,如果你想寻求1.23秒的剪辑: double m_out_start_time = 1.23; int flgs = AVSEEK_FLAG_ANY; int seek_ts = (m_out_start_time*(m_in_vid_strm->time_base.den))/(m_in_vid_strm->time_base.num); if(av_seek_frame(m_informat,m_in_vid_strm_idx,seek_ts,flgs) < 0) { PRINT_MSG("Failed to seek Video ") } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |