常见的视频传输协议:

  1. HTTP 浏览器一次性把视频请求下来,一般来说用户可以点击鼠标右键或者通过抓包的方式直接把视频下载到本地
  2. HLS(HTTP Live Streaming)Apple 开发的一种视频传输格式,其核心思想是将视频分为多个 .ts 文件,用户播放视频的时候只请求一部分 .ts 文件,无需等待整个视频全部下载完才能播放。由于传来的不是一整个视频文件,因此无法直接下载 HLS 传输的视频。
  3. MPEG-DASH 思想类似 HLS,都是将视频分片传输,提高视频的播放速度。DASH传来的文件是 .m4s 后缀的。

HLS

HLS 采用分片传输媒体文件,因此需要一个索引文件标识视频有多少个分片,这个索引文件实际是一个文本文件,格式如下:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
http://example.com/video-0.ts
#EXTINF:10.0,
http://example.com/video-1.ts
#EXTINF:10.0,
http://example.com/video-2.ts
#EXT-X-ENDLIST

其中 #[TEXT] 被称为标签,用来给分片和文件提供描述。#EXTINF:10.0 后面的 10.0 标识分片为 10s,下一行的链接则代表分片的地址,可以直接下载这个分片到本地。
上面的例子一共有 3 个 .ts 分片,每个分片 10s,因此该视频长度为 30s。

下载 HLS 传输的媒体

把所有 .ts 文件下载到本地后,可以通过 ffmpeg 合并分片为 .mp4 文件:
ffmpeg -i 1.ts -i 2.ts -c copy output.mp4

解析 m3u8 文件

可以使用这个 https://github.com/globocom/m3u8 Python 包解析 m3u8 文件。

HLS 播放

播放 HLS 传输的媒体主要依赖如下两个对象:
SourceBuffer:https://developer.mozilla.org/en-US/docs/Web/API/SourceBuffer#examples
MediaSource: https://developer.mozilla.org/en-US/docs/Web/API/MediaSource

HEARTBEAT 和 认证

播放视频的时候前端定时发送 heartbeat 保活;如果请求 .ts 分片的时候需要认证,则在请求头或者 URL 中添加对应的参数。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