使用FFmpeg

时间:2017-02-22 10:01:55

标签: c++ windows multithreading audio ffmpeg

我无法找到av_interleaved_write_frame处理视频和音频数据包的方式的任何信息。

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

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

- 编辑1 -

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

捕获的音频为:16bits,44100khz,立体声

拍摄的视频为25FPS

问题:

1)如果我一次写多个视频数据包(比如25个数据包/秒)和一个音频数据包/秒,这是一个问题。

答案:显然不是,只要pts和dts得到妥善管理,函数av_interleaved_write_frame就应该能够管理这类数据

这意味着我每次拨打av_interleaved_write_frame 25次进行视频写入,每次拨打1次进行音频写入。这可能是个问题吗?如果是这样我怎么处理这种情况?

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

答案:这里最好的办法是使用捕获音频/视频时给出的时间戳作为此类应用程序的pts和dts。所以这些并不是真正的时间戳(来自挂钟),而是媒体捕获时间戳。

感谢您的宝贵意见。

1 个答案:

答案 0 :(得分:2)

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

像大多数FFmpeg API一样,

av_interleaved_write_frame不应该被具有相同AVFormatContext的两个线程同时调用。我假设您使用互斥锁来确保这一点。如果你这样做,那么它是多线程应用程序还是现在无关紧要。

  

如果我一次写多个视频数据包(比方说25个数据包/秒)和一个音频数据包/秒

是一个问题吗

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

  

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

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

实时标记可能可以使用,但这实际上取决于您获取它们的方式和时间。请详细说明你究竟想做什么。音频/视频数据来自哪里?