容器格式的乐趣 第二章:MP4与CMAF

本文为媒矿工厂编译的技术文章

原标题:Fun with Container Formats – Part 2

作者:Armin Trattnig

翻译整理:陈晋进

MP4 标准概述

MPEG-4 Part 14(MP4)是最常用的容器格式之一,通常文件以.mp4结尾。它不仅能用于HTTP上的动态自适应流传输(DASH),还能用于Apple提出的的HLS流传输。MP4基于QuickTime文件格式标准下的ISO基础媒体文件格式(MPEG-4 Part 12)。MPEG代表Moving Pictures Experts Group,是国际标准化组织(ISO)和国际电工委员会(IEC)合作建立的组织。MPEG的设立是为了规范音频和视频压缩和传输的标准。MPEG-4则指的是对视频的编码。MP4支持多种编解码器。最常用的视频编解码器是H.264和HEVC。AAC是最常用的音频编解码器。AAC是著名的MP3音频编解码器的后继者。

图1 MP4

ISO基础媒体文件格式

ISO Base Media File Format(ISOBMFF,ISO基础媒体文件格式,MPEG-4第12部分)是MP4容器格式的基础。ISOBMFF是定义基于时间的多媒体文件的标准。基于时间的多媒体通常指音频和视频,通常以稳定的流形式传输。它设计灵活,易于扩展,使得多媒体数据便于互换,管理,编辑以及呈现。ISOBMFF的基本组件是box,也称为atom。该标准通过使用类和面向对象的方法来定义box。通过继承的方式,所有的box都扩展了最基类的box,通过添加新的类属性能够使每个box具体用于某个目的。

对基类的介绍以FileTypeBox作为示例:

图2 FileTypeBox

FileTypeBox用于标识ISOBMFF文件的用途和用法,通常位于文件的开头。一个box也可以有子box,从而形成一个box的树框架。例如,MovieBox(moov)可以有多个TrackBox(trak)。ISOBMFF环境中的轨道(track)是单个媒体流。例如,MovieBox包含用于视频的TrackBox和用于音频的一个box。 二进制编解码器数据可以存储在媒体数据盒(mdat)中。轨道通常引用其二进制编解码器数据。

Fragmented MP4(fMP4)

使用MP4还可以将电影分成多个片段。其优点在于,当使用DASH或HLS进行流传输时,播放器软件仅需要下载观看者想要观看的片段。碎片化的MP4文件通常由MovieBox和TrackBox组成,用于指示可用的媒体流。Movie extend box(mvex)用于指示电影在片段中是否继续播放。另一个优点在于,片段可以存储在不同的文件中。每个视频片段都包括一个moof,其与Movie box(moov)非常相似,包含单个片段中包含的媒体流的信息。例如,它包含10秒视频的时间戳信息,这些信息存储在片段中,每个片段都有自己的媒体数据(MediaData,mdat) box。

调试(f)MP4文件

调试过程中,通常需要查看(f)MP4文件的box(atom)来发现box的错误以及不需要的配置。可以使用如下的工具获得媒体文件所包含的内容,:

  • MediaInfo(https://mediaarea.net/en/MediaInfo/Download)
  • ffprobe,它是ffmpeg二进制文件的一部分(https://ffbinaries.com/downloads)

然而,这些工具不会显示(f)MP4文件的box的结构。若要显示,可以借助以下工具完成:

  • Boxdumper(https://github.com/l-smash/l-smash)
  • IsoViewer(https://github.com/sannies/isoviewer)
  • MP4Box.js(http://download.tsi.telecom-paristech.fr/gpac/mp4box.js/filereader.html)
  • Mp4dump(https://www.bento4.com/)

图3 查看MP4文件的box

MPEG-CMAF

由于某些平台仅支持某些容器格式,内容分发者想要为所有的平台提供服务是具有挑战性的。为了分发某一部分内容,可能需要以不同的容器格式(例如MPEG-TS和fMP4)生成和提供内容的副本。这不仅会增加内容创建的基础架构的额外成本以及托管相同内容的多个副本的存储成本,还会使CDN缓存效率降低。MPEG-CMAF旨在解决这些问题。CMAF不通过创建另一种容器格式,而是通过融合为OTT媒体分发的现有容器格式为一体。CMAF与fMP4密切相关,因而从fMP4到CMAF的过渡代价非常小。此外,Apple公司也参与CMAF的开发,使得苹果设备上不得不对MPEG-TS格式转复用的步骤成为了历史,CMAF将取代其为苹果设备服务。

在MPEG-CMAF中,使用MPEG-CENC(通用加密),DRM(数字版权管理)解决方案使得其互操作性也得到了改进。从理论上来说,可以对内容进行一次加密,并将其与所有不同的最先进的DRM系统一起使用。但是,如今仍没有标准化的加密方案,况且仍有竞争对手,例如Widevine和PlayReady——而这些系统并不相互兼容,但DRM行业也逐步转向一种通用加密格式。

Chunked CMAF

MPEG-CMAF的一个特点是可以在所谓的CMAF块中编码段。这种分块编码的方式,结合使用HTTP分块传输编码传递媒体文件的方法,降低了实时流传输中的延迟。

图4 分块CMAF

在传统的fMP4中,视频片段必须整个完全下载之后才可以播放。使用分块编码,视频片段中任何完全加载的块都可以被分别解码并播放,未完全加载的剩余部分则依然继续被加载。这使得实时等待时间不再取决于片段的总时间,因为即使是不完整的一个视频片段的片段,也可以在客户端被分段加载和播放。

总结

本文翻译自Bitmovin博客上的《Fun with container formats》系列博文的第二篇,这个系列总共有三篇,分析四种最常见的容器格式及其重要性。这篇介绍了MP4与CMAF这两种容器格式。

本文分享自微信公众号 - 媒矿工厂(media_tech)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DotNet Core圈圈

花5分钟时间来了解一下高性能网关Kong会有意外收获

前几天开源发布了 Kong.Net 项目,收到了大量园友的反馈,开源当天就突破了 100 个star ,可喜可贺,但是从侧面也说明,我们 .NetCore 阵营...

12630
来自专栏格姗知识圈

这些linux、docker、k8s的命令,你知道多少呢

2、cd --切换目录(cd 有很多种用法,但是刚接触linux人的来说只要记住这个就可以了,剩下的以后慢慢学,如cd ..,cd -,cd ~,cd ....

20020
来自专栏不止dotNET

Docker常用命令

学习Docker有段时间了,所有的操作都是在命令行下,如果不是每天都在使用,很容易忘记命令。本文将以学习Docker的角度,从前到后,将一些常用的Docker命...

9820
来自专栏git

docker 命令

12030
来自专栏不止dotNET

Docker安装MySql-挂载外部数据和配置

在上一篇中《在CentOS7中使用Docker安装MySql》中介绍了怎样在Docker中安装Mysql,但存在两个问题:

46030
来自专栏不止dotNET

Office转PDF,Aspose太贵,怎么办?

在程序开发中经常需要将Office文件转换成PDF,著名的Aspose的三大组件可以很容易完成这个功能,但是Aspose的每个组件都单独收费,而且每个都卖的不便...

32220
来自专栏solate 杂货铺

Docker 生产SSH服务的镜像

7.当前这个容器 root 用户目录下建立.ssh目录,复制需要的公钥到 authorized_keys 文件

14610
来自专栏DotNet Core圈圈

.Net Core中的Options使用以及源码解析

在.Net Core中引入了Options这一使用配置方式,通常来讲我们会把所需要的配置通过IConfiguration对象配置成一个普通的类,并且习惯上我们会...

9620
来自专栏不止dotNET

在CentOS7中使用Docker安装MySql

上面是百度百科中Docker的介绍,因为Docker的诸多好处,准备在产品中使用,最近做了些技术的预研,本文主要介绍在CentOS7中使用Docker来安装My...

15720
来自专栏不止dotNET

dotnet Core中使用Aspose(部署Docker)

在dotnet下处理过Office文档的相信对Aspose都不陌生,Aspose下面的三大组件:Aspose.Cells、Aspose.Slides、Aspos...

15730

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励