我无法找到av_interleaved_write_frame
处理视频和音频数据包的方式的任何信息。
我有来自2个线程的多个音频和视频数据包。每个线程调用write_video_frame
或write_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。所以这些并不是真正的时间戳(来自挂钟),而是媒体捕获时间戳。
感谢您的宝贵意见。
答案 0 :(得分:2)
av_interleaved_write_frame
以这种方式写入输出数据包,以便它们正确交错(可能在内部排队)。 “正确交错”取决于容器格式,但通常意味着输出文件中数据包的DTS标记单调递增。
av_interleaved_write_frame
不应该被具有相同AVFormatContext的两个线程同时调用。我假设您使用互斥锁来确保这一点。如果你这样做,那么它是多线程应用程序还是现在无关紧要。
如果我一次写多个视频数据包(比方说25个数据包/秒)和一个音频数据包/秒
是一个问题吗
一般来说这不是问题,但大多数音频编解码器无法输出1秒长的音频数据包。您使用哪种编解码器?
在这种情况下,我如何管理pts和dts?我可以为视频和音频使用实时印章吗?
与单线程应用程序中的方式相同。 Dts通常由来自pts的编解码器生成。 Pts通常来自捕获设备/解码器以及相应的音频/视频数据。
实时标记可能可以使用,但这实际上取决于您获取它们的方式和时间。请详细说明你究竟想做什么。音频/视频数据来自哪里?