使用FFMPEG编写多线程视频和音频数据包
Writing multithreaded video and audio packets with FFmpeg
我找不到有关av_interleaved_write_frame
处理视频和音频数据包的任何信息。
我有来自2个线程的多个音频和视频数据包。每个线程称为 write_video_frame
或 write_audio_frame
,锁定穆特克斯,初始化avpacket并将数据写入.avi文件。
avcodeccontext和avformatcontext的初始化是可以的。
- 编辑1 -
音频和视频来自外部源(麦克风和相机),并以原始数据捕获而无需任何压缩(即使是视频)。我使用H264编码视频,而没有音频(PCM)的压缩。
捕获的音频为:16 bit,44100kHz,立体声
捕获的视频是25fps
问题:
1)如果我一次编写多个视频数据包(假设25个数据包/秒)和一个音频数据包/秒
,这是一个问题。答案:显然不是,函数 这意味着我致电 2)在这种情况下,如何管理PT和DTS?由于我无法正确渲染.avi文件,因此这似乎是一个问题。我可以在视频和音频上使用实时邮票吗? 答案:在此处使用的时间戳是将音频/视频捕获为PTS和DTS时使用的时间戳。因此,这些不是完全实时邮票(来自壁钟),而是媒体捕获时间戳。 感谢您的宝贵建议。av_interleaved_write_frame
应该能够在PTS和DTS经过良好管理的情况下立即管理此类数据av_interleaved_write_frame
25次进行视频写作,而每秒只需1个音频写作。这可能是一个问题吗?如果是我该如何处理这种情况?
av_interleaved_write_frame
以这样的方式写入otput数据包,以使它们正确交织(也许在内部排队)。"正确交织"取决于容器格式,但通常意味着输出文件中数据包的DTS邮票在单调上增加。
av_interleaved_write_frame
与大多数FFMPEG API一样,与具有相同AvformatContext的两个线程同时调用。我认为您可以用静音来确保这一点。如果您这样做,那么无论是多线程应用程序还是现在。
如果我一次写多个视频数据包(假设25个数据包/秒),而只有一个音频数据包/sec
,这是一个问题
通常,这不是问题,但是大多数音频编解码器无法输出1秒长的音频数据包。您使用哪个编解码器?
在这种情况下,如何管理PT和DTS?我可以在视频和音频上使用实时邮票吗?
与单线程应用程序中的方式相同。DT通常是由PTS产生的。PT通常来自捕获设备/解码器以及相应的音频/视频数据。
实时邮票可以使用可以使用,但这实际上取决于您如何以及何时获取它们。请详细说明您要做什么。音频/视频数据来自哪里?
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- 为什么操作系统正在更改我的数据包的指定传出端口
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- recvfrom 只收到几个数据包,之后它进入等待状态
- 如何调试由 C++ 编写的 npm 数据包
- 使用FFMPEG编写多线程视频和音频数据包
- 数据包大小(每数据包 mBytes)或核心音频中 AAC 文件的比特率
- 如何获取 mp3 音频数据包以在 C/C++ 中流式传输