4

我正在构建一个创建视频的应用程序。问题是,有时(嗯......大部分时间)帧获取过程不够快。

如果我迟到了,我目前正在做的是跳过当前帧采集,但是 FFMPEG/libavcodec 将我传递给它的每一帧都视为下一帧,所以如果我从 2 帧中删除 1 帧,则为 20 秒视频只会持续 10 个。一旦我添加声音,就会出现更多问题,因为声音处理速度更快......

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

我试图将帧堆叠在一个点上,但这最终会杀死我所有的内存(我还尝试在硬盘驱动器中“堆叠”我的帧,这很慢,正如我所料)

我想我将不得不手动使用 pts,但我所有的尝试都失败了,并且阅读其他一些使用 ffmpeg 的应用程序代码(例如 VLC)并没有太大帮助......所以任何建议都会很多赞赏!

提前非常感谢!

4

4 回答 4

1

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

有关如何执行此操作的示例(至少指定您自己的时间戳部分),请参阅 ffmpeg 发行版中的 doc/examples/muxing.c(我当前的 git pull 中的第 491 行):

frame->pts += av_rescale_q(1, video_st->codec->time_base, video_st->time_base);

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

AVRational my_timebase = {1, 1000};
frame->pts = av_rescale_q(250, my_timebase, avstream->time_base);

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

于 2013-03-07T05:21:05.807 回答
0

许多(大多数?)视频格式不允许遗漏帧。相反,当您无法及时获得新视频帧时,请尝试重用旧视频帧。

于 2011-07-05T21:32:24.587 回答
0

只是一个想法..当处理滞后时,您是否尝试再次将同一帧传递给它(并丢弃当前帧)?也许它可以快速处理重复的帧。

于 2011-07-05T21:32:42.940 回答
0

有这个用于多核处理的 ffmpeg 命令行开关-threads ...,所以你应该能够用 API 做类似的事情(虽然我不知道怎么做)。这可能会解决您的问题。

于 2011-07-05T22:35:21.320 回答