当前位置:   article > 正文

WEB 视频开发-主流协议 HLS & DASH

音视频分离 byterange

作者 | 翁鹏

 42

上篇文章介绍了 MSE 来播放流媒体,但是 WEB 视频开发并不只依靠 MSE。这篇文章就来介绍主流的两种协议 HLS 和 DASH,以及如何制作并使用支持这些协议开源的客户端库来播放视频。

HLS

HLS (HTTP Live Streaming) 是苹果公司开发的流媒体传输协议,它使用 HTTP 来传输视频,可以防止被防火墙屏蔽。现在大部分视频网站都在使用,比如优酷、腾讯视频。

它的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。

它会生成一个 .m3u8 文件,其中除了包含一些元数据,还记录被分割视频的存放位置。分割的视频是 .ts 结尾的文件,是 MPEG-2 Transport Stream 容器,不过现在 HLS 也支持 fmp4。

  1. #EXTM3U
  2. #EXT-X-TARGETDURATION:10
  3. #EXT-X-VERSION:4
  4. #EXT-X-MEDIA-SEQUENCE:0
  5. #EXTINF:10.0,
  6. ad0.ts
  7. #EXTINF:8.0,
  8. ad1.ts
  9. #EXT-X-DISCONTINUITY
  10. #EXTINF:10.0,
  11. movieA.ts
  12. #EXTINF:10.0,
  13. movieB.ts

一个 .m3u8 文件大概长上面那样。文件中以 # 开头的字符串要么是注释,要么就是标签,标签以 #EXT 开头,大小写敏感。

  • EXTM3U M3U8 文件必须包含的标签,并且必须在文件的第一行

  • EXT-X-VERSION M3U8 文件的版本,常见的是 3(目前最高版本应该是7),版本更高支持的标签就越多

  • EXT-X-TARGETDURATION 指定了单个媒体文件持续时间的最大值

  • EXT-X-MEDIA-SEQUENCE 播放列表第一个 URL 片段文件的序列号,默认序列号从 0 开始

  • EXTINF 其后 URL 指定的媒体片段时长(秒)

  • EXT-X-DISCONTINUITY 一般用于视频流中插入广告,表示前面的片段与后面不一样,让客户端做好准备

制作

去网上随便下载一个视频,用 Bento4 中的 mp4info 看一下文件信息,如下:

  1. mp4info ./video.mp4
  2. ...
  3. Track 1:
  4.   flags:        3 ENABLED IN-MOVIE
  5.   id:           1
  6.   type:         Video
  7.   duration: 30000 ms
  8.   language: und
  9.   media:
  10.     sample count: 720
  11.     timescale:    12288
  12.     duration:     368640 (media timescale units)
  13.     duration:     30000 (ms)
  14.     bitrate (computed): 5860.270 Kbps
  15.   display width:  1920.000000
  16.   display height: 1080.000000
  17.   frame rate (computed): 24.000
  18.   Sample Description 0
  19.     Coding:      avc1 (H.264)
  20.     Width:       1920
  21.     Height:      1080
  22.     Depth:       24
  23.     AVC Profile:          100 (High)
  24.     AVC Profile Compat:   0
  25.     AVC Level:            40
  26.     AVC NALU Length Size: 4
  27.     AVC SPS: [67640028acd940780227e5c044000003000400000300c03c60c658]
  28.     AVC PPS: [68ebe3cb22c0]
  29.     Codecs String: avc1.640028
  30. Track 2:
  31.   flags:        3 ENABLED IN-MOVIE
  32.   id:           2
  33.   type:         Audio
  34.   duration: 30022 ms
  35.   language: und
  36.   media:
  37.     sample count: 1408
  38.     timescale:    48000
  39.     duration:     1441024 (media timescale units)
  40.     duration:     30021 (ms)
  41.     bitrate (computed): 192.583 Kbps
  42.   Sample Description 0
  43.     Coding:      mp4a (MPEG-4 Audio)
  44.     Stream Type: Audio
  45.     Object Type: MPEG-4 Audio
  46.     Max Bitrate: 192580
  47.     Avg Bitrate: 192580
  48.     Buffer Size: 0
  49.     Codecs String: mp4a.40.2
  50.     MPEG-4 Audio Object Type: 2 (AAC Low Complexity)
  51.     MPEG-4 Audio Decoder Config:
  52.       Sampling Frequency: 48000
  53.       Channels: 6
  54.     Sample Rate: 48000
  55.     Sample Size: 16
  56.     Channels:    2

可以看到这个文件为 1080p,24 fps,5860 的码率。

  1. ffmpeg -i ./in.mp4 \
  2.     -vf scale=w=1280:h=720:force_original_aspect_ratio=decrease,yadif \
  3.     -c:a aac -b:a 128k -ar 44100 -ac 2 \
  4.     -c:v libx264 -b:v 2500k -maxrate 2675k -bufsize 3000k \
  5.     -pix_fmt yuv420p -level 4.1 \
  6.     -profile:v high -preset veryfast -crf 20 \
  7.     -g 120 -keyint_min 120 \
  8.     -sc_threshold 0 \
  9.     -threads 0 -muxpreload 0 -muxdelay 0 \
  10.     -hls_time 10 -hls_playlist_type vod -hls_list_size 0 \
  11.     -f hls -hls_segment_filename '720p_%03d.ts' 720p.m3u8

运行上面命令就可以将 mp4 转换成 m3u8格式了。

  1. fmpeg -hide_banner -i ./720p_000.ts # 使用 ffmepg 查看一下切片信息,可以看到信息和上面命令指定的一样
  2. Input #0, mpegts, from './720p_000.ts':
  3.   Duration: 00:00:10.02, start: 0.060111, bitrate: 2095 kb/s
  4.   Program 1
  5.     Metadata:
  6.       service_name    : Service01
  7.       service_provider: FFmpeg
  8.     Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 24 fps, 24 tbr, 90k tbn, 48 tbc
  9.     Stream #0:1[0x101](und): Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, 5.1, fltp, 134 kb/s

参数 描述
-vf 后面是过滤器,scale 控制分辨率,这里让它变成保持原始比例的 720p 视频,yadif 让视频使用逐行扫描
-c:a -b:a -ar -ac -c:v 音频编码,音频码率,音频采样频率,音频通道数,视频码率
-b:v -maxrate -bufsize 码率,最大码率,缓存大小。设置 maxrate 和 -b:v不一样可以启动 VBR,设置 bufsize 是为了让码率分布更均匀,设置的越小检查的频率越高,画质越差。一般设置 maxrate 的一到两倍之间
pix_fmt 改变像素格式
level 编码等级,B站投稿最高等级是 4.1,再高有些设备可能播放会卡顿
profile:v 编码档次,有 baselinemain highhigh 质量更好,main 兼容性更好
preset h.264 预设,因为 h.264配置项太多,所有这里提供了几个预设值 ultrafastsuperfast veryfastfaster fast mediumslow slower veryslow设置的越高质量越好,但是编码速度就越慢,默认是 medium
crf 视频目标质量,0 表示无损,默认是 23,越
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/902827
推荐阅读
相关标签
  

闽ICP备14008679号