音视频基础
音视频分为两大类
- 在线视频
- 本地视频
在线音视频的播放步骤
- 网络协议
- 封装
- 编/解码
- 音视频的同步
- 播放
本地视频播放,则没有「网络协议」这一步。
其核心是【录】。主要是音视频的采集,剪辑,后期制作。
通俗的讲,就是录制、制作、生产 音视频。
是生产者
播放所选择的音视频资源。比如在 爱奇艺 等视频资源平台上播放视频。
重点:这些音视频资源都是提前录制好的,是可以随意拖动进度的。
是消费者
直播分为【主播端】和【观看端】。
重点:是实时的,观看者不能拖动音视频的进度。
既是生产者,又消费者。
封装格式
首先要明白一点,.mp4、.flv、.webm 这些都是封装格式,是文件的存储格式
大部分的封装格式并不限制音视频数据的基础参数(如帧率、分辨率、采样率等)。
所以,诸如MP4文件比FLV文件清晰等说法,实质上都是谣言。
那封装格式有什么用?
数据的编排虽然对音视频数据本身不会产生影响,但会影响一些特定功能。
比如:
- .MKV 封装格式支持外接字幕,可切换不同语言字幕。
- 在线播放视频的场景下,FLV、HLS视频的表现会比MP4文件的表现更优秀。
- 这个优秀并不是画面、声音质量方面。而是首帧播放所需时间、未加载完跳转等表现更加优秀。下面将详细简介为什么会这样。
MP4
MP4是最常见的封装格式,应用范围广、灵活性高、兼容性强。几乎所有的播放器、浏览器都支持。
它甚至支持自定义封面图,
MP4文件是数据块相互嵌套的树状结构,数据块一般被称为box
MP4支持的数据块类型有几十种。
不同类型的数据块内,所存放的信息不一样。而且很多数据块是非必要的。
MP4 文件的具体数据与数据块结构可以使用mp4info这个工具查看。
ftyb、mdat、moov,这三种数据块是MP4文件必要的数据块。
当然,这三个数据块中,也可能嵌入其他数据块。
我们不需要理解MP4的所有技术细节,但要知道这三种数据块的作用。
- ftyb数据块:存放的是编码格式、标准等信息。
- 播放器需要根据这些信息选择对应的解码器。
- mdat数据块:存放的是具体的音视频数据。
- 这里记录的音视频数据一般是没有时间戳的。
- moov数据块:存放的是元数据,包括mdat数据里的映射关系。
- mdat 中的数据需要根据 moov 的数据才能推算出音视频每帧的播放时间戳。
常有这样的情况,网络是正常的,但在线播放的MP4文件需要一段时间才能播放出来。
往往就是因为moov数据块还没获取到,无法计算出音视频帧的播放时间而无法播放。
所以,如果MP4文件是用于在线播放 ,一般要将MOOV数据块放在mdat数据块之前
这样能更快速的播放。
// 用FFmpeg命令
ffmpeg -i <old.mp4> -moveflags faststart -c copy <new.mp4>
有些观点表示,MP4文件会比FLV文件大,可能是MP4文件记录了很多不必要的信息导致的。 正常情况下,相同的视频,MP4封装的文件与FLV封装的文件大小是差不多的。
如果在线播放不是网站主要业务,视频文件不大、时长较短,是可以直接使用MP4文件的,毕竟浏览器及很多播放器都支持MP4封装格式。用户上传后,服务器也不需要对资源文件做太麻烦的处理。
但如果音视频文件很大,达到几GB、或时长很长,那尽量不要用MP4: 一是CDN加速的效果不佳,二是MP4文件长时间在线播放可能会出现播放中断等不良情况。
FLV
FLV格式与RTMP、HTTP-FLV是类似的,毕竟都是Adobe公司主导或推出的标准。 是一种为网络在线播放设计的格式,网页加入flv.js插件就可以播放了。
FLV文件的每个音视频数据块都可以有时间戳标识。所以它在首帧播放、未加载跳转等场景表现都更为优秀
flv视频可能出现「未加载部分不能跳转」的问题,或是「未加载部分跳转过去会报错中断播放」。 一般是因为此FLV文件「没建立关键帧索引」
// FFmpeg命令追加关键帧索引
ffmpeg -i <old.flv> -c copy -f flv -flvflags add_keyframe_index <new.flv>
一般网络视频都采用FLV格式文件,大文件、长时间播放比MP4更为稳定。当然普通CDN加速对FLV大文件效果也不佳,但可以接入大文件CDN缓解这个问题。 适合以短视频为主的网站
HLS
是用于点播场景下的。 HLS实质上就是把一整个大的视频文件分成很多个碎片视频文件
这项技术是由两部分组成
- 多个只有几秒长度的「.ts碎片视频文件」
- 记录这些视频文件地址的「.m3u8索引文件」
HLS的观看地址实质上是「.m3u8索引文件」。 客户端获取到索引文件后,就可以下载对应的「.ts碎片视频文件」并开始播放了。
HLS的「.m3u8索引文件」支持二级索引。 就是 高清、标清、流畅 等多个观看地址可以整合到一个索引文件,播放器可以根据当前带宽自动切换不同的观看地址,大部分网页播放器的“自动”也是因为这个。
由于HLS把一个视频文件切为很多段碎片文件,在线播放长视频的场景下,相对于FLV格式,HLS的未加载跳转、CDN加速、多线程预加载等方面 更为优秀。 但是在短视频场景下,HLS的优势并不明显。 而且视频碎片ts文件本身也是完整的视频封装格式,也是能单独播放的,所以会额外产生一些不必要的流量。
另外,HLS视频一般需要网站服务器自己转封装(把一整个资源文件碎片化),这也是HLS视频比较麻烦的地方。 不过公有云也有视频文件转码服务,提供自动转封装的功能。
相比于 FLV,HLS适合 大视频的播放
补充说明一下, HLS协议是苹果推出的标准,与HLS协议类似的还有MPEG-DASH协议。 HLS、MPEG-DASH的工作原理都是差不多的,只是局部标准不一样,这里不作展开。
- MP4:适合在线播放不是主要业务
- FLV:适合在线短视频
- HLS、DASH:适合在线大视频