引言与效果演示

-----------------------------------------

FFmpeg431的官方地址已经无法打开,

我将ffmepg4.3.1的开发包和源码上传到了百度云:

链接:https://pan.baidu.com/s/1-3xSO6ytyQLlSId0Xiak4w

提取码:fyxy

------------------------------------------

音视频是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢?

因为没有学习音视频的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。

所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。

切片命令行:

ffmpeg -i ande_302.mp4 -fflags flush_packets -max_delay 2 -flags -global_header -hls_time 5

-hls_list_size 0 -vcodec libx264 -acodec aac -r 30  -g 60 -y index.m3u8

HLS是什么

HTTP Live Streaming(缩写是HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。

是苹果公司QuickTime X和iPhone软件系统的一部分。

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

在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8)playlist文件,用于寻找可用的媒体流。HLS只请求基本的HTTP报文,与实时传输协议(RTP)不同,HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。

在服务器端,流媒体文件被切割成一个一个的小分片,这些小分片有着相同的时长(常用10s),每一个小分片是一个ts文件。同时 产生一个索引文件(m3u8),索引文件里存放了ts文件的URL。

客户端请求方式分两种,一种是点播(vod),一种是直播(live)

Video  on demand:视频点播,有求才播放

vod:客户端一次获取整个m3u8文件,按照里面的URL获取ts文件,采用HTTP协议。

live:由于M3u8文件时实时更新的,所以客户端每隔一段时间获取m3u8文件,再根据里面的URL获取ts文件,采用HTTP协议。

RTMP指Adobe的RTMP(Realtime Message Protocol),广泛应用于低延时直播,也是编码器和服务器对接的实际标准协议,在PC(Flash)上有最佳观看体验和最佳稳定性。

HLS指Apple的HLS(Http Live Streaming),本身就是Live(直播)的,不过Vod(点播)也能支持。

HLS是Apple平台的标准流媒体协议,和RTMP在PC上一样支持得天衣无缝。

HLS协议简介

HLS全称为HTTP Live Streaming,是苹果公司提出的基于HTTP的流媒体网络传输协议。它的工作原理是把整个媒体流分成一个个小的基于HTTP的媒体分片来下载,每次只下载一些分片。在开始一个流媒体会话时,客户端会下载一个包含媒体分片的索引文件,即extended M3U playlist文件(m3u8),用于寻找可用的媒体分片。

HLS中,索引文件可以嵌套,一般只有一级索引和二级索引;媒体流封分片装格式只支持MPEG-2传输流(ts)、WebVTT [WebVTT]文件或Packed Audio文件。

下图为索引文件(m3u8)和媒体分片(ts)之间的关系图:一级m3u8嵌套二级m3u8,二级m3u8描述ts分片。

HLS总体架构

1、 服务器将媒体文件转换为m3u8及ts分片;对于直播源,服务器需要实时动态更新。

2、 客户端请求m3u8文件,根据索引获取ts分片;点播与直播服务器不同的地方是, 直播的 m3u8 文件会不断更新,而点播的 m3u8 文件是不会变的,只需要客户端在开始时请求一次即可。

客户端与服务器通过HTTP协议进行交互,以两级m3u8嵌套为例,客户端先GET请求到一级m3u8,一级m3u8里面包含了服务器端可以用于传播的一个或多个不同带宽的URL,这URL可以获取到二级m3u8;二级m3u8包含了多个ts分片的duration及其URL,最后带过这个URL下载ts分片。

交互方式如下:

HLS优势及劣势

优势:

客户端支持简单,只需要支持 HTTP 请求即可,HTTP 协议无状态,只需要按顺序下载媒体片段即可。

使用 HTTP 协议网络兼容性好,HTTP 数据包也可以方便地通过防火墙或者代理服务器。

当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源(多码流自适应),允许流媒体会话适应不同的数据速率。

劣势:

因其自身的实现方式,HLS存在延迟(最少有一个分片),对于直播等实时敏感的场景,体验不好。

HLS主要的应用场景

跨平台:PC主要的直播方案是RTMP,也有一些库能播放HLS,譬如jwplayer,基于osmf的hls插件也一大堆。所以实际上如果选一种协议能跨 PC/Android/IOS,那就是HLS。

IOS上苛刻的稳定性要求:IOS上最稳定的当然是HLS,稳定性不差于RTMP在PC-flash上的表现。

