从 h264 视频数据的部分流创建有效的 h264 并包装为 Mp4

Create valid h264 from partial stream of h264 video data and wrap as Mp4

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

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

执行此操作的正确方法是什么?

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

//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)
    }
}

要处理数据流,您需要发出碎片化的 MP4。与所有 MP4 一样,fMP4 流以包含 ftyp、moov 和 styp 框的前导码开始。然后每一帧都用moof / mdat box pair编码。

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

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

我一直在研究 js code to extract H.264 from webm and put it into fmp4. It's not yet complete. It's backed up by another piece of code 来解码将其正确打包到 fMP4 中所需的 H264 流部分。

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