如何使用PyAv从UDP流同时录制音频和视频到文件?
解决PyAv同步录制UDP音视频流问题
修改后的代码
import av from av.container import InputContainer, OutputContainer # 打开UDP输入流 input_: InputContainer = av.open("udp://192.168.1.68:8083?pkt_size=1316&overrun_nonfatal=1&fifo_size=50000000") # 打开输出文件(若用mp4需确保格式兼容输入流编码) output: OutputContainer = av.open("recorded.mp4", "w") # 建立输入流到输出流的映射 stream_map = {} for in_stream in input_.streams: # 仅处理音频和视频流 if in_stream.type not in ("audio", "video"): continue # 基于输入流参数创建输出流 out_stream = output.add_stream(template=in_stream) stream_map[in_stream] = out_stream # 解复用所有目标流的数据包 for packet in input_.demux(stream_map.keys()): if packet.dts is None: continue # 将数据包关联到对应输出流 packet.stream = stream_map[packet.stream] # 写入输出容器 output.mux(packet) # 关闭容器保证文件完整性 input_.close() output.close()
代码说明
- 不再指定单个流,而是遍历输入中所有音频/视频流,为每个流创建对应输出流,通过
stream_map维护映射关系 - 使用
input_.demux(stream_map.keys())同时解复用所有音视频流的数据包 - 每个数据包根据所属输入流匹配到对应输出流后写入,确保音视频同步
PyAv官方文档基础章节翻译(重封装部分)
重封装(Remuxing)
重封装指将媒体流从一种容器格式复制到另一种容器格式,无需重新编码,是媒体处理的常见操作,PyAv提供了简洁的实现方式。
核心步骤:
- 打开输入容器,筛选需要处理的流
- 打开输出容器,为每个输入流创建对应的输出流
- 遍历输入容器的数据包,将数据包关联到对应输出流后写入容器
- 关闭输入、输出容器
注意事项:
- 确认输出格式支持输入流的编码格式
- 跳过无DTS(解码时间戳)的数据包,避免写入无效数据
- 必须正确关闭容器,保证文件结构完整
内容的提问来源于stack exchange,提问作者user5285766
相关产品推荐
相关产品推荐