友好的CDN分发方式:目前CDN对于RTMP也是基本协议,但是HLS分发的基础是HTTP,所以CDN的接入和分发会比RTMP更加完善。能在各种CDN之间切换,RTMP也能,只是可能需要对接测试。

简单:HLS作为流媒体协议非常简单,apple支持得也很完善。Android对HLS的支持也会越来越完善。至于DASH/HDS,好像没有什么特别的理由,就像linux已经大行其道而且开放,其他的系统很难再广泛应用。

总之,SRS支持HLS主要是作为输出的分发协议,直播以RTMP+HLS分发,满总各种应用场景。点播以HLS为主。

M3U8详解

HLS协议很大一部分内容即是对M3U8文本协议的描述。

简介

M3U8即播放索引文件,也称为Playlist,是由多个独立行组成的文本文件,必须通过 URI(.m3u8 或 .m3u) 或者 HTTP Content-Type 来识别(application/vnd.apple.mpegurl 或 audio/mpegurl)。

每行由用 \n 或者 \r\n来标识换行。每一行可以是一个URI、空白行或是一个 以# 号开头的字符串。

以 # 开头的是 tag 或者注释,以 #EXT 开头的是 tag, 其余的为注释, 在解析时应该忽略。URI 表示一个ts分片地址或是Playlist地址。URI 可以用绝对地址或者相对地址,如果使用相对地址,那么是相对于当前Playlist的地址。

有些tag带有属性值,多个属性用逗号分隔。

常见的m3u8文件如下所示:

一级m3u8:

#EXTM3U

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=700,000

http://xxx.itv.cmvideo.cn/low.m3u8?channel-id=bstvod&Contentid=4007432528

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1300,000

http://xxx.itv.cmvideo.cn/mid.m3u8?channel-id=bstvod&Contentid=4007432527

#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2300,000

http://xxx.itv.cmvideo.cn/high.m3u8?channel-id=bstvod&Contentid=4007432526

二级m3u8:

#EXTM3U

#EXT-X-VERSION:1

#EXT-X-TARGETDURATION:11

#EXT-X-MEDIA-SEQUENCE:19674922

#EXT-X-PROGRAM-DATE-TIME:2019-03-28T04:33:40Z

#EXTINF:10,

19674922.ts?

#EXT-X-PROGRAM-DATE-TIME:2019-03-28T04:33:50Z

#EXTINF:10,

19674923.ts?

#EXT-X-PROGRAM-DATE-TIME:2019-03-28T04:34:00Z

#EXTINF:10,

19674924.ts?

tag说明

名词说明:

1、 Media Playlist:二级m3u8,携带ts分片url的m3u8;

2、 Master Playlist:一级m3u8;

3、 Media Segment:ts分片

4、 Attribute Lists:属性列表

Attribute Lists :

• 有的 tags 的值带有 Attribute Lists。

• 一个 Attribute List是一个用逗号分隔的 attribute/value 对列表。

• 格式为: AttributeName=AttributeValue。

tag以#EXT开头,主要分为以下几类:

1) Basic Tags

Basic Tags 可以用在 Media Playlist 和 Master Playlist 里面。

• EXTM3U: 必须在文件的第一行, 标识是一个 Extended M3U Playlist 文件。

• EXT-X-VERSION: 表示 Playlist 兼容的版本。

2) Media Segment Tags

每一个 Media Segment 通过一系列的 Media Segment tags 跟一个 URI 来指定。有的 Media Segment tags 只应用于下一个 segment, 有的则是应用所有下面的 segments。

一个 Media Segment tag 只能出现在 Media Playlist 里面。

• EXTINF: 用于指定 Media Segment 的 duration。

• EXT-X-BYTERANGE: 用于指定 URI 的 sub-range。

• EXT-X-DISCONTINUITY: 表示后续分片属性发生变化,如文件格式/编码/序号。

• EXT-X-KEY: 表示Media Segment 已加密,该值用于解密。

• EXT-X-MAP: 表示Media Segment的头部信息,比如PAT/PMT 或者WebVTT头。

• EXT-X-PROGRAM-DATE-TIME: 和 Media Segment 的第一个sample一起来确定时间戳。

3)Media Playlist Tags

Media Playlist tags 描述 Media Playlist 的全局参数。 同样地, Media Playlist tags 只能出现在 Media Playlist 里面。

• EXT-X-TARGETDURATION: 用于指定最大的 Media Segment duration。

• EXT-X-MEDIA-SEQUENCE: 用于指定第一个 Media Segment 的序号。

