MFCreateFMPEG4MediaSink 不生成 MSE 兼容的 MP4

2024-02-15

我正在尝试将 H.264 视频源流式传输到网络浏览器。 Media Foundation 用于编码分段的 MPEG4 流(MFCreateFMPEG4MediaSink with MFTranscodeContainerType_FMPEG4, MF_LOW_LATENCY and MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS已启用)。然后,该流通过以下方式连接到 Web 服务器:IMFByteStream.

当 H.264 视频被用户使用时,它的流式传输工作正常。<video src=".."/>标签。然而,产生的延迟约为 2 秒,这对于相关应用程序来说太大了。我怀疑客户端缓冲导致了大部分延迟。因此,我正在尝试使用媒体源扩展 (MSE) 对浏览器内流进行编程控制。但是,当通过 MSE 使用相同的 MPEG4 流时,Chrome 会失败并出现以下错误:

解析 MP4 失败:MSE 不允许 TFHD 基本数据偏移。看https://www.w3.org/TR/mse-byte-stream-format-isobmff/#movie-fragment-relative-addressing https://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 https://stackoverflow.com/users/868014/roman-r建议,我设法通过拦截生成的 MPEG4 流并执行以下修改来自行解决问题:

  • Modify Track Fragment Header Box (tfhd):
    • remove base_data_offset参数(将流大小减少 8 个字节)
    • set default-base-is-moof flag
  • Add missing Track Fragment Decode Time (tfdt) (increases stream size by 20bytes)
    • set baseMediaDecodeTime范围
  • Modify Track fragment Run box (trun):
    • adjust data_offset范围

字段描述记录在https://www.iso.org/standard/68960.html https://www.iso.org/standard/68960.html(免费下载)。

切换到基于 MSE 的视频流将延迟从约 2.0 秒减少到 0.7 秒。通过调用,延迟进一步减少到 0-1 帧IMFSinkWriter::NotifyEndOfSegment每次 IMFSinkWriter::WriteSample 调用之后。

有一个示例实现可用https://github.com/forderud/AppWebStream https://github.com/forderud/AppWebStream


当尝试通过 MSE 播放 fmp4 时,我遇到了相同的错误(失败解析 MP4:MSE 不允许 TFHD 基本数据偏移)。 fmp4 是使用以下 ffmpeg 命令从 mp4 创建的:

ffmpeg -i myvideo.mp4 -g 52 -vcodec copy -f mp4 -movflags frag_keyframe+empty_moov myfmp4video.mp4

基于这个问题,我发现要让 fmp4 在 Chrome 中工作,我必须添加“默认_base_moof" 标志。因此,使用以下命令创建 fmp4 后:

ffmpeg -i myvideo.mp4 -g 52 -vcodec copy -f mp4 -movflags frag_keyframe+empty_moov+default_base_moof myfmp4video.mp4

我能够使用媒体源扩展成功播放视频。

