gpt4 book ai didi

c - 告诉 libavcodec/ffmpeg 丢帧

转载 作者:太空狗 更新时间:2023-10-29 15:41:19 28 4
gpt4 key购买 nike

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

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

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

我试图将帧堆叠在一个点上,但这最终会耗尽我所有的内存(我还尝试将我的帧“堆叠”在硬盘驱动器中,正如我所料,这是一种减慢方式)

我想我必须手动处理 pts,但我的所有尝试都失败了,并且阅读其他一些使用 ffmpeg 的应用程序代码(例如 VLC)并没有多大帮助......所以任何建议将不胜感激!

提前致谢!

最佳答案

您的输出可能会被视为可变帧率 (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);

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

关于c - 告诉 libavcodec/ffmpeg 丢帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6589088/

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