一、 HLS的架构

  • AV input:采集数据的麦克风和摄像头
  • Server:把采集到的多媒体数据进行编码、分隔,并生成播放列表
  • Distribution:CDN根据不同的节点和网络情况,分发不同的内容
  • Client:消费端,获取并解码观看视频

二、服务器的编码

2.1 视频

封装

  • 封装格式可以是 fMP4或者MPEG-2 TS,如果使用H265的编码格式,则封装格式必须是fMP4。

编码

  • 必须使用H264或者H265编码
  • H264的编码配置必须低于High Profile@Level 5.2
  • H265的编码配置必须低于Main 10 Profile@Level 5.1 High Tier
  • HDR HEVC视频格式必须是HDR10、HLG或者Dolby Vision
  • IDR帧应该两秒钟出现一次
IDR帧和I帧的区别是:IDR帧之后的P帧,不会参考IDR帧之前的帧;而I帧之后的P帧,可能会参考这个I帧之前的I帧
  • NTSC的视频应该是60或者59.94fps;PAL视频应该为50fps
  • 视频支持:23.976、24、25、29.97、30、50、59.94、60fps
  • 流应该使用同一个色彩空间,Rec601、Rec709或者Rec2020

码率

  • 对于WiFi环境,默认的视频码率应该为 2000kbps
  • 对于移动网络环境,默认的视频码率应该为 730 kbps

2.2 音频

音频编码格式

双声道

  • AAC-LC
  • HE-AAC v1
  • HE-AAC v2
  • xHE-AAC
  • Apple Lossless
  • FLAC
  • 只有双声道的多声道格式

如果码率在64kbit/s以上,就不应该用HE-AAC。

多声道

  • AAC-LC
  • HE-AAC v1
  • Apple Lossless
  • FLAC
  • Dolby Digital(AC-3)
  • Dolby Digital Plus(E-AC-3)
  • Dolby Digital Plus with Dolby Atmos

推荐的码率

声道数 格式 码率
2.0 AAC 32-160
2.0 xHE-AAC 24-160
2.0 Dolby Digital Plus 96-160
5.1 AAC 320
5.1 Dolby Digital 384
5.1 Dolby Digital Plus 192
7.1 Dolby Digital Plus 384
Nominally 16 Dolby Digital Plus with Dolby Atoms 384-768

2.3 媒体分割

  • 视频片段必须以IDR帧开头
  • 视频片段持续时间应该为6s;如果是29.97fps的NTSC视频,可以为6.006s
  • 媒体片段持续时间不能超过目标时间0.5s
  • 每个xHE-AAC片段都应该以即时播放帧(IPF)开始

三、播放列表

3.1 MIME类型

媒体类型 格式 MIME类型 扩展名
播放列表 HLS播放列表 application/vnd.apple.mpegurl m3u8
播放列表 M3U播放列表 audio/mpegurl m3u
视频 MPEG TS video/mp2t ts
媒体初始化 fMP4 video/mp4 mp4
视频或音频 fMP4 video/iso.segmeng或video/mp4 m4s
视频 fMP4 video/mp4 mp4
音频 MPEG TS video/mp2t ts
音频 fMP4 audio/mp4 mp4
音频 封装的音频 audio/aac aac
音频 封装的音频 audio/mpeg mp3
音频 封装的音频 audio/ac3 ac3
音频 封装的音频 audio/eac3 ec3
字幕 WebVTT text/plain vtt
字幕 IMSC1 applicaition/mp4 mp4

3.2 播放列表示例

基本的主播放列表,可以指定:

  • 语言
  • 媒体类型
  • 带宽
  • 编解码器
  • 分辨率
  • ……
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS#EXT-X-MEDIA:NAME=“English”,TYPE=AUDIO,GROUP-ID="audio-stereo-64",LANGUAGE="en",DEFAULT=YES,AUTOSELECT=YES,URI="english.m3u8"
#EXT-X-MEDIA:NAME="Français",TYPE=AUDIO,GROUP-ID="audio-stereo-64",LANGUAGE="fr",DEFAULT=NO,AUTOSELECT=YES,URI="french.m3u8"#EXT-X-STREAM-INF:BANDWIDTH=1123000,CODECS="avc1.64001f,mp4a.40.2",AUDIO="audio-stereo-64",RESOLUTION=620x334
video.m3u8#EXT-X-STREAM-INF:BANDWIDTH=8123000,CODECS="avc1.640028,mp4a.40.2",AUDIO="audio-stereo-64",RESOLUTION=1916x1032
video-hq.m3u8

有多个Codec的播放列表,可以指定不同编码器下的参数。

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS#EXT-X-MEDIA:NAME="English",TYPE=AUDIO,GROUP-ID="audio-stereo-64",LANGUAGE="en",DEFAULT=YES,AUTOSELECT=YES,URI="english.m3u8"
#EXT-X-MEDIA:NAME="Français",TYPE=AUDIO,GROUP-ID="audio-stereo-64",LANGUAGE="fr",DEFAULT=NO,AUTOSELECT=YES,URI="french.m3u8"#EXT-X-MEDIA:NAME="English",TYPE=AUDIO,GROUP-ID="audio-stereo-128",LANGUAGE="en",DEFAULT=YES,AUTOSELECT=YES,URI="english-hi.m3u8"
#EXT-X-MEDIA:NAME="Français",TYPE=AUDIO,GROUP-ID="audio-stereo-128",LANGUAGE="fr",DEFAULT=NO,AUTOSELECT=YES,URI="french-hi.m3u8"#EXT-X-STREAM-INF:BANDWIDTH=1123000,CODECS="avc1.64001f,mp4a.40.2", AUDIO="audio-stereo-64",RESOLUTION=620x334
video.m3u8#EXT-X-STREAM-INF:BANDWIDTH=8187000,CODECS="avc1.640028,mp4a.40.2", AUDIO="audio-stereo-128",RESOLUTION=1916x1032
video-hq.m3u8#EXT-X-STREAM-INF:BANDWIDTH=623000, CODECS="hvc1.1.6.L120.B0,mp4a.40.2",AUDIO="audio-stereo-64", RESOLUTION=620x334
hevc-video.m3u8#EXT-X-STREAM-INF:BANDWIDTH=4187000, CODECS="hvc1.1.6.L120.B0,mp4a.40.2",AUDIO="audio-stereo-128", RESOLUTION=1916x1032
hevc-video-hq.m3u8

