2017-02-22 88 views
0

我在av_interleaved_write_frame处理视频和音频数据包的方式中找不到任何信息。使用FFmpeg编写多线程视频和音频数据包

我有来自2个线程的多个音频和视频数据包。每个线程调用write_video_framewrite_audio_frame,锁定互斥锁,初始化AVPacket并将数据写入.avi文件。

AVCodecContext和AVFOrmatContext的初始化是可以的。

- 编辑1 -

音频和视频是从外部源(麦克风和摄像机)来,没有任何压缩被捕获作为原始数据(即使对于视频)。 我使用h264来编码视频和音频(PCM)没有压缩。

音频捕获的是:16位,44100khz,立体声

视频拍摄的是25FPS

问:

1)是不是,如果我在一次写入多个视频数据包的问题(假设25包/秒)和一个音频包/秒。

答:显然不是,功能av_interleaved_write_frame应该能够尽快PTS和DTS有良好的管理

这意味着我打电话av_interleaved_write_frame 25倍的视频写入,只是管理的那种数据1用于每秒写入音频。这可能是一个问题吗?如果这是我该如何处理这种情况?

2)在这种情况下,我如何管理pts和dts?这似乎是我的应用程序中的问题,因为我无法正确呈现.avi文件。我可以为视频和音频使用实时邮票吗?

答:在这里做的最好的事情就是用捕获音频/视频作为PTS和DTS这种应用的时候给出的时间戳。所以这些并不是真正的时间戳(来自挂钟),而是媒体捕获时间戳。

谢谢你的宝贵意见。

回答

1

av_interleaved_write_frame以这种方式写入输出数据包,以便它们正确交织(可能在内部排队)。 “正确交错”取决于容器格式,但通常意味着输出文件中数据包的DTS标记单调递增。

av_interleaved_write_frame与大多数FFmpeg API一样,不应该由具有相同AVFormatContext的两个线程同时调用。我假设你用一个互斥体确保这一点。如果你这样做,无论它是多线程应用还是现在都无关紧要。

是,如果我在一次写入多个视频数据包的问题(比如说25包/秒),只是一个音频数据包/秒

这不是一般的问题,但大多数的音频编解码器不能输出1秒长的音频数据包。你使用哪种编解码器?

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

与在单线程应用程序中使用的方式相同。 Dts通常由来自pts的编解码器生成。 Pts通常来自捕获设备/解码器以及相应的音频/视频数据。

实时邮票可能可以使用,但它确实取决于您如何以及何时获得它们。请详细说明你正在尝试做什么。音频/视频数据来自哪里?

+0

我添加了一些关于视频和音频源的信息。我确实使用互斥体来保证线程安全,并且这项工作很好。正如我所提到的,我没有对音频使用任何压缩,并且我捕获了1秒的数据包,这意味着每秒钟有176400字节的数据。这是太多的数据用于'av_interleaved_write_frame'吗?如果是这样,我该如何处理这种情况? –

+1

我明白了。通常'av_interleaved_write_frame'可以处理这种类型的数据包;也许AVI格式/复用器在这方面有一些限制?可能不会。关于时间戳 - 如果您使用例如捕获A/V DirectShow然后它为您提供时间戳,你应该使用它们作为pts源代码;只要确保它们具有相同的参考时间(即在同一时刻捕获的样本将具有相同的时间戳)。使用挂钟时间可能会成为一个问题,因为除非得到补偿,否则它会在时间戳中引起大量抖动。 –

+0

谢谢你的回答,这给了我一些想法,因为我有时间戳捕获哪些可以用于pts/dts。另一个问题是,当我将音频捕获为原始数据时,我可以直接使用'av_interleaved_write_frame'还是必须使用PCM_S16LE对数据进行编码,然后写入数据? –