我正在开发一个应用程序,它为我提供了一个使用ffmpeg编码的h.264帧:
avcodec_encode_video2(c, &packet, frame, &got_output)
如果我将所有packet.data
保存到一个文件out.h264中,它将使用ffplay
显示所需的输出。
现在,我的目标是发送每一个包,当我收到它,并显示它(实时流)在网页上。为此,我使用了Broadway.js
我可以确认我从应用程序发送的数据在浏览器中是正确的。但是,我无法在使用百老汇的webGL画布(Player.js
、Decoder.js
、YUVCanvas.js
)上显示相同的内容:
if (data != null) player.decode(new Uint8Array(data));
我得到的输出是一个空白的白色画布。data
是一个ArrayBuffer
,它包含从avcodec_encode_video2
接收到的分组的h.264比特流。我做错了什么吗?数据应该是特定格式的吗?
旁注:
我的视频文件out.h264
使用下面提供的示例正确播放:BroadwayStream
它似乎使用命令行ffmpeg接口并处理接收到的每个数据包。我的程序使用ffmpeg库来获取相同的数据包,这是我需要呈现的。有人能帮忙吗?
发布于 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()
可以接受这两种方法,但是解析器也必须接受。
https://stackoverflow.com/questions/37574441
复制相似问题