gpt4 book ai didi

javascript - 使用 Broadway.js 解码原始 h.264

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:13:55 24 4
gpt4 key购买 nike

我正在开发一个使用 ffmpeg 为我提供编码的 h.264 帧的应用程序:

avcodec_encode_video2(c, &packet, frame, &got_output)

如果我将所有 packet.data 保存到文件 out.h264,它会使用 ffplay 显示所需的输出。

现在,我的目标是发送收到的每个数据包并将其显示(直播)在网页上。为此,我使用了 Broadway.js

我可以确认浏览器正确接收了我从应用程序发送的数据。但是,我无法使用 Broadway(Player.jsDecoder.jsYUVCanvas.js)在 webGL Canvas 上显示相同内容:

if (data != null) player.decode(new Uint8Array(data));

我得到的输出是一张空白的白色 Canvas 。 data 是一个 ArrayBuffer,它包含来自 avcodec_encode_video2 的数据包中的 h.264 比特流。难道我做错了什么?数据是否应该采用特定格式?

边注:
我的视频文件 out.h264 使用此处提供的示例正常播放:BroadwayStream

它似乎使用命令行 ffmpeg 界面并按接收到的方式处理每个数据包。我的程序使用 ffmpeg 库来获取我需要渲染的相同数据包。有人可以帮忙吗?

最佳答案

请记住,Broadway 仅处理使用 CAVLC(霍夫曼编码)编码的基线配置文件,而忽略主要配置文件或使用 CABAC(算术编码)编码的任何内容。换句话说,百老汇只接受最容易解码的 H.264 流类型。如果您的视频编码不正确,这可能会令人沮丧,因为您会遇到可怕的黑屏综合症。

BroadwayStream 在服务器端使用 ffmpeg 对 mp4 文件进行拆箱,将它们转换为原始 H.264 数据流。也就是说,它会生成一系列 H.264 网络访问层单元 (NALU)。

然后浏览器端吞下整个数据流并将其传递给 Broadway 的 decode() 方法。因此,decode() 总是获得一系列完整的 NALU,在任何特定方法调用中都没有传递部分 NALU。

decode() 不采用部分 NALU。 (BroadwayStream 通过给它整个流巧妙地回避了这一点。)而且它不采用 mp4 或 webm 数据流,只采用拆箱的 H.264。如果您将部分 NALU 传递给它,它就不起作用——它只会忽略您提供的数据。因此,您接受数据流的客户端 js 必须以某种方式将流分成 NALU,然后再将它们传递给 decode()

如果你的 js 接受 MIME 类型的混合文件 video/webm; codecs="avc1.42E01E" 你可以看看https://github.com/themasch/node-ebmlthis gist了解对它们进行拆箱的方法。每个 data block 包含一个或多个完整的 NALU,您可以将其传递给 decode()

如果是video/mp4; codecs="avc1.42E01E" 分片的MP4,可以对avcC 框内的sps 和pps 项进行debox,然后对mdat 框进行debox。这些项目中的每一项都是一个或多个完整的 NALU。

如果您从服务器获取原始 H.264 流,则必须以某种方式自行将其解析为 NALU。 Yumi Chan wrote a helpful article about NALUs.请记住,有两种方法可以分离 NALU:数据包传输和字节流。 decode() 接受其中任何一个,但您的解析器也必须接受。

关于javascript - 使用 Broadway.js 解码原始 h.264,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37574441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com