问题标签 [fmp4]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
146 浏览

ffmpeg - 使用 avformat 的分段 mp4 广播

我想用avformat函数播放一个直播流(h264 -> 分段 mp4)。

现在基本上我有一个这个伪的工作示例:

我有这个作为输出标志:movflags +frag_keyframe+empty_moov+default_base_moof

我将输出发送到播放良好流畅的 html5 视频。但是我想广播它,所以每当有新玩家出现时,我都想将相同的数据流式传输给它:

然而,第一个客户端可以播放流,但其他客户端不能。

这是因为 fmp4 的结构:第一个客户端接收正确的ftypmoov原子,而其余客户端则没有。

现在我可以破解我的代码以向后来的客户提供早期的 ftype 和 moov 原子,但我认为这不明智 - 如果我错了,请纠正我。

我的问题:

  1. 如何在流期间询问 avformat 以(计算)并包含 ftyp 和 moov 原子?
  2. 在流中包含 ftyp 和 moov 会破坏第一个客户端吗?(在 fmp4 中 ftype 和 moov 在​​开始时不是一次有效吗?)

谢谢

0 投票
2 回答
632 浏览

ffmpeg - FMP4 moof box序列号排序

我想用 avformat 库和 HTML5 视频和 MSE做一个基本的分段 mp4广播程序。

这是一个直播流,我使用 avformat 将 h264 数据复制到 mp4 片段。

这是我附加到流的客户端的基本图:

在此处输入图像描述

所以,用一句话:

  1. C1J:第一个客户加入:
    • avformat 进程开始
    • ftyp、moov、moof、mdat 框将提供给 Client1
    • ftyp 和 moov 原子都被保存以供以后重用
  2. C2J:第二个客户加入(稍后):
    • avformat 进程正在进行中(因为它仍在为 Client1 提供 moof 和 mdat 框)
    • 先前保存的 ftyp 和 moov 框将首先提供给 Client2
    • 在提供 ftyp 和 moov 框后,Client2 将在下一个 moof 框加入流。

我已将两个客户端的 mp4 文件保存到磁盘。

两个文件中的原子顺序看起来不错:ftype、moov、moof、mdat、moof、mdat...

这两个文件都可以由媒体播放器(如 VLC)播放,也可以直接在浏览器中播放(Opera)。

Client1 也可以通过浏览器 (Opera) 中的 MSE 播放,但 Client2 的流不使用 MSE (Opera) 显示。

JS 控制台上没有错误,而且 media-internals 看起来也不错(至少与 Client1 相当)。

现在我意识到每个 moof 框都包含一个带有sequenceNumber字段的 mfhd 框(标题)。

当然,在 Client1 的第一个 moof 框中,这个 sequenceNumber 是1. 然而,在后来加入的 Client2 的第一个 moof 框中,这个 sequenceNumber 总是 >= 1(在我的情况下是16)。

我需要在 Client2 的 moof 框中修改什么才能从一开始就获得有效的 fmp4?

我认为 Opera 的 HTML5 视频不喜欢如果 sequenceNumber 不是从 1 开始,但它的有效性还有其他要求。

0 投票
1 回答
268 浏览

encode - 具有多组 SPS 和 PPS 且采用 avcc 编码的分段 MP4 视频

我正在尝试非常频繁地捕获屏幕图像,然后以 avcc 格式对其进行编码。使用编码帧的 SPS、PPS 和 avccnalunits,我正在创建分段的 mp4 视频并将这些片段推送到云端,并连接所有这些片段以形成一个大的视频 mp4 文件。它工作得很好,除非所有片段都具有相同的 SPS 和 PPS,但如果单个视频中有多个 SPS 和 PPS 集,则它无法播放。请让我知道应该修改哪个框以适应这个。

0 投票
1 回答
154 浏览

ffmpeg - Chromecast HLS:无法导出时间刻度

我正在尝试让 fmp4 HLS 在新的 Chromecast(我相信第三代,而不是 Ultra)上播放。

我尝试使用 x264 和 h264 库使用 ffmpeg 对内容进行编码。主要配置文件最初给了我一个编解码器不支持的错误,从 hls 清单中删除编解码器列表修复了这个问题。

切换到基线(这并不理想)不会产生编解码器错误。

然后(在删除编解码器定义或使用基线之后)都给出以下错误:

0 投票
1 回答
838 浏览

video - 碎片 MP4 不在 ffplay/QuickTime/Safari 中播放,但在 VLC 中播放

