首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Broadway.js解码原始h.264

用Broadway.js解码原始h.264
EN

Stack Overflow用户
提问于 2016-06-01 16:45:16
回答 1查看 8.4K关注 0票数 5

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

代码语言:javascript
运行
复制
avcodec_encode_video2(c, &packet, frame, &got_output)

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

现在,我的目标是发送每一个包,当我收到它,并显示它(实时流)在网页上。为此,我使用了Broadway.js

我可以确认我从应用程序发送的数据在浏览器中是正确的。但是,我无法在使用百老汇的webGL画布(Player.jsDecoder.jsYUVCanvas.js)上显示相同的内容:

代码语言:javascript
运行
复制
if (data != null) player.decode(new Uint8Array(data));

我得到的输出是一个空白的白色画布。data是一个ArrayBuffer,它包含从avcodec_encode_video2接收到的分组的h.264比特流。我做错了什么吗?数据应该是特定格式的吗?

旁注:

我的视频文件out.h264使用下面提供的示例正确播放:BroadwayStream

它似乎使用命令行ffmpeg接口并处理接收到的每个数据包。我的程序使用ffmpeg库来获取相同的数据包,这是我需要呈现的。有人能帮忙吗?

EN

回答 1

Stack Overflow用户

发布于 2018-07-20 13:08:49

请记住,百老汇只处理使用CAVLC (Huffman编码)编码的基线配置文件,而忽略了主配置文件或任何用CABAC (算术编码)编码的配置文件。换句话说,百老汇只接受最容易解码的H.264流类型.当你的视频被错误地编码时,它可能会令人沮丧,因为你会患上可怕的空白屏幕综合症。

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

然后浏览器端关闭整个数据流,并将其传递给百老汇的decode()方法。因此,decode()总是得到一个完整的NALU序列,在任何特定的方法调用中都没有传递任何部分NALU。

decode()不使用部分NALU。(BroadwayStream巧妙地避开了这个问题,给出了整个流程。)而且它不需要mp4或webm数据流,只需要被解封的H.264。如果你把部分NALU传递给它,它就不工作了--它只是忽略了你给它的数据。因此,在将流传递给decode()之前,接受数据存储的客户端js必须将流分离到NALU中。

如果您的js接受MIME类型video/webm; codecs="avc1.42E01E"的屏蔽文件,您可以查看https://github.com/themasch/node-ebml这个要旨的方式来对它们进行解压缩。每个data块包含一个或多个可以传递给decode()的整个NALU。

如果是video/mp4; codecs="avc1.42E01E"分段MP4,则可以将avcC框中的sps和pps项,然后是mdat框中的sps和pps项进行分解。每个项目都是一个或多个整体NALU。

如果从服务器获得原始H.264流,则必须将其解析为NALU。陈玉美写了一篇关于NALU的有用文章。请记住,有两种分离NALU的方法:数据包传输和字节流。decode()可以接受这两种方法,但是解析器也必须接受。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37574441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档