• EXT-X-DISCONTINUITY-SEQUENCE: 用于不同 Variant Stream 之间同步。

• EXT-X-ENDLIST: 表示Media Playlist结束。

• EXT-X-PLAYLIST-TYPE: 可选, 指定整个 Playlist 的类型。

• EXT-X-I-FRAMES-ONLY: 表示每个 Media Segment 均为I-frame。

4)Master Playlist Tags

Master Playlist tags 定义 Variant Streams, Renditions 和其他显示的全局参数。 Master Playlist tags 只能出现在 Master Playlist 中。

• EXT-X-MEDIA: 用于关联同一个内容的多个 Media Playlist 的多种翻译。

• EXT-X-STREAM-INF:用于指定下级Media Playlist相关属性。

• EXT-X-I-FRAME-STREAM-INF:与EXT-X-STREAM-INF类似,但指向的下级Media Playlist包含Media Segment均为I-frame。

• EXT-X-SESSION-DATA: 可以随意存放一些 session 数据。

5) Media or Master Playlist Tags

这里的 tags 可以出现在 Media Playlist 或者 Master Playlist 中。 但是如果同时出现在同一个 Master Playlist 和 Media Playlist 中时, 必须为相同值。

• EXT-X-INDEPENDENT-SEGMENTS: 表示每个 Media Segment 可以独立解码。

• EXT-X-START: 标识一个优选的点来播放这个 Playlist。

HLS协议详解

HLS是提供一个m3u8地址:

Apple的Safari浏览器直接就能打开m3u8地址,譬如:

http://demo.srs.com/live/livestream.m3u8

Android不能直接打开,需要使用html5的video标签,然后在浏览器中打开这个页面即可,譬如:

<!-- livestream.html -->

<video width="640" height="360"

autoplay controls autobuffer

src="http://demo.srs.com/live/livestream.m3u8"

type="application/vnd.apple.mpegurl">

</video>

PC:video.js

HLS协议规定

视频的封装格式是TS。

视频的编码格式为H264,音频编码格式为MP3、AAC或者AC-3。

除了TS视频文件本身,还定义了用来控制播放的m3u8文件(文本文件)。

HLS协议说明

HLS的m3u8,是一个ts的列表,也就是告诉客户端或浏览器可以播放这些ts文件,譬如:

#EXTM3U

#EXT-X-VERSION:3

#EXT-X-ALLOW-CACHE:YES

#EXT-X-TARGETDURATION:13

#EXT-X-MEDIA-SEQUENCE:430

#EXT-X-PLAYLIST-TYPE:VOD

#EXTINF:11.800

news-430.ts

#EXTINF:10.120

news-431.ts

#EXT-X-DISCONTINUITY

#EXTINF:11.952

news-430.ts

#EXTINF:12.640

news-431.ts

#EXTINF:11.160

news-432.ts

#EXT-X-DISCONTINUITY

#EXTINF:11.751

news-430.ts

#EXTINF:2.040

news-431.ts

#EXT-X-ENDLIST

EXTM3U

每个M3U文件第一行必须是这个tag,提供标示作用

EXT-X-VERSION

用以标示协议版本。这里是3, 那么这里用的就是HLS协议第三个版本,此标签只能有0或1个,不写代表使用版本1

EXT-X-TARGETDURATION

所有切片的最大时长,有些Apple设备这个参数不正确会无法播放。

EXT-X-MEDIA-SEQUENCE

切片的开始序号。每一个切片都有唯一的序号,相邻之间序号+1。这个编号会继续增长,保证流的连续性。

EXTINF

ts 切片的实际时长。duration : 媒体持续时间

#EXTINF <duration>,<title>

EXT-X-PLAYLIST-TYPE

类型,vod 表示点播 ,live:直播。

EXT-X-ENDLIST

文件结束符号。表示不再向播放列表文件添加媒体文件。

HLS补充说明

bandwidth指定视频流的比特率,PROGRAM-ID无用无需关注,每一个#EXT-X-STREAM-INF的下一行是二级index文件的路径,可以用相对路径也可以用绝对路径。

例子中用的是相对路径。这个文件中记录了不同比特率视频流的二级index文件路径,客户端可以自己判断自己的现行网络带宽,来决定播放哪一个视频流。

也可以在网络带宽变化的时候平滑切换到和带宽匹配的视频流。