我使用 VideoToolbox 和 CoreMedia 在 Swift 中编码了一个 fMP4-Video (HEVC)。产生的碎片 MP4 仅在 VLC 中播放。

我用来编写 fMP4 的库是这个 GitHub 项目的 HEVC 改编版本:https ://github.com/krad/morsel

编码和写入过程:

  1. VideoToolbox:SampleBuffer来自摄像机的编码(VTCompressionSession如 WWDC 2014 Session 513 中所述)
  2. 使用CoreMedia-Functions(例如CMVideoFormatDescriptionGetHEVCParameterSetAtIndex, CMVideoFormatDescriptionGetDimensions)获取编码流元数据。我正在将内容CMFormatDescriptionGetExtension(description, extensionKey: "SampleDescriptionExtensionAtoms" as CFString)["hvcC"]直接写入 hvcC 框。这个盒子显然写得对,当我改变mp4的盒子的一个位时,QuickTime会抛出一个错误。
  3. 我将样本缓冲区数据附加到 morsel 库,该库管理碎片并创建 moof 和 mdat 原子。

结果文件可以在 VLC 中播放,而我只是让播放“运行”而不做任何事情。当我在 VLC 中滚动时间时,VLC 崩溃并且播放停止。

它在 Safari 和 QuickTime 中也是一种“可播放”(不显示错误消息,播放窗口打开并显示文件的正确长度,我什至可以更改播放时间/播放/暂停,但没有显示视频. 窗口仍然是空的。这就是我遇到的问题。我需要在 Safari 和 QuickTime 中运行 fMP4。

该文件在 ffplay 中根本没有播放(使用 ffmpeg 转换时同样的问题)。显示播放时间的行保持不变nan M-V: nan fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0 ,没有错误消息。播放只是没有开始。使用 ffplay 播放文件时,输出如下:

我的文件有这样的结构:

我要创建的结果文件应该类似于此 HLS 播放列表中提供的 fMP4:(示例:https ://developer.apple.com/streaming/examples/advanced-stream-hevc.html ,播放列表:https://devstreaming -cdn.apple.com/videos/streaming/examples/bibpbop_adv_example_hevc/master.m3u8 ) 该文件具有以下结构:

这个来自 Apple 的文件可以在 ffmpeg 和 QuickTime/Safari 中完美播放。除了第二个trak原子外,它具有相同的结构。

“好”文件是:https://devstreaming-cdn.apple.com/videos/streaming/examples/bibpbop_adv_example_hevc/v14/main.mp4(它旨在用于 HLS 播放列表,我用 curl 下载了它)

“坏”文件是:https ://www.transfernow.net/ddl/fmp4_bad (链接应该可以工作,刚刚测试过:))。视频显示一张缓慢旋转的纸。

有什么建议我的文件有什么问题吗?提前致谢!

0 投票
1 回答
4082 浏览

video-streaming - 什么 HEVC 编解码器标签与 fMP4、hvc1 或 hev1 一起使用?

在将HEVC 视频混合到分段 MP4 以使用 MPEG-DASH/HLS 进行流式传输时,如何选择要使用的正确编解码器标签(hvc1或)?hev1

我认为根据标签的不同,复用会略有不同ISO/IEC FDIS 14496-15

当示例条目名称为“hvc1”时,对于所有类型的参数集的数组,array_completeness 的默认值和强制值为 1,对于所有其他数组,则为 0。当示例条目名称为“hev1”时,所有数组的array_completeness 的默认值为0。

除了这个还有别的吗?

为什么有两个标签,在两者之间选择的标准是什么?

旁注:出于某种原因, Apple 更喜欢hvc1根据其HLS 创作规范。

0 投票
1 回答
1088 浏览

python - 将碎片化的 MP4 转换为 MP4

我正在尝试从 trafficview.org 抓取视频帧,但似乎无法弄清楚如何解码数据。

我根据这个websocket_client上的教程编写了几行代码来访问实时流 websocket 并直接接收消息。

我已经监控了通过 Chrome 上的网络选项卡传入的消息,并且还深入研究了下面代码的输出,并且相当确定数据正在以分段 MP4 的形式流入。以下是前 100 个左右的字节/消息:

b'\xfa\x00\x02\x86\xf1B\xc0\x1e\x00\x00\x00\x18ftypiso5\x00\x00\x02\x00iso6mp41\x00\x00\x02jmoov\x00\x00\x00lmvhd\x00\x00\x00 \x00\xdb\x7f\xeb\xb2\xdb\x7f\xeb\xb2\x00\x00\x03\xe8\x00\x00\x00\x00\x00\x01\x00\x00\x01\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

在整个输出中,有很多 moof 和 mdat 对。假设我让这段代码运行了 30 秒,如何将这个原始字节字符串转换为 mp4 文件?

更新:我已经修改了一些关于堆栈溢出的代码,据说可以通过管道输入 fmp4 数据并将其转换为帧。为了到达那里,我注意到 websocket 输出的前 16 个字节与我检查过的其他 mp4 文件不一致。所以我首先修剪前 16 个字节。我也不知道其中一个文件应该如何结束,所以我修剪到文件的最后一个moof。

下面的代码可以很好地读取 mp4 标头(也在下面),但无法解码任何字节。

ffmpeg 的输出:

更新 2:

在检查来自 websocket 的流后,我意识到每条消息都以一个特定的整数开头,该整数是在 trafficview 的 javascript 代码中定义的。这些代码的顺序总是相同的,它们如下所示:

其中一些标签始终相同,例如 249 条消息始终为 f900 0000,而 255 条消息始终为 ff00 0000。

我猜测 249 和 255 消息通常不在分段的 mp4 或 hls 流中,因此我认为我需要使用此标记信息从头开始构建正确的文件格式。

0 投票
1 回答
283 浏览

ffmpeg - 如何处理碎片化 mp4 容器中的单个片段?

我有分段播放的 mp4。首先是 mp4 标头,然后是每个 GOP 的各个段。这是我从 RTMP 服务器获取的 h264 和 aac 编码视频。

我想用 ffmpeg 处理这些单独的段(我怀疑还有其他可用的工具)。如果需要,可以调整分辨率或比特率,甚至转码为 vp8/9 或 avi1。

但似乎 ffmpeg 无法处理此问题,因为该段没有标头。所以我想知道是否有一个标志或一组标志让 ffmpeg 能够在没有标头的情况下处理这些段?我可以只从 RTMP 中获取原始 h264 和 aac 数据包,而不是事先将其打包到 MP4 容器中,如果有帮助的话 - ffmpeg 能够处理这些吗?

0 投票
1 回答
557 浏览

ffmpeg - 如何将带有 Alpha 通道的 HEVC 视频转换为带有碎片 MP4 的 HLS?

我尝试使用转换视频,ffmpegx265用于将文件编码为 HEVC 的库不支持 Alpha Channel

我发现了一些将文件转换为支持 Alpha 通道的 HEVC 的专有工具,但它们不会将它们转换为与 HLS 兼容的格式。

我也尝试过使用 AWS MediaConvert,但 Alpha 通道丢失了。

是否有一些工具可以将视频转换为 HEVC + Alpha Channel + HLS + 碎片化 MP4?

0 投票
0 回答
537 浏览

ffmpeg - 自包含 fmp4 片段的 HLS 播放列表

我正在开发一个以 MPEGTS 格式存储 10 秒长视频片段的 VMS。然后可以使用 HLS 流式传输这些片段,播放列表如下所示:

只要这些文件以 h.264 编码,这就很好用。但是,如果我尝试使用 h.265 片段创建类似的播放列表,它仅适用于我们的 Android 客户端、Apple 和 hls.js,它们决定仅使用片段 MP4 支持 h.265 HLS。

通过直接存储 fmp4 文件来“本机”支持 h.265 对我来说不是一个选择,所以我想按需将这些 MPEGTS 文件转换为 fmp4。

所以我试图做的是,返回这个播放列表(只改变文件扩展名):

然后在收到请求时使用 FFMPEG 将这些 MPEGTS 文件一个一个地打包到 fmp4 中:

不幸的是,这似乎仅适用于具有单个片段的播放列表(这意味着,在我的情况下最多 10 秒)。一旦我有 2 个以上的文件,它就不起作用,其行为会根据我使用的客户端而改变:有些会播放第一个文件然后停止,有些会快进到最后一个文件然后播放这个相反,有些根本不会玩...

我了解通过 HLS 进行 fmp4 流式传输的“正常”方法是使用“媒体初始化”段并将其放在#EXT-X-MAP每个段的标头中,然后通常将其编码为 *.m4s 文件而不是 *.mp4。但是,是否有可能让 fmp4 在 HLS 上使用自包含的片段,就像我们可以用 MPEGTS 做的一样?由于具有单个条目的播放列表似乎支持这一点,我认为可能有一种方法可以做到这一点。

另外,我知道 Apple 在 HLS 规范的这一部分受到 MPEG-DASH 的启发,据我了解,这在 MPEG-DASH 中是可能的