| 10 min read

原文地址: https://www.adobe.com/devnet/video/articles/mp4_movie_atom.html

@Maxim Levkov

本文是来自 Adobe 的工程师撰写的,用于帮助大家学习 moov atom 以及对比了整个 Adobe Flash Player 支持的视频流格式,加深对 moov atom 的功能和位置的理解。有助于我们进一步理解视频编解码想过的知识。

User level

Advanced

要在Adobe Flash Platform上播放的视频文件比较简单。但是,经常令人困惑的一个不太能够理解 moov atom, 它包含有关视频文件相关的信息。moov atom 也被叫做 Movie atom,它里面定义视频的时间尺度,时长,显示特性,以及含有用于在电影每个轨道信息。moov atom 的最佳位置取决于所选的传输方式。本文深入研究moov atom 周围的细节,其中包含的数据以及如何将其移动到适合的位置。

本文针对正在发布H.264视频以在Adobe Flash Player或Adobe AIR中交付的任何人。它提供了有 metadata 的技术细节,这些 metadata 可能会 影响 编码和传递,从而导致播放性能下降。

视频传输

在Adobe Flash Player中可以使用四种不同的方法来进行视频传递:渐进式下载,RTMP流,HTTP动态流或通过 RTMFP 进行P2P。无论选择哪种方法,观看者的体验都非常相似。您的选择决定了您的预算,比如你需要什么样的Flash Player版本以及内容保护级别。在解释容器结构的详细信息时,你可以看到 moov atom 在每种交付方式中的处理方式都不同。

渐进式下载

渐进式下载方法将视频下载并缓存在用户的计算机上。在开始播放之前,需要很短的时间来缓冲和缓存媒体文件的开头。Flash Player可以根据接收数据的速率和视频的总长度来计算适当的缓冲时间。缓存视频后,随后的观看不需要任何缓冲。通常下载视频都是通过标准HTTP协议CDN 来进行传送。在这种情况下,Flash Player将与CDN的服务器建立 HTTP 连接以下载内容。

RTMP Streaming

RTMP流传输方法可根据需要实时请求传输视频内容。这些数据在看完后会将其丢弃。用户体验与渐进式下载几乎相同,但还有一些主要区别:

  • 观众不必等待视频下载就可以进行视频的快进或者回退

  • 视频不会缓存在用户计算机上,因此无法离线观看

  • Flash Player可以通过Adobe Flash Media Server支持的RTMP或RTMPE协议传送流视频。

HTTP Dynamic Streaming

Flash Player 10.1引入了对 HTTP Dynamic Streaming 的支持,通过常见的 HTTP 服务器,实现自适应码率,和版权内容的保护支持。它使用标准的MPEG-4媒体格式(也称为MP4),HTTP Dynamic Streaming 和 RTMP Streaming共享一些功能:

  • 它支持实时和按需下载

  • 它可以根据观看者的连接速度和处理能力来调整视频质量

  • 观众不必等待视频下载就可以进行视频的快进

  • 支持实时DVR功能,可以暂停和回退

像标准渐进式交付一样,内容会缓存在计算机上。如果需要内容保护,则可以与Adobe Flash Access集成。

RTMFP P2P

Flash Player 10.1和更高版本中使用实时媒体流协议(RTMFP)支持 P2P。这使Flash Player客户端可以通过直接连接而不是通过服务器来共享视频,音频和数据。这样就可以通过多播实现高容量交付,并为VoIP,视频会议和多人游戏等应用提供超低延迟通信。

注意:实时流媒体不使用moov atom;因此,本文将不涉及实时流。

MPEG-4 Streaming 打包

为了使Flash Player能够播放MPEG-4(MP4)文件,该文件必须包装在一种特定的容器中,该容器遵循MPEG-4 Part 12(ISO / IEC 14496-12)规范。流打包是制作多路复用媒体文件的过程。也称为 muxing,此过程将多个元素组合在一起,从而可以控制分发传递过程到单个文件中。这些元素中的一些以自包含信息。就像我在一开始提到的那样,Atom 是一个基本数据单元,其中包含一个 Header 和一个数据字段。该 Header 包含引用元数据,该元数据描述了如何查找,处理和访问数据字段的内容,其中可能包括(但不限于)以下内容:

  • Video frames 视频帧信息
  • Audio samples 音频采样
  • Interleaving AV data 交织AV数据
  • Captioning data 字幕数据
  • Chapter index 章节索引
  • Title
  • Poster
  • User data (用户定义数据)
  • 各种技术 meatdata :编解码器,刻度尺,版本,首选播放速率,首选播放音量,电影时长等。

