基于HLS协议、FFmpeg切片实现的播控系统

HLS概述:

HLS是HTTP Live Streaming的简称,是苹果公司提出的基于HTTP的流媒体网络传输协议,它的基本原理也是服务端把文件或媒体流按照合适的码率切分成一个个小片段进行传输,客户端在播放码流时,选择合适码率的码流进行下载播放。在传输会话开始时,客户端首先需要下载描述不同码流元数据的M3U8索引文件。

组件模型

HTTP Live Streaming由三个部分组成:服务器组件,分发组件和客户端软件。

服务器组件(Server Component)

服务器组件负责获取媒体的输入流并对其进行数字编码。它以适合交付的格式封装它们,并准备封装的媒体以进行分发。

对于现场事件,服务器需要媒体编码器进行转码、切片、存储,以及一种将编码的媒体拆分为片段并将其保存为文件的方法,该方法使用FFmpeg开源媒体框架实现。

ffmpeg -i http://XXX.XXX.XXX.XXX:5000/nn_live.ts?id=CCTV1 -c copy -map 0:0 -map 0:1 -f segment -segment_list /data/Live/CCTV-1HD/playlist.m3u8 -segment_time 8 -segment_start_number 9479305 -segment_list_size 5 /data/Live/CCTV-1HD/%010d.ts

i参数:i表示input输入,代表我要输入什么样的文件 或流给ffmpeg

c参数:是codec,编解码器的意思,告诉ffmpeg接下来用什么编码器、解码器。"-c copy"是“-c”参数的一种很经常的用法,顾名思义,复制照抄输入文件原来的编解码器所做的事。那ffmpeg舒服了,不用自己再来做编解码什么的。所以,这就是为什么转码可以这么快的原因。

map参数 -map file:stream 设置输入流映射

-map 0:0 第一个输入文件的第一个流 (视频流)

-map 0:1 第一个输入文件的第二个流 (音频流)

-map 0:2 第一个输入文件的第二个流 (字幕流)

-f segment ,ffmpeg 切分视频文件,前面加 -c copy 是为了避免重新编解码,加快切分速度。

-segment_list m3u8 文件输出位置

-segment_time 每个切片的视频时长,单位s

-segment_start_number 设置片断开始序号,默认为0

-segment_list_size 对列表数量进行控制在5个,这会将最后5个保留在播放列表文件中

分配组件(Distribution Component)

CDN分发系统是Web服务器或Web缓存系统,可通过HTTP将媒体文件和索引文件传递给客户端。不需要自定义服务器模块即可交付内容,并且通常在Web服务器上只需要很少的配置。要实际部署HTTP Live Streaming,您需要为浏览器或客户端应用程序创建WEB服务器,提供HTTP播放地址。

将通过FFmpeg转码切片存储好的TS与M3U8文件分发到离客户端最近的CDN节点上。

客户端软件(Client Software)

客户端软件负责确定要请求的适当媒体,下载这些资源,然后重新组合它们,以便可以将媒体连续地呈现给用户。

HLS直播地址格式

http://111.23.xxx.xxx:20900//Live/CCTV12/shift.m3u8可以在支持HLS协议的播放器上播放

HTTP获取M3U8文件

HTTP获取TS文件:

项目

释义

Audio/Video inputs

视频源可以是任意格式,可以是离线文件或实时码流

Media encoder

将视频源中的视频数据转码到目标编码格式(H264)的视频数据

stream segmenter

对编码后的视频进行切片,视频会被转换成HLS格式的视频(即TS和m3u8文件)

index file

索引文件,后缀以".m3u8"结尾的文件

ts

缓存内容,后缀以".ts"结尾的文件

http

传输协议

格式解析

项目

释义

网络协议

HTTP

封装格式

TS

编码格式

H264、AAC

索引文件

M3U8

播放模式

点播VOD:

点播特点就是当前时间点可以获取到所有M3U8文件和ts文件,这种模式允许客户端访问全部内容。

直播LIVE:

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

客户端在播放VOD模式的视频时其实只需要下载一次index文件就可以得到所有ts文件的下载地址,除非客户端进行比特率切换,否则无需再下载任何index文件,只需顺序下载ts文件并播放就可以了。但是Live模式下略有不同,因为播放的同时,新ts文件也在被生成中,所以客户端实际上是下载一次index文件,然后下载ts文件,再下载index文件(这个时候这个index文件已经被重写,记录了新生成的ts文件的下载地址),再下载新ts文件,如此反复进行播放。

猜你喜欢

转载自blog.csdn.net/bing_goo/article/details/128682607
今日推荐