gpt4 book ai didi

mp4 - MFCreateFMPEG4MediaSink 不生成 MSE 兼容的 MP4

转载 作者:行者123 更新时间:2023-12-04 21:25:01 25 4
gpt4 key购买 nike

我正在尝试将 H.264 视频源流式传输到 Web 浏览器。 Media Foundation 用于编码分段的 MPEG4 流( MFCreateFMPEG4MediaSinkMFTranscodeContainerType_FMPEG4MF_LOW_LATENCYMF_READWRITE_ENABLE_HARDWARE_TRANSFORMS 启用)。然后该流通过 IMFByteStream 连接到 Web 服务器。 .
当 H.264 视频被 <video src=".."/> 使用时,它的流媒体工作正常标签。但是,由此产生的延迟约为 2 秒,这对于所讨论的应用程序来说太多了。我怀疑是客户端缓冲导致了大部分延迟。因此,我正在尝试使用媒体源扩展 (MSE) 来对浏览器内的流媒体进行编程控制。但是,当通过 MSE 使用相同的 MPEG4 流时,Chrome 确实会失败并显示以下错误:

Failure parsing MP4: TFHD base-data-offset not allowed by MSE. Seehttps://www.w3.org/TR/mse-byte-stream-format-isobmff/#movie-fragment-relative-addressing


MPEG4 流中 moof/mdat 片段的 mp4dump。这清楚地表明 TFHD 包含“非法” base data offset范围:
[moof] size=8+200
[mfhd] size=12+4
sequence number = 3
[traf] size=8+176
[tfhd] size=12+16, flags=1
track ID = 1
base data offset = 36690
[trun] size=12+136, version=1, flags=f01
sample count = 8
data offset = 0
[mdat] size=8+1624
我正在使用 Chrome 65.0.3325.181(官方版本)(32 位),在 Win10 版本 1709 (16299.309) 上运行。
有没有办法使用 Media Foundation 生成兼容 MSE 的 H.264/MPEG4 视频流?
状态更新:
基于 roman-r建议,我设法通过拦截生成的 MPEG4 流并执行以下修改来自己解决问题:
  • Modify Track Fragment Header Box (tfhd):
    • remove base_data_offset parameter (reduces stream size by 8bytes)
    • set default-base-is-moof flag
  • Add missing Track Fragment Decode Time (tfdt) (increases stream size by 20bytes)
    • set baseMediaDecodeTime parameter
  • Modify Track fragment Run box (trun):
    • adjust data_offset parameter

字段描述记录在 https://www.iso.org/standard/68960.html 中(免费下载)。
切换到基于 MSE 的视频流将延迟从约 2.0 秒减少到 0.7 秒。通过调用 IMFSinkWriter::NotifyEndOfSegment,延迟进一步减少到 0-1 帧。在每次 IMFSinkWriter::WriteSample 调用之后。
https://github.com/forderud/AppWebStream 上提供了一个示例实现

最佳答案

提到的 0.7 秒延迟(在您的 状态更新 中)是由媒体基金会的 MFTranscodeContainerType_FMPEG4 引起的在一个 MP4 中收集和输出大约每 1/3 秒(来自未知原因)帧的容器 moof/mdat盒对。这意味着您需要等待 19 帧才能从 MFTranscodeContainerType_FMPEG4 获得任何输出。 60 帧/秒。

输出单个 MP4 moof/mdat每帧,简单地撒谎 MF_MT_FRAME_RATE是 1 FPS(或任何高于 1/3 秒的速度)。要以正确的速度播放视频,请使用媒体源扩展的 <video>.playbackRate或者更确切地说是更新 timescale (即乘以真实 FPS)的 mvhdmdhd MP4 流拦截器中的框以获取正确计时的 MP4 流。

这样做,延迟可以压缩到 20 毫秒以下。当您在 localhost 上并排看到输出时,这几乎无法辨认。在诸如 Unity(研究)之类的链中 -> NvEnc -> MFTranscodeContainerType_FMPEG4 -> WebSocket -> Chrome 媒体源扩展显示。

请注意 MFTranscodeContainerType_FMPEG4仍然引入 1 帧延迟(第 1 帧输入,无输出,第 2 帧输入,第 1 帧输出,...),因此 60 FPS 的延迟为 20 毫秒。唯一的解决方案似乎是编写自己的 FMPEG4 容器化程序。但这比拦截 Media Foundation 的 MP4 流要复杂一个数量级。

关于mp4 - MFCreateFMPEG4MediaSink 不生成 MSE 兼容的 MP4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49429954/

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