首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >告诉libavcodec/ffmpeg丢弃帧

告诉libavcodec/ffmpeg丢弃帧
EN

Stack Overflow用户
提问于 2011-07-06 05:27:52
回答 4查看 3.1K关注 0票数 4

我正在构建一个应用程序,在其中我创建了一个视频。问题是,有时候(嗯.大多数情况下)帧获取过程不够快。

我现在正在做的是如果我迟到了就跳过当前帧的获取,但是FFMPEG/libavcodec会将我传递给它的每一帧都视为下一帧,所以如果我丢弃了2帧中的1帧,20秒的视频只能持续10秒。我一添加声音就会出现更多的问题,因为声音处理要快得多……

我想要的是告诉FFMPEG:“最后一帧的持续时间应该是最初预期的两倍”,或者任何可以让我实时处理的东西。

我试图在一个点上堆叠帧,但这最终杀死了我所有的内存(我还试图在硬盘中‘堆叠’我的帧,这是一种很慢的方式,正如我所预期的那样)

我猜我将不得不手动处理‘t,但我所有的尝试都失败了,而且阅读其他一些使用ffmpeg的应用程序代码,如VLC,也没有太大的帮助……因此,任何建议都将不胜感激!

提前谢谢你!

EN

回答 4

Stack Overflow用户

发布于 2013-03-07 13:21:06

您的输出可能会被认为是可变帧率(vfr),但您可以简单地在帧到达时使用挂钟时间生成时间戳,并在编码之前将其应用于AVFrame。则该帧将在回放时在正确的时间显示。

有关如何做到这一点的示例(至少在指定自己的时间戳部分),请参阅ffmpeg发行版中的doc/examples/muxing.c (在我当前的git中是第491行):

代码语言:javascript
复制
frame->pts += av_rescale_q(1, video_st->codec->time_base, video_st->time_base);

在这里,作者将视频编解码器的时基中的帧时间戳递增1,重新调整为视频流的时基,但在您的示例中,您可以简单地重新调整从任意时基到输出视频流的时基捕获帧以来的秒数(如上面的示例所示)。例如,如果您的任意时基是1/1000,并且您在开始捕获后收到0.25秒的帧,则执行以下操作:

代码语言:javascript
复制
AVRational my_timebase = {1, 1000};
frame->pts = av_rescale_q(250, my_timebase, avstream->time_base);

然后像往常一样对帧进行编码。

票数 1
EN

Stack Overflow用户

发布于 2011-07-06 05:32:25

许多(大多数?)视频格式不允许省略帧。取而代之的是,当你不能及时获得新的视频帧时,尝试重用旧的视频帧。

票数 0
EN

Stack Overflow用户

发布于 2011-07-06 05:32:43

这只是个想法。当它在处理过程中滞后时,您是否尝试过再次传递相同的帧(并丢弃当前帧)?也许它可以快速处理复制的帧。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6589088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档