首页 > 解决方案 > 从 h264 视频数据的部分流创建有效的 h264 并包装为 Mp4

问题描述

假设我正在从数据流中读取数据,并且该流正在发送 h264 视频源的内容。鉴于我从该流中读取,并且我有一些由不确定数量的帧(NAL?)组成的数据。鉴于我知道原始视频的帧速率和大小,我将如何将此片段转换为我可以查看的 mp4?视频不包含音频。

我想用nodejs来做这个吗?我这样做的尝试没有产生任何类似于有效的 h264 文件以转换为 mp4。到目前为止,我的想法是剥离数据中第一个找到的起始代码之前的任何数据,并将其输入文件并使用 ffmpeg(目前只是在命令行中测试)将文件转换为 mp4。

这样做的正确方法是什么?

IE。像这样的东西(它在打字稿中,但同样的东西)

//We assume here that when this while loop exist at least one full frame of data will have been read and written to disk
let stream: WriteStream = fs.createWriteStream("./test.h264")
while(someDataStream.available()) { //just an example not real code
    let data: Buffer = someDataStream.readSomeData() //just an example not a real method call
    let file = null;
    try {
        file = fs.statSync("./test.h264");
    } catch (error) {
        console.error(error)
    }

    if(!stream.writable) {
        console.error("stream not writable")
    } else if(file == null || file.size <= 0) {
      

        let index = data.indexOf(0x7C)
        console.log("index: " + index)
        if(index > 0) {
            console.log("index2: " + data.slice(index).indexOf(0x7c))
            stream.write(data.slice(index))
        }
    } else {
        stream.write(data)
    }
}

标签: node.jsvideo-streamingvideo-processingh.264

解决方案


要处理数据流,您需要发出分段的 MP4。与所有MP4一样,fMP4 流以包含 ftyp、moov 和 styp 框的前导码开始。然后用 moof / mdat 框对对每一帧进行编码。

为了从您的 H.264 比特流中生成有用的前导码,您需要在 H264 数据中找到一对 SPS / PPS NALU,以在 moov 框中设置 avc1 框。这两个 NALU 通常紧跟在一个 I 帧(关键帧)之后。流中的第一帧必须是 I 帧,后续帧可以是 P 帧或 B 帧。乙

这是一项相当复杂的任务,涉及大量的位碰撞和缓冲区洗牌(这些是技术术语;-)。

我一直在研究一段js 代码,从 webm 中提取 H.264 并将其放入 fmp4。它还没有完成。它由另一段代码支持,用于解码 H264 流的部分,将其正确打包到 fMP4 中所需的部分。

我希望我可以写,“这是您需要的十行代码”,但这些格式(fMP4 和 H264)还不够简单,无法实现。


推荐阅读