二级文件实际负责给出ts文件的下载地址,这里同样使用了相对路径。#EXTINF表示每个ts切片视频文件的时长。#EXT-X-TARGETDURATION指定当前视频流中的切片文件的最大时长,也就是说这些ts切片的时长不能大于#EXT-X-TARGETDURATION的值。

#EXT-X-PLAYLIST-TYPE:VOD的意思是当前的视频流并不是一个直播流,而是点播流,换句话说就是该视频的全部的ts文件已经被生成好了,#EXT-X-ENDLIST这个表示视频结束,有这个标志同时也说明当前的流是一个非直播流。

播放模式

点播VOD的特点就是当前时间点可以获取到所有index文件和ts文件,二级index文件中记录了所有ts文件的地址。这种模式允许客户端访问全部内容。上面的例子中就是一个点播模式下的m3u8的结构。

Live 模式就是实时生成M3u8和ts文件。它的索引文件一直处于动态变化的,播放的时候需要不断下载二级index文件,以获得最新生成的ts文件播放视频。如果一个二级index文件的末尾没有#EXT-X-ENDLIST标志,说明它是一个Live视频流。

客户端在播放VOD模式的视频时其实只需要下载一次一级index文件和二级index文件就可以得到所有ts文件的下载地址,除非客户端进行比特率切换,否则无需再下载任何index文件,只需顺序下载ts文件并播放就可以了。

但是Live模式下略有不同,因为播放的同时,新ts文件也在被生成中,所以客户端实际上是下载一次二级index文件,然后下载ts文件,再下载二级index文件(这个时候这个二级index文件已经被重写,记录了新生成的ts文件的下载地址),再下载新ts文件,如此反复进行播放。

TS文件

ts文件为传输流文件(MPEG2 - tranport stream),

视频编码主要格式h264/mpeg4,音频为acc/MP3。

ts文件分为三层:

ts层Transport Stream、pes层 Packet Elemental Stream、es层 Elementary Stream.

es层就是音视频压缩数据,pes层是在音视频数据es上加了时间戳(pts,dts)等对数据帧的说明信息,ts层就是在pes层加入数据流的识别和传输必须的信息

Rtp:real time protocol, rtcp

ts层

ts包大小固定为188字节,ts层分为三个部分:ts header、adaptation field、payload。ts header固定4个字节;adaptation field可能存在也可能不存在,主要作用是给不足188字节的数据做填充;payload是pes数据。

pes层

pes层是在每一个视频/音频帧上加入了时间戳等信息,pes包内容很多,我们只留下最常用的。

es层

es层指的就是音视频数据,我们只介绍h.264视频。

h.264视频:

打包h.264数据我们必须给视频数据加上一个nalu(Network Abstraction Layer unit),

nalu包括nalu header和nalu type,

nalu header固定为0x00000001(帧开始)或0x000001(帧中)。

h.264的数据是由slice组成的,slice的内容包括:视频、sps、pps等。

nalu type决定了后面的h.264数据内容。

大家好,我的第一本书正式出版了,可以在京东各大店铺抢购哦。

《FFmpeg入门详解--音视频原理及应用:梅会东:清华大学出版社》

京东自营链接:https://item.jd.com/13377793.html
京东其它链接:https://search.jd.com/Search?keyword=FFmpeg%E5%85%A5%E9%97%A8%E8%AF%A6%E8%A7%A3--%E9%9F%B3%E8%A7%86%E9%A2%91%E5%8E%9F%E7%90%86%E5%8F%8A%E5%BA%94%E7%94%A8&enc=utf-8&suggest=1.his.0.0&wq=&pvid=24e80535073b4e1f98e30a3e6963fe81

 

出书过程非常艰辛,来回校正了好几遍,后续还有FFmpeg系列的其它图书。

第一本:FFmpeg入门详解--音视频原理及应用--梅会东--清华大学出版社

第二本:FFmpeg入门详解--流媒体直播原理及应用--梅会东--清华大学出版社

第三本:FFmpeg入门详解--命令行及音视频特效原理及应用--梅会东--清华大学出版社

第四本:FFmpeg入门详解--SDK二次开发及直播美颜原理及应用--梅会东--清华大学出版社

===================================