四、兼容性和示例

4.1 兼容性

格式 macos兼容性 iOS兼容性 tvOS兼容性
TS流 10.7及以上 6及以上 9及以上
fMP4流 10.12及以上 10及以上 10及以上
HEVC 10.13及以上 11及以上 11及以上

4.2 示例的VOD

  • H264/H265 @ 30/60fps
  • H265视频码率
分辨率 码率
1080P 5.8 Mbps
1080P 4.5 Mbps
1080P 3.2 Mbps
720P 2.4 Mbps
540P 1.7 Mbps
…… ……
  • H264视频码率
分辨率 码率
1080P 7.8 Mbps
1080P 6.0 Mbps
1080P 4.5 Mbps
720P 3.0 Mbps
540P 2.0 Mbps
…… ……
  • 音频
格式 声道 码率
AAC-LC 48kHz 双声道 160kbps
AC-3 48kHz 5.1声道 384kbps
EC-3 48kHz 5.1声道 192kbps
  • 字幕

Apple Http Live Stream相关推荐

  1. 利用Intel Media SDK产生适合Apple Http live stream的流

    1,使用Intel Media SDK Encoder或者Transcode代码产生H.264数据 2,使用Intel IPP muxer产生mpeg-ts封包的数据包 3,使用简单程序生成.m3u8 ...

  2. Effective Java~46. 优先选择Stream 中无副作用的函数

    纯函数(pure function)的结果仅取决于其输入:它不依赖于任何可变状态,也不更新任何状态. 坏味道 // Uses the streams API but not the paradigm- ...

  3. java8 stream 做累加_《Java 8 in Action》Chapter 1:为什么要关心Java 8

    自1998年 JDK 1.0(Java 1.0) 发布以来,Java 已经受到了学生.项目经理和程序员等一大批活跃用户的欢迎.这一语言极富活力,不断被用在大大小小的项目里.从 Java 1.1(199 ...

  4. java8 Lambda Stream collect Collectors 常用实例

    将一个对象的集合转化成另一个对象的集合 List<OrderDetail> orderDetailList = orderDetailService.listOrderDetails(); ...

  5. java8中的流(Stream)

    流式编程爱 撸码就是快,流式编程好 代码传家宝 Stream API 概念: Stream 流处理,首先要澄清的是 java8 中的 Stream 与 I/O 流 InputStream 和 Outp ...

  6. Apple FairPlay DRM及其工作原理

    翻译.编辑:Alex 技术审校:刘姗 本文来自OTTVerse,作者为Krishna Rao Vijayanagar. ▲扫描图中二维码了解音视频技术大会更多信息__▲ Easy-Tech #020# ...

  7. Java8 用法优雅的函数式编程与stream,看这一篇就够了!

    Java 不支持单独定义函数,但可以把静态方法视为独立的函数,把实例方法视为自带 this 参数的函数. Java 平台从 Java 8 开始,支持函数式编程.函数式编程(Functional Pro ...

  8. java8 .stream().map().collect() 的用法

    API: https://www.runoob.com/java/java8-streams.html mylist.stream().map(myfunction->{return item; ...

  9. JAVA8新特性之Stream流分组

    Apple apple01 = new Apple(1, "red", 100, "成都");Apple apple02 = new Apple(2, &quo ...

最新文章

  1. 车道线检测:几何约束联合车道分割和车道边界检测
  2. 【The final】软件工程实践总结
  3. 开发日记-20190622 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  4. 周报措辞规范(周报规范用语、不规范用语)
  5. vue xxx was assigned to but it has no setter.
  6. spring循环依赖及解决方式_来探究一下Spring 循环依赖的三种方式
  7. MarkdownPad2安装Awesomium SDK-Windows官方链接
  8. 怎么安装mapinfo破解和符号库
  9. 通过ROBOCOPY工具快速删除文件夹
  10. 骇客学堂:网络入侵检测初步探测方法
  11. 从bam中截取指定位置的 reads 或深度
  12. CrystalQuartz实现Quartz的window服务的远程管理
  13. SIM7600CE模块UART设计指南
  14. read write file
  15. 关于@Value读不到配置文件内容的问题
  16. [转]计算机视觉入门
  17. MATLAB第2次作业,matlab作业二
  18. [hive]hive加载本地数据,然后删除了本地数据也删除了表,这时可以在hdfs垃圾箱找到
  19. js-对象属性是否全部为空
  20. 计算机英语四级考试报名,大学英语四级报名

热门文章

  1. python中turtle画小草_python
  2. 第8章、注意力机制与外部记忆
  3. 搜狗推出明医搜索,您怎么看?
  4. CRF条件随机场模型笔记
  5. 众昂矿业:萤石与医药
  6. Unity_YM_拼图2
  7. 【C语言】初识二级指针
  8. NT平台拨号连接密码恢复原理
  9. java大麦_大麦大 - SegmentFault 思否
  10. echart js导出excel_echarts 导出excel