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

如何将UDP Socket接收的H264字节流转为有效视频文件?

问题分析与解决办法

你的代码存在几个关键问题,导致生成的H.264文件无法正常播放:

核心错误点

  • 仅接收单个UDP数据包就终止:视频流是由连续的多个UDP分片组成的,当前代码只接收了一个包就关闭输出流,生成的文件只有一小段数据,完全不构成可播放的视频。
  • 文件写入模式错误:默认的FileOutputStream会覆盖已有文件内容,即使后续接收更多包,每次打开都会清空之前的内容,无法累积完整流数据。
  • 写入数据未截取有效长度:DatagramPacket.getData()返回的是整个缓冲区数组,其中只有前getLength()个字节是实际接收的有效数据,直接写入整个数组会混入大量无效空字节,破坏H.264文件结构。

修正后的代码示例

// 初始化UDP服务器Socket
DatagramSocket serverSocket = new DatagramSocket(你的端口号);
byte[] receiveBuffer = new byte[1024 * 10]; // 适配H.264 NAL单元的常见大小
DatagramPacket dpReceive = new DatagramPacket(receiveBuffer, receiveBuffer.length);

// 以追加模式打开文件输出流,持续写入直到停止接收
try (FileOutputStream outputStream = new FileOutputStream("output.h264", true)) {
    while (true) {
        serverSocket.receive(dpReceive);
        // 仅写入实际接收的有效数据
        outputStream.write(dpReceive.getData(), 0, dpReceive.getLength());
        outputStream.flush(); // 确保数据实时写入文件
        // 可在此添加停止条件,比如收到特定指令或超时
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (serverSocket != null && !serverSocket.isClosed()) {
        serverSocket.close();
    }
}

额外验证建议

  1. 检查H.264文件有效性:用ffmpeg工具验证生成的文件,执行命令:
    ffmpeg -i output.h264 -c copy output.mp4
    
    若命令能成功执行并生成可播放的MP4文件,说明数据接收和写入逻辑正确。
  2. 确认NAL单元结构:从你提供的字节数据来看,开头的00 00 00 01是H.264的NAL单元起始码,说明libstreaming发送的是标准NAL单元格式,只要持续接收并正确写入,就能形成合法的H.264文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:52:14