You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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提供了简洁的实现方式。

核心步骤:

  1. 打开输入容器,筛选需要处理的流
  2. 打开输出容器,为每个输入流创建对应的输出流
  3. 遍历输入容器的数据包,将数据包关联到对应输出流后写入容器
  4. 关闭输入、输出容器

注意事项:

  • 确认输出格式支持输入流的编码格式
  • 跳过无DTS(解码时间戳)的数据包,避免写入无效数据
  • 必须正确关闭容器,保证文件结构完整

内容的提问来源于stack exchange,提问作者user5285766

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:52:45