使用FFMPEG编写多线程视频和音频数据包

Writing multithreaded video and audio packets with FFmpeg

本文关键字:音频 数据包 视频 多线程 FFMPEG 使用      更新时间:2023-10-16

我找不到有关av_interleaved_write_frame处理视频和音频数据包的任何信息。

我有来自2个线程的多个音频和视频数据包。每个线程称为 write_video_framewrite_audio_frame,锁定穆特克斯,初始化avpacket并将数据写入.avi文件。

avcodeccontext和avformatcontext的初始化是可以的。

- 编辑1 -

音频和视频来自外部源(麦克风和相机),并以原始数据捕获而无需任何压缩(即使是视频)。我使用H264编码视频,而没有音频(PCM)的压缩。

捕获的音频为:16 bit,44100kHz,立体声

捕获的视频是25fps

问题:

1)如果我一次编写多个视频数据包(假设25个数据包/秒)和一个音频数据包/秒

,这是一个问题。

答案:显然不是,函数av_interleaved_write_frame应该能够在PTS和DTS经过良好管理的情况下立即管理此类数据

这意味着我致电av_interleaved_write_frame 25次进行视频写作,而每秒只需1个音频写作。这可能是一个问题吗?如果是我该如何处理这种情况?

2)在这种情况下,如何管理PT和DTS?由于我无法正确渲染.avi文件,因此这似乎是一个问题。我可以在视频和音频上使用实时邮票吗?

答案:在此处使用的时间戳是将音频/视频捕获为PTS和DTS时使用的时间戳。因此,这些不是完全实时邮票(来自壁钟),而是媒体捕获时间戳。

感谢您的宝贵建议。

av_interleaved_write_frame以这样的方式写入otput数据包,以使它们正确交织(也许在内部排队)。"正确交织"取决于容器格式,但通常意味着输出文件中数据包的DTS邮票在单调上增加。

av_interleaved_write_frame与大多数FFMPEG API一样,与具有相同AvformatContext的两个线程同时调用。我认为您可以用静音来确保这一点。如果您这样做,那么无论是多线程应用程序还是现在。

如果我一次写多个视频数据包(假设25个数据包/秒),而只有一个音频数据包/sec

,这是一个问题

通常,这不是问题,但是大多数音频编解码器无法输出1秒长的音频数据包。您使用哪个编解码器?

在这种情况下,如何管理PT和DTS?我可以在视频和音频上使用实时邮票吗?

与单线程应用程序中的方式相同。DT通常是由PTS产生的。PT通常来自捕获设备/解码器以及相应的音频/视频数据。

实时邮票可以使用可以使用,但这实际上取决于您如何以及何时获取它们。请详细说明您要做什么。音频/视频数据来自哪里?