在符合MPEG-4的容器中,每部电影都包含一个moov atom。通常,电影原子包含一个 movie header atom(一个mvhd atom),它定义整个电影的刻度值和持续时间信息,以及其显示的特性。movie atom 还为电影中的每个轨道包含一个轨道 atom(trak atom)。每个 trak atom 都包含一个或多个 media atom(一个mdia原子)以及定义其他轨道和电影特性。

*基本 moov atom 结构*

在这种树状层次结构中,moov atom 充当视频数据的索引。MPEG-4多路复用器在这里存储有关文件的信息,以让用户能够播放和清理文件。直到播放器可以访问该索引,文件才会开始播放。

除非另有说明,否则在描述文件的所有信息均已生成之后,moov原子通常以点播内容存储在文件的末尾。根据所选择的按需交付方式的类型(渐进式下载,流式传输或本地回放),该位置将需要移动到文件的末尾或开头。
如果计划的交付方式是渐进式下载或流式传输(RTMP或HTTP),则必须将 moov atom移动到文件的开头。这样可以确保首先下载所需的电影信息,从而使播放立即开始。如果 moov atom 位于文件的末尾,它将在开始播放之前先强制下载整个文件。如果文件打算在本地播放,则moov atom 的位置不会影响开始时间,因为整个文件都可以立即播放。

moov atom 的位置是通过“渐进式下载”,“快速启动”,“使用流模式”或类似选项之类的设置在各种软件包中指定的。诸如 MP4creatorAtomicParsley 之类的软件包使您能够分析moov atom 在编码文件中的位置(图1和2)。
一些工具可以通过对压缩的MPEG-4(MP4)文件进行后期处理,将 moov atom 重新定位到文件结构的开头。一种这样的工具是前面提到的 MP4Creator,另一种是MP4 FastStart。但是,处理moov atom位置的最佳方法是在编码过程的压缩和混合部分设置它。这最小化了moov atom 无意间被放置在末端的可能性。

moov atom 位置的重要性

正如我之前提到的,将moov原子放置在文件结构的开头可加快回放体验,并访问数据有效负载以供客户端播放器解码和呈现。对于渐进式传送尤其如此,在这种情况下,必须在开始播放之前接收 moov atom 数据。
但是,在开始时具有moov atom 的另一个重要原因与RTMP Streaming中的文件,服务器和CDN关系有关。当用户通过RTMP请求视频资源的时候,Flash Media Server 会检查该资源在本地缓存中的可用性。如果 FMS 不在本地找到资源,则它会在利用HTTP缓存层次结构的同时通过本地服务请求资源。这是关键点:最初,Flash Media Serve 在文件的开头请求一个“范围”以获取目录。如果FMS看到 metadata 存储在文件末尾,则它会在文件末尾请求存储元数据的范围,然后再次从头开始请求文件。由于范围请求不可缓存,并且因为它们可以重叠,来回请求的此过程可能会导致重新缓冲。如果用户是从头到尾随机观看视频或小段观看而不是整个视频,则尤其如此,因为它永远不会被完全缓存。因此,建议始终以moov atom 开头编码或合并文件,以避免由moo atom 子位置引起的重新缓冲。

edts atom 处理问题

edts atom 位于MP4容器层次结构中的moov atom 的 trak atom 中, 负责跟踪媒体的时间和持续时间。Flash Player体系结构旨在忽略edts 原子的存在。但是,包含无效或损坏数据的edts 原子可能会干扰HTTP封包后流的平稳切换。因此,在打包用于HTTP动态流的文件之前,修复或删除无效的edts原子很重要。

可以使用诸如 FLVCheck 进行文件一致性检查,MP4Creator进行结构分析以及AtomicParsley 删除元数据之类的工具从文件中消除损坏的edts原子(参见图3和4)。
以下字符串表示负责去除原子的AtomicParsley命令:

AtomicParsley.exe filename.mp4 –manualAtomRemove “moov.trak.edts” –manualAtomRemove “moov[2].trak.edts” –overWrite

在这里,filename.mp4是要处理的文件的名称,并且

–manualAtomRemove

是一个命令的启动,该命令启动特定原子edts的删除,该原子分层地位于moov原子内的trak原子内。如果文件包含多个Trak原子,例如音频和视频媒体元素,则将曲目号添加到“

moov.trak.edts

”,如上所示。默认情况下,AtomicParsley会从第一个moov原子轨道中删除该原子。依次添加下一个轨道号或您选择的轨道号,会强制AtomicParsley接下来继续执行该原子号(例如

moov[2].trak.edts

)。要编辑所有轨道号,请对每个轨道重复此命令。添加命令字符串将

–overWrite

覆盖原始的处理文件。

扩展阅读

工具推荐

You Can Speak "Hi" to Me in Those Ways