【问题标题】:Create valid h264 from partial stream of h264 video data and wrap as Mp4从 h264 视频数据的部分流创建有效的 h264 并包装为 Mp4
【发布时间】:2021-09-13 21:20:22
【问题描述】:

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

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

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

即。像这样的东西(它在 Typescript 但同样的东西)

//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.js video-streaming video-processing h.264


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 你认为如果源文件被预先包装为 MP4 会更容易吗?
  • 如果您已经有了 fMP4 流的开头,则可以省略帧序列,只要您保留的第一个帧序列以 I 帧(关键帧)开头。但是,如果您没有 fMP4 前导码(ftyp、moov、styp),则必须重新构建它们。这就是编码变得棘手的地方。
  • 可能有点令人畏缩,但我最终从不同的文件中剥离了 H264 数据中的 SPS / PPS NALU 对(使用完全相同的硬件/软件制作,因此无论如何它们应该是相同的)并将它们添加到我可以在流中找到的第一个有效 NALU 上,然后将其转换为 mp4
猜你喜欢
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 2013-10-18
  • 2021-08-24
  • 2012-05-09
  • 2015-01-23
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多