这篇 Mozilla 文章帮助找到了那个缺失的标志:https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API/Transcoding_assets_for_MSE https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API/Transcoding_assets_for_MSE

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFCreateFMPEG4MediaSink 不生成 MSE 兼容的 MP4 的相关文章

  • VLC 流至 MP4 WEBM 和 Flash

    我正在尝试将视频从 IP 摄像机流式传输到我的 WordPress 网站 我希望我的流可以通过常见设备 Windows Mac Android 和 IOS 访问 目前我正在使用 VLC 进行流式传输 但我只能使用 flash 流 但我想做
  • 将 AVAssetWriter 与原始 NAL 单元结合使用

    我在 iOS 文档中注意到AVAssetWriterInput你可以通过nil为了outputSettings字典来指定输入数据不应重新编码 用于对附加到输出的媒体进行编码的设置 传递 nil 来指定不应重新编码附加的样本 我想利用此功能来
  • Safari 不会通过 HTTPS 播放 mp4

    我有一个文件sample html 其中仅包含以下代码
  • 如何获取系统上可用的所有 Microsoft Media Foundation Transforms (MFT) 的列表

    我是 Windows 上本机开发的新手 但我的任务是创建一个小应用程序 该应用程序将列出各种视频 音频编解码器的所有转换器 查看 MSDN 文档 似乎没有太多关于执行此操作的直接文档 我发现的文档表明此信息存储在注册表中 不确定在哪里 因此
  • 使用 Android MediaCodec 从摄像头编码 H.264

    我正在尝试让它在 Android 4 1 上运行 使用升级的 Asus Transformer 平板电脑 谢谢亚历克斯对我之前问题的回答 https stackoverflow com a 13420558 726156 我已经能够将一些原
  • 如何计算 RandomForestRegression 中的 MSE 标准?

    我现在使用 sklearn ensemble 中的 RandomForestRegressor 来分析数据集 并选择 mse 作为衡量分割质量的函数 但我不太清楚mse是如何计算的 有人可以在这里向我解释一下 用方程更好 或者为我提供一些参
  • 以上全高清分辨率出现帧丢失。MediaFoundation 中是否提供 AVI Decompressor 转换过滤器?

    我正在使用 SourceReader MediaFoundation 技术开发一个桌面多媒体流应用程序 我正在使用 USB 摄像头设备来显示流媒体 该相机支持 2 种视频格式 YUY2 和 MJPG 对于 1980x1080p YUY2 视
  • FFMPEG 在视频末尾添加图像

    我需要使用 FFMPEG 在 mp4 视频文件末尾添加一秒钟的图像 我的视频尺寸是 WxH 图像尺寸是 MxM 因此视频和图像尺寸不同 我尝试了不同的选项 以便在视频末尾添加图像 ffmpeg i concat videoIn mp4 im
  • 使用 libavformat API 读取 H264 SPS 和 PPS NAL 字节

    如何使用 libavformat API 读取 H264 SPS 和 PPS NAL 字节 我尝试使用 av read frame input avFormatContext avPkt API 从 mp4 视频 编解码器为 h264 文件
  • 非 IDR 图片 NAL 单元 - 0x21 和 0x61 含义

    有谁知道是什么0x21 and 0x61是指在 h 264 编码的视频流中吗 我知道0x01意味着它是一个b frame and 0x41意味着它是一个p frame 我的编码视频给了我两个0x21帧后跟一帧b frame I 21 21
  • FFmpeg - H264 编码器找不到有效设备并且无法配置编码器

    我尝试使用 H264 编码器进行编码 但是当我这样做时 出现以下错误 h264 v4l2m2m 0x55682d2416c0 Could not find a valid device h264 v4l2m2m 0x55682d2416c0
  • 如何减少 MediaCodec H264 编码器延迟

    我正在尝试使用 Android6 0 的 MediaCodec 将 h264 实时低延迟编码为流 编码器大约有 6 帧延迟 我想知道如何减少 代码来自屏幕记录 cpp https android googlesource com platf
  • 使用 Windows Media Foundation 枚举时如何获取硬件 ID

    我在用MFEnumDeviceSources 枚举连接的设备 我正在寻找一个已连接两个的特定网络摄像头 枚举工作正常 我可以打印友好名称这是FLIR Video对于我的两台相机 我正在努力弄清楚如何从 Media Foundation 设备
  • 无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

    我目前正在进行一个涉及读取 mp4 视频文件的项目 我遇到的问题是它在Windows 7机器上使用Python 2 7 32位 OpenCV 2 4 3 cv2 pyd 代码片段如下 try video cv2 VideoCapture v
  • MP4 到 DASH(bash 脚本)

    我有一个网站 用户可以在其中上传视频文件 我想使用 DASH 流式传输所有内容以获得自适应比特率流式传输 因此 我编写了一个 bash 脚本 由 cron 运行 将所有 mp4 文件转换为 DASH 但它无法正常工作 出了什么问题 例如 使
  • 来自相机的 MediaCodec 视频流方向和颜色错误

    我正在尝试流式传输视频捕获直接从相机适用于 Android 设备 到目前为止 我已经能够从 Android 相机捕获每一帧预览帧 byte data Camera camera 函数 对数据进行编码 然后成功解码数据并显示到表面 我用的是安
  • Chromium 中的 MP4 编解码器支持

    我们已将 Chromium 嵌入式框架集成到我们的 Windows 游戏中 以允许我们从应用程序内渲染网页 并且一切正常 除了 MP4 视频 据我所知 由于许可问题 Chromium 不包含此编解码器 但任何人都可以提供有关我们如何添加支持
  • 从 SinkWriter 或 ICodecAPI 或 IMFTransform 获取编码器名称

    我使用 SinkWriter 来使用媒体基础对视频进行编码 初始化 SinkWriter 后 我想获取它使用的底层编码器 并打印出它的名称 这样我就可以看到它使用的编码器 就我而言 编码器很可能是H 264 视频编码器 http msdn
  • ffmpeg 配置复杂过滤器时出错

    ffmpeg 命令存在一些问题 也许有人可以指出我正确的方向 我使用此链接来构建我的命令 那么问题 https stackoverflow com questions 7333232 how to concatenate two mp4 f
  • 在python中将mp4声音转换为文本

    我想将 Facebook Messenger 中的录音转换为文本 以下是使用 Facebook 的 API 发送 mp4 文件的示例 所以这个文件只包含音频 不包含视频 我想将其转换为文本 此外 我希望尽可能快地完成此操作 因为我将在几乎实

随机推荐