gpt4 book ai didi

c - 我怎样才能用ffmpeg寻求框架X?

转载 作者:IT王子 更新时间:2023-10-29 00:19:52 24 4
gpt4 key购买 nike

我正在编写一个视频编辑器,我需要寻找精确的帧,知道帧数

stackoverflow 上的其他帖子告诉我,ffmpeg 可能会在搜索后给我一些破帧,这对播放来说不是问题,但对视频编辑来说是个大问题。

而且我需要按帧数查找,不是按时间查找,转换为帧数时会变得不准确。

我读过 dranger 的 tuts(现在已经过时了),结果是:

av_seek_frame(fmt_ctx, video_stream_id, frame, AVSEEK_FLAG_ANY);

它总是寻求框号。 0,并且始终返回 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);
}
}

EDIT2:原来有一个图书馆:FFMS2 .它是“一个基于 FFmpeg 的源库 […]

最佳答案

av_seek_frame 只会根据时间戳寻找关键帧。由于它寻找关键帧,因此您可能得不到想要的。因此,建议寻找最近的关键帧,然后逐帧读取直到到达所需帧。

但是,如果您要处理固定的 FPS 值,那么您可以轻松地将时间戳映射到帧索引。

如果您指定了流,则在搜索之前,您需要将时间转换为 AVStream.time_base 单位。阅读 avformat.hav_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 ")
}

关于c - 我怎样才能用ffmpeg寻求框架X?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17546073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com