FFmpeg入门详解之87:HLS直播协议详解相关推荐

  1. FFmpeg入门详解之102:HLS直播协议详解

    引言与效果演示 ----------------------------------------- FFmpeg431的官方地址已经无法打开, 我将ffmepg4.3.1的开发包和源码上传到了百度云: ...

  2. TCP-IP协议详解(5) 我尽力(IP协议详解)

    在粗略了解了IP接力和IP地址后,我们再反过来,看一看IP协议的具体细节和设计哲学. IPv4与IPv6头部的对比 我们已经在IP接力中介绍过,一个IP包分为头部(header)和数据(payload ...

  3. 【详解】URL及HTTP协议详解

    目录 1 URL(Uniform Resoure Locator) 2 HTTP协议 3 HTTP请求和响应报文 4 查看HTTP协议的通信过程 1 URL(Uniform Resoure Locat ...

  4. 实时监控、直播流、流媒体、视频网站开发方案流媒体服务器搭建及配置详解:使用nginx搭建rtmp直播、rtmp点播、,hls直播服务配置详解

    注意:这里不会讲到nginx流媒体模块如何安装的问题,只研究rtmp,hls直播和录制相关的nginx服务器配置文件的详细用法和说明.可以对照这些命令详解配置nginx -rtmp服务 一.nginx ...

  5. ffmpeg入门教程

    文章目录 首先推荐几本必参考的书 视频播放器原理 博客 我的博客 欢迎联系.指正.批评 首先推荐几本必参考的书 <FFmpeg从入门到精通>,命令行居多 <FFmpeg基础库编程开发 ...

  6. 单机十万并发HLS直播服务器的防盗链技术

    单机十万并发HLS直播服务器的防盗链技术 本文主要介绍基于HLS直播服务器的十万并发防盗链实现 录制切片服务器 HTTP 服务器 (nginx) LuaLib 录制切片服务器 录制切片服务器负责把直播 ...

  7. FFmpeg入门详解之83:流媒体与直播技术

    流媒体 流媒体又叫流式媒体,它是指商家用一个视频传送服务器(比如:vlc)把节目(比如:ande10.mp4)当成数据包发出,传送到网络上.用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显 ...

  8. FFmpeg入门详解之116:rtsp live555摄像头直播

    rtsp+live555摄像头直播 Live555直播流程简介与演示 第一步,读取摄像头数据 第二步,x264编码 第三步,扩展live555 第四步,vlc或ffplay播放 ffplay -sta ...

  9. FFmpeg入门详解之109:m3u8加密--HLS 架构简介及播放加密的HLS

    HLS 概述 HLS 全称是 HTTP Live Streaming, 是一个由 Apple 公司实现的基于 HTTP 的媒体流传输协议. 他跟 DASH 协议的原理非常类似. 通过将整条流切割成一个 ...

最新文章

  1. Swift解读专题四——字符串与字符
  2. mnn linux编译
  3. 【BZOJ-1458】士兵占领 最大流
  4. Tensorflow Summary: 查看Tensorflow Model pb格式模型的信息
  5. java+分支合并主线_git如何合并两个远端分支?
  6. UWP_小说在线阅读器:功能要求与技术要求
  7. cad页面布局快捷键_cad布局窗口快捷键
  8. Android开发——监听Android手机的网络状态
  9. Acer宏碁笔记本触摸板失效解决方法
  10. 瘟疫公司中国版(Android)手动破解内购
  11. SVG不能铺满的问题
  12. 有关上传到APPStore上iphone5,5c,4s下载应用,出现该APP与设备不兼容问题
  13. 如何实现 Linux + Windows 双系统启动
  14. IDEA报错:不支持发行版本
  15. R语言中描述统计量的多种方法
  16. android七牛多张图片上传
  17. linux 命令 修改密码,一条命令修改Linux密码
  18. Python解码JS的encodeURIComponent并转化JSON
  19. wifi安全模式是什么_WIFI的完整形式是什么?
  20. 互联网金融:十大信息安全风险与十大最佳安全实践(转载)

热门文章

  1. Nmap扫描原理与用法
  2. 使用CommandArgument查找数据表行的数据库表record_id
  3. 实验楼楼赛19之备份日志文件
  4. Linux 下使用 rar 进行压缩和解压缩
  5. Linux下置空文件的方法小结
  6. excel 复制数据 sql server 粘贴_一个Excel妙招,一个SQL技巧,解决批量数据插入问题
  7. iphone工作原理
  8. 解析教育培训类app开发所面临的挑战
  9. 基于openpose的用户姿势识别
  10. Spring Boot问题之JSP无法显示Could not resolve view with name ‘xxxx‘ in servlet with name ‘dispatcherServlet