发现很多人对视频格式存在一些误解, 之前写的一篇文章讲 AVPlayer 的支持格式也有一些问题, 所以这里单独出一篇文章讲一下, 希望大家能明白.
基本概念
一个在线视频能够播放, 大致是经过了如下步骤:
可以总结为: 拉数据 ->解协议 ->解封装 ->音视频解码 ->音视频同步 ->播放. 下面就针对这几个概念一一做下解释:
播放协议
一般点播采用 HTTP, 而直播的话, 大部分还是采用 RTMP 或者私有协议, 原因是延时会比较小, RTMP 本身也是为了直播设计的. 常见的流媒体协议:
简写 | 全称 | 推出机构 | 目前使用领域 |
---|---|---|---|
HLS | HTTP Live Streaming | 苹果 | 多应用于苹果 |
RTP | 实时传输协议 | IETF | 范围较广 |
RTCP | 实时传输控制协议 | IETF | 范围较广 |
RTSP | 实时串流协议 | RealNetworks 等 | 范围较广 |
RTMP | 实时消息协议 | Adobe | 较流行 |
MMS | 串流媒体协议 | Microsoft | 范围较广 |
RTP/RTSP/RTCP 的区别
RTSP 发起 / 终结流媒体, RTP 传输流媒体数据 ,RTCP 对 RTP 进行控制, 同步.
HLS(Http Live Streaming) HLS 是苹果推出, 实现的基于 HTTP 的流媒体传输协议: 优点: 1, 通过 m3u8 索引文件可实现针对当前浏览设备的智能选择播放源, 2, 通过 m3u8 索引文件可实现添加备份索引文件, 防止服务器崩溃视频播放失败 3, 和 http 视频一样 不需要太多服务器额外配置 缺点: 1, 并非真正实时视频, 30s 左右时间差 2, 需要视频处理 3, 因为需要请求索引文件 (ts 视频文件) 请求次数相对较多, 对服务器负载较大
视频编码
所谓视频编码方式就是指通过特定的压缩技术, 将某个视频格式的文件转换成另一种视频格式文件的方式. 它是一种为了减少视频体积, 同时保证画面质量的压缩技术, 常见的视频编码有:
名称 | 推出机构 | 推出时间 | 目前使用领域 |
---|---|---|---|
HEVC(H.265) | MPEG/ITU-T | 2013 | 研发中 |
H.264 | MPEG/ITU-T | 2003 | 各个领域 |
MPEG4 | MPEG | 2001 | 不温不火 |
MPEG2 | MPEG | 1994 | 数字电视 |
XviD | OpenDivX | 2002 | 流行 |
VP9 | 2013 | 研发中 | |
VP8 | 2008 | 不普及 | |
VC-1 | Microsoft Inc. | 2006 | 微软 |
H.264
H.264 又叫 AVC, 是国际标准化组织 (ISO) 和国际电信联盟 (ITU) 共同提出的继 MPEG4 之后的新一代数字视频压缩格式, 它集合了 H.263 和 MPEG4 的优点, 拥有更高的数据压缩比. 在同等的图像质量条件下, H.264 的数据压缩比能比 H.263 高 2 倍, 比 MPEG-4 高 1.5 倍. 也是目前苹果支持最好的编码格式.
音频编码
和视频编码类似, 音频编码的作用是减少音频中的冗余, 同时在保证一定音频质量的条件下作的压缩处理.
名称 | 推出机构 | 推出时间 | 目前使用领域 |
---|---|---|---|
AAC | MPEG | 1997 | 流媒体 |
AC-3 | Dolby Inc. | 1992 | DVD, 数字电视 |
MP3 | MPEG | 1993 | 各个领域(旧) |
WMA | Microsoft Inc. | 1999 | Windows |
AAC AAC(高级音频编码技术 Advanced Audio Coding), 出现于 1997 年, 是基于 MPEG-2 的音频编码技术. 由 Fraunhofer IIS, 杜比, 苹果, AT&T, 索尼等公司共同开发, 以取代 mp3 格式. 2000 年, MPEG-4 标准出台, AAC 从新整合了其特性, 故现又称 MPEG-4 AAC, 即 m4a. 苹果的 CoreAudio 对 AAC 有较好的支持.
封装格式
我们常见的视频格式 MP4, AVI, RMVB, 3GP, MKV 都是指视频的封装格式, 大部分情况就是视频文件的后缀. 常见的组合方式有:
名称 | 简介 | 常用编码格式 | 扩展名 |
---|---|---|---|
Flash Video | 由 Adobe Flash 延伸出来的的一种流行网络视频封装格式。随着视频网站的丰富,这个格式已经非常普及。 | H.264+MP3 | flv |
AVI(Audio Video Interleave) | 比较早的 AVI 是微软开发的。其含义是 Audio Video Interactive,就是把视频和音频编码混合在一起存储。AVI 也是最长寿的格式,已经存在 10 余年了,虽然发布过改版(V2.0 于 1996 年发布),但已显老态。AVI 格式上限制比较多,只能有一个视频轨道和一个音频轨道(现在有非标准插件可加入最多两个音频轨道),还可以有一些附加轨道,如文字等。AVI 格式不提供任何控制功能。 | Xvid+MP3 | avi |
WMV(Windows Media Video) | 同样是微软开发的一组数字视频编解码格式的通称,ASF(Advanced Systems Format)是其封装格式。ASF 封装的 WMV 档具有 “数字版权保护” 功能。 | VC-1+WMA | wmv/asf |
MPEG(Moving Picture Experts Group) | 是一个国际标准化组织(ISO)认可的媒体封装形式,受到大部分机器的支持。其存储方式多样,可以适应不同的应用环境。MPEG-4 档的档容器格式在 Part 1(mux)、14(asp)、15(avc)等中规定。MPEG 的控制功能丰富,可以有多个视频(即角度)、音轨、字幕(位图字幕)等等。MPEG 的一个简化版本 3GP 还广泛的用于准 3G 手机上。 | H.264+AAC,H263+AAC | dat(VCD),vob(DVD), mp4, 3gp |
Matroska | 是一种新的多媒体封装格式,这个封装格式可把多种不同编码的视频及 16 条或以上不同格式的音频和语言不同的字幕封装到一个 Matroska Media 档内。它也是其中一种开放源代码的多媒体封装格式。Matroska 同时还可以提供非常好的交互功能,而且比 MPEG 更方便、强大。 | 各种编码格式的组合 | mkv |
Real Video Real Media(RM) | 是由 RealNetworks 开发的一种档容器。它通常只能容纳 Real Video 和 Real Audio 编码的媒体。该档带有一定的交互功能,允许编写脚本以控制播放。RM,尤其是可变比特率的 RMVB 格式,没有复杂的 Profile/Level,制作起来较 H.264 视频格式简单,非常受到网络上传者的欢迎。此外很多人仍有 RMVB 体积小高质量的错误认知,这个不太正确的观念也导致很多人倾向使用 rmvb,事实上在相同码率下,rmvb 编码和 H.264 这个高度压缩的视频编码相比,体积会较大。 | RealVideo+RealAudio | rm/rmvb |
QuickTime File Format | 是由苹果公司开发的容器。1998 年 2 月 11 日,国际标准化组织(ISO)认可 QuickTime 文件格式作为 MPEG-4 标准的基础。QuickTime 可存储的内容相当丰富,除了视频、音频以外还可支持图片、文字(文本字幕)等。 | H.264+AAC | mov, qt |
MP4 mp4 格式是 H.264 编码指定使用的标准封装格式, 3GP 是 MP4 格式的一种简化版本, 减少了储存空间和较低的频宽需求, 让手机上有限的储存空间可以使用.
实际上这些封装格式对应的音频视频编码格式也不是固定的, 就拿 MP4 来说, 常见的 MP4 是由 H.264+AAC 封装, 但是也由 Xvid+AAC 编码的可能. 如果解码器不支持 Xvid, 则可能会出现无法播放, 或者播放播放过程有声音无画面的情况.
苹果支持哪些音视频编码格式
我们可以在手机介绍界面, 找到手机支持的视频格式 iPhone - Compare Models - Apple https://www.apple.com/iphone/compare/
这里我们可以找到对应 iPhone7 支持的视频编码格式:
Video formats supported: HEVC, H.264, MPEG-4 Part 2, and Motion JPEG
HEVC 又叫 H.265,iOS11+A9 芯片才开始对 HEVC 的支持, iPhone6s 及以前的设备不支持 HEVC 解码. 音频格式用红框标出来了, 内容较多, 可自行对比.
AVPlayer 支持哪些视频格式
苹果设备支持音视频格式并不是就代表 AVPlayer 也支持那么多格式, 确定 AVPlayer 的支持格式, 我们可以查看 AVKit 中的一个 API:
- // 展示当前支持的音视频格式
- let asset = AVURLAsset.audiovisualTypes()
- // 打印 asset 可以得到(已经转过展示格式)
- asset type (
- "audio/aacp",
- "video/3gpp2",
- "audio/mpeg3",
- "audio/mp3",
- "audio/x-caf",
- "audio/mpeg",
- "video/quicktime",
- "audio/x-mpeg3",
- "video/mp4",
- "audio/wav",
- "video/avi",
- "audio/scpls",
- "audio/mp4",
- "audio/x-mpg",
- "video/x-m4v",
- "audio/x-wav",
- "audio/x-aiff",
- "application/vnd.apple.mpegurl",
- "video/3gpp",
- "text/vtt",
- "audio/x-mpeg",
- "audio/wave",
- "audio/x-m4r",
- "audio/x-mp3",
- "audio/AMR",
- "audio/aiff",
- "audio/3gpp2",
- "audio/aac",
- "audio/mpg",
- "audio/mpegurl",
- "audio/x-m4b",
- "application/mp4",
- "audio/x-m4p",
- "audio/x-scpls",
- "audio/x-mpegurl",
- "audio/x-aac",
- "audio/3gpp",
- "audio/basic",
- "audio/x-m4a",
- "application/x-mpegurl"
- )
还有一个方式用来判断当前格式是否可播:
- //An extended MIME type string such as video/3gpp2; codecs="mp4v.20.9, mp4a.E1" or audio/aac; codecs="mp4a.E1".
- let playable: Bool = AVURLAsset.isPlayableExtendedMIMEType("video/3gpp2; codecs=\"mp4v.20.9, mp4a.E1\"")
这里的 MIMEType 可以在这里找到 System-Declared Uniform Type Identifiers
总结 由此我们可以下一个总结, AVPlayer 支持的: 视频编码格式: H.264,HEVC(iPhone7 及以后设备),MPEG-4. 视频格式(封装格式):.mp4,.mov,.m4v,.3gp,.avi 等. 如果想支持更多的视频格式, 可以使用使用第三方的框架, 常用的视频编码和解码框架有 VLC https://www.videolan.org/vlc/ 和 FFMPEG https://github.com/FFmpeg/FFmpeg .
参考文献
视频文件格式 - 维基百科, 自由的百科全书 音频编码格式的比较 - 维基百科, 自由的百科全书
来源: https://juejin.im/post/5bfca10ce51d45735e4fec19