流媒体分发之HLS

  • 什么是流媒体
  • 采用流媒体技术的优势有哪些
  • 流媒体的分发协议 RTMP与HLS
    • RTMP
    • HLS
    • RTMP与HLS的对比
  • HLS文件分片
    • ffmpeg分片
    • M3U8文件
    • M3U8文件播放
  • 拓展: 实现自己的m3u8浏览器播放器

什么是流媒体

流媒体(Streaming Media)技术是指将一连串的媒体数据压缩后,以流的方式在网络中分段传送,实现在网络上实时传输影音的一种技术。
以上是网上对于流媒体的定义,其实简单来说,流媒体就是将媒体文件(音频、视频、图片、文本、动画)压缩之后分段从服务器分发到客户端。

采用流媒体技术的优势有哪些

  • 实时流传输,可以用来实现直播、点播等功能。
  • 节省流量(客户端与服务端),尤其是在播放音视频文件时,不需要下载整个文件,当获取到首片文件即可开始播放,并且分片文件的体积往往是非常小的。
  • 适用文件类型广,支持的服务器多。

流媒体的分发协议 RTMP与HLS

RTMP

RMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。RTMP协议是应用层协议,是要靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建立完成后,RTMP协议也要客户端和服务器通过“握手”来建立基于传输层链接之上的RTMP Connection链接,在Connection链接上会传输一些控制信息,如SetChunkSize,SetACKWindowSize。

HLS

HTTP Live Streaming(缩写是HLS)是一个由Apple提出的基于HTTP的流媒体网络传输协议。是苹果公司QuickTime X和iPhone软件系统的一部分。它的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U (m3u8)playlist文件,用于寻找可用的媒体流。

HLS协议的文件系统:

  • 视频的封装格式是TS。
  • 视频的编码格式为H264,音频编码格式为MP3、AAC或者AC-3。
  • 除了TS视频文件本身,还定义了用来控制播放的m3u8文件(文本文件,可以理解为索引文件或目录)

RTMP与HLS的对比

  • RTMP将一整条数据流封装成FLV进行传输,在服务器不会有落地文件
  • RTMP基于TCP长连接,不需要多次建连,实时性好,延时通常为 1-3s
  • RTMP协议比起HTTP复杂很多,导致性能下降
  • HLS提前将媒体文件压缩、分片、存储在服务器上,并生成M3U8索引文件
  • HLS需要拉取M3U8文件中的分片文件,实时性差,延时通常在10S以内
  • HLS内容发布服务更简单,对系统设备要求较低,更容易实现负载均衡,并且HLS是无状态协议的HTTP,客户端只需要下载即可

总结一下: 直播建议用RTMP,点播建议用HLS

HLS文件分片

我们使用目前使用较为普遍的ffmpeg工具包进行文件的分片操作。

ffmpeg分片

1.hls方式

ffmpeg -i input_file -c:a aac -hls_time 10 -hls_list_size 0  -strict -2 -f hls out.m3u8

示例:
ffmpeg -i NUMB.flac -c:a aac -hls_time 10 -hls_list_size 0 -strict -2 -f hls NUMB.m3u8

2.segment方式

ffmpeg -i input_file -map 0 -codec:v libx264 -codec:a aac -f ssegment -segment_list out.m3u8 -segment_time 10 out%03d.ts

示例:
ffmpeg -i NUMB.flac -map 0 -codec:v libx264 -codec:a aac -f ssegment -segment_list NUMB.m3u8 -segment_time 10 NUMB%03d.ts

M3U8文件

我们使用文本编辑器打开一个M3U8文件,里面包含了索引文件的声明、版本、切片文件的时长控制、切片文件列表、切片长度等信息

  • #EXTM3U:每个M3U文件第一行必须是这个tag。
  • #EXT-X-VERSION此属性可用可不用。
  • #EXT-X-TARGETDURATION定义每个TS的最大duration。
  • #EXT-X-ALLOW-CACHE是否允许cache。
  • #EXT-X-MEDIA-SEQUENCE定义当前M3U8文件中第一个文件的序列号,每个ts文件在M3U8文件中都- 有固定唯一的序列号,该序列号用于在MBR时切换码率进行对齐。
  • #EXT-X-KEY定义加密方式,用来加密的密钥文件key的URL,加密方法(例如AES-128),以及IV加密向量。
  • #EXT-X-DISCONTINUITY当遇到该tag的时候说明这些属性发生了变化,例如file format,加密方式等。
  • #EXTINF:指定每个媒体段(ts文件)的持续时间,这个仅对其后面的TS链接有效,每两个媒体段(ts文件)间被这个tag分隔开。其格式可以是#EXTINF:,duration表示持续的时间(秒),如果协议版本小于3则duration必须为整数,否则可以是浮点数。
  • #EXT-X-ENDLIST表明M3U8文件的结束。live m3u8没有此tag。
  • #EXT-X-STREAM-INF不同带宽适配的不同码率的视频列表路径。其有一个主要参数BANDWIDTH表示每个媒体文件比特速率的上限,单位为每秒bit数。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.007800,
index0.ts
#EXTINF:10.007800,
index1.ts
#EXTINF:9.984589,
index2.ts
#EXTINF:10.007800,
index3.ts
#EXTINF:10.007800,
index4.ts
#EXTINF:9.984578,
index5.ts
#EXTINF:10.007800,
index6.ts
#EXTINF:10.007800,
index7.ts
#EXTINF:9.984578,
index8.ts
#EXTINF:10.007800,
index9.ts
#EXTINF:10.007800,
index10.ts
#EXTINF:9.984589,
index11.ts
#EXTINF:10.007800,
index12.ts
#EXTINF:10.007800,
index13.ts
#EXTINF:9.984578,
index14.ts
#EXTINF:10.007800,
index15.ts
#EXTINF:10.007800,
index16.ts
#EXTINF:9.984578,
index17.ts
#EXTINF:10.007800,
index18.ts
#EXTINF:10.007800,
index19.ts
#EXTINF:9.984578,
index20.ts
#EXTINF:10.007811,
index21.ts
#EXTINF:10.007800,
index22.ts
#EXTINF:9.984578,
index23.ts
#EXTINF:10.007800,
index24.ts
#EXTINF:10.007800,
index25.ts
#EXTINF:9.984578,
index26.ts
#EXTINF:10.007800,
index27.ts
#EXTINF:4.229844,
index28.ts
#EXT-X-ENDLIST

M3U8文件播放

1.本地播放
可以选择相应的视频音频播放器直接打开m3u8文件即可,这里因为电脑上恰好有PotPlayer播放器,因此以PotPlayer播放器为例。

2.网络播放
使用支持m3u8流的播放器、在线播放器、甚至浏览器地址栏可以直接播放m3u8文件链接。
HLS由Apple开发,所以apple的设备原生支持,之后Android等平台也陆续进行了支持。
示例:
这里将一个mp4视频文件切片后,将m3u8与ts文件上传到我的七牛云,之后获取远程地址通过浏览器在线播放。
第一个文件是m3u8文件,以下为ts切片文件。

①在safari中可以直接播放

②在网络播放器播放(可以很明显看到只加载了第一段视频即可播放)

③在本地浏览器直接播放

拓展: 实现自己的m3u8浏览器播放器

这里使用video来进行实现,新版本的video.js 7之后版本不需要依赖hls组件也可以支持m3u8文件
附上DEMO源码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><link href="/css/video-js.min.css" rel="stylesheet"><script src="/js/video.min.js"></script><title>M3U8在线播放器</title><style type="text/css">#videoDiv {text-align: center;}</style>
</head><body><div id="videoDiv"><video id="myVideo" class="video-js" controls autoplay preload="auto" width="848" height="480" data-setup="{}"><sourcesrc="http://image.xxxxxxxxx.com/00C26348C70BF56886B1809A16157003/00C26348C70BF56886B1809A16157003.m3u8"type="application/x-mpegURL" /></video></div></body></html>

运行效果:

PS: 有兴趣的同学可以到ffmpeg详细了解https://www.ffmpeg.org/ffmpeg-formats.html#Options-10

流媒体分发之HLS(HTTP Live Streaming)相关推荐

  1. 流媒体协议介绍(RTP/RTCP/RTSP/MMS/HLS/HTTP progressive streaming)

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51781399 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  2. Live Streaming Protocol--三种主流的流媒体协议MEPG DASH,HLS,Smooth Streaming及其manifest 文件字段解释

    文章目录 MPEG DASH协议 Manifest.mpd 1. Manifest.mpd简介 2. Manifest.mpd字段 HLS协议 1. manifest.m3u8字段 2. ts文件 s ...

  3. Android事件分发之ViewGroup篇 -- ViewGroup的dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent之间关系

    Android事件分发之ViewGroup篇(FatherViewGroup) – ViewGroup的dispatchTouchEvent.onTouchEvent.onInterceptTouch ...

  4. Android事件分发之ACTION_CANCEL机制及作用

    目录 ACTION_CANCEL产生场景 ACTION_CANCEL作用 FLAG_DISALLOW_INTERCEPT的作用 如果要查看ACTION_MOVE与ACTION_UP的事件传递机制,查看 ...

  5. srs可以用java开发吗,为SRS流媒体服务器添加HLS加密功能(附源码)

    #为SRS流媒体服务器添加HLS加密功能(附源码)# 之前测试使用过nginx的HLS加密功能,会使用到一个叫做nginx-rtmp-module的插件,但此插件很久不更新了,网上搜索到一个中国制造的 ...

  6. Android事件分发之ACTION_MOVE与ACTION_UP的传递机制

    目录 引言 ACTION_MOVE与ACTION_UP的传递机制 mFirstTouchTarget作用 mFirstTouchTarget为什么是链表结构 引言 关于Android事件分发机制网上相 ...

  7. [流媒体]Android 播放HLS/RTSP的原生类库 MediaPlayer

    之前做过一些关于android播放器的开发工作,当时懵懂无知,只知道一个ffmpeg,然后就费劲巴拉的用ndk把ffmpeg编译了,然后又自己封装了个库调用,那个过程可以看看这篇文章,然后我这里也有一 ...

  8. 流媒体网络协议 -- HLS

    HLS HLS介绍 1. 原理 2. HLS多媒体系统 3. HLS的优势和不足: 媒体描述文件 1. 主播放列表(Master Playlist) 2. 媒体播放列表(Media Playlist) ...

  9. m3u8直播流视频实时下载小记-HLS(Http Live Streaming)录屏

    最近由于发现自己想回看的直播会被剪镜头,所以下定决心以后要学会录屏.但一般的录屏软件满足不了我的需要,主要是: 会录出鼠标操作.网络卡顿.水印等影响观感的画面 由于显示器和录屏软件的和原视频帧数可能不 ...

最新文章

  1. 又有多所高校延迟寒假开学
  2. linux中exit()和 _exit()说明
  3. 寄快递要在面单上写身份证号?市民担心个人信息泄露
  4. linux shell之删除当前文件夹不包含文件1和文件2的其他所有文件
  5. flask框架(三):flask配置文件
  6. mysql快速批量入库_MySQL-批量入库优化
  7. 贝叶斯信念网络Bayes Belief network
  8. 【渝粤教育】电大中专品牌管理与推广 (3)作业 题库
  9. sql server 2000里ldf损坏,只有mdf的恢复
  10. 皕杰报表使用技巧:竖排文字如何输入
  11. 计算机绘图软件应用于哪些领域,计算机绘图软件在环境艺术设计中的运用
  12. 两款个人知识库管理软件下载
  13. Linux 实用指令 -- 关机、重启和用户登录注销、用户管理
  14. 洛谷 P4379 [USACO18OPEN]Lemonade Line
  15. java实验四 综合应用实验
  16. java 函数内定义函数_java可以在main中定义函数吗?
  17. 强凸性带来的 距离最优值的上下界
  18. 程序的世界里,短暂的放空
  19. [安卓刷机实战]小米/红米手机刷机降系统图文教程-解锁小米手机-K30 5G版[开箱可用][解锁+刷机全步骤教程]
  20. python爬虫教程:爬取破解无线网络wifi密码过程解析

热门文章

  1. 魔百盒MG101通刷固件及教程(当贝桌面)
  2. 解决安装VS2022时,出现未能安装包“Microsoft.VisualCpp.Redist.14,version=14.32.31332,chip”=x86
  3. 电磁兼容stm32芯片引脚失效问题
  4. 【狂神说Java】Redis最新超详细版教程通俗易懂1 2020-04-01:NoSQL分类,Redis Windows和Linux安装,性能测试,String,List,Set,Hash,Zset
  5. 从一个git仓库迁移到另外一个git仓库
  6. android模拟器限制网速,安卓模拟器设置网速和延迟
  7. 使用MATLAB连接MySQL数据库
  8. 计算机网络安全教育培训教程,网络安全培训教材(PPT 67页)
  9. 牛顿法 拟牛顿法DFP BFGS L-BFGS的理解
  10. checkmarx下载地址