ffmpeg - 在流之间切换时调整 PTS

标签 ffmpeg video-streaming libavcodec libav

我的应用程序需要在输入的两个(或多个)流之间切换,而只有一个输出(您可以将其视为流多路复用器)。来自输入的帧被解码,然后由于覆盖的东西再次重新编码。

因此,为了安排 AVFrame PTS,我在编码帧之前计算了一个间隔。但问题是当我在 RTMP 流和 MP4 文件之间切换时,每次切换时视频都会延迟一点。因此,在第三次切换时,结果流不同步。

我不知道我是否遗漏了一些我必须在编码之前在框架上修改的东西。我也想为输出的帧创建一个独立的 PTS,但我不知道如何创建它。

输入流可能有不同的 FPS、时基或编解码器,应用程序必须能够处理所有这些。

最佳答案

我发现了根本原因。

问题是 MP4 文件。使用这种类型的文件(出于某种原因),视频和音频数据包以错误束的形式读取(即:20 个视频数据包,然后是 20 个音频数据包),而在 RTMP 流上更像是(2 个视频数据包,然后是 2 个音频数据包)。
所以问题是正在应用开关之前 读取所有数据包(即:20 个视频数据包和 10 个音频数据包),因此在此之后,无论您做什么,生成的流都不同步。

我实现的解决方案等到解码帧的类型与前一个不同。然后是我执行切换的时候。

关于ffmpeg - 在流之间切换时调整 PTS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46055623/

相关文章:

android - 均衡器、低音增强和混响效果不起作用(使用 FFmpegMediaPlayer)

python-3.x - discord.ext.commands.errors.CommandInvokeError : Command raised an exception: KeyError: 'url'

linux - 如何解决通过 gstreamer udpsink 流式传输 h.264 时的图像问题

ffmpeg - "copy"在 ffmpeg 命令行中做了什么?

ffmpeg - 使用ffmpeg libavcodec将视频流编码为H264,为什么持续时间为零

ffmpeg - 使用最新的 ffmpeg 版本将纵向视频更改为横向方面正在破坏

opencv - 静止图像捕获响应时间

ffmpeg - 检测为 UDP 的 RTP 数据包

c# - 在 Linux 上如何更好地将 ffmpeg 与 ASP.NET Core 一起使用?

html - 更新(可重现)- 使用 MediaRecorder API(音频/webm opus)录制时的差距