HLS流媒体

HLS流媒体服务器基础 本篇博客记录了学习HLS流媒体协议的原理、工作流程以及搭建最简单的HLS服务器的过程。通过学习HLS协议,将能够理解流媒体技术的核心概念,并具备搭建自己的流媒体服务的基础知识。希望通过本文的学习,能够对HLS流媒体协议有一个全面的了解,并且能够运用这些知识搭建自己的流媒体服务,为用户提供更优质的视频播放体验。 阅读详情

HLS Spec

#EXTM3U

#EXT-X-TARGETDUATION:10

#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:10

fileSequence0.ts

Maseter Playlist:

#EXTM3U

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

gear1/prog_index.m3u8

Media Segments

由一个uri和一个可选的byte range来组成。有一个唯一的sequence number;必须是连续的不能被中断;包含足够的信息来初始化decoder,如H.264包含一个IDR帧。

支持的媒体格式

有MPEG2-ts, Fragmented MPEG-4

Playlists

如果一个playlist中所有的uri是一个playlist,那么就是一个master playlist。

PlayList Tags

ExTM3U扩展的M3U播放文件
EXT-X-VERSION兼容的版本
EXT-X-TARGETDURATION最大的Media Segment duration
EXT-X-MEDIA-SEQUENCEmedia的序列号
EXT-X-DISCONTINUITY-SEQUECE在不同的流的听众之间同步
EXT-X-I-FRAMES-ONLY所有的segment都描述了一个I-frame
EXT-X-MEDIA

被用来在PlayList中表示相同内容的不用语种/译文的版本,比如可以通过使用3个这种tag表示3中不用语音的音频,或者用2个这个tag表示不同角度的video在PlayLists中。这个标签是独立存在的,其格式如下:

#EXT-X-MEDIA:<attribute-list>:该属性列表中包含:URI、TYPE、GROUP-ID、LANGUAGE、NAME、DEFAULT、AUTOSELECT。

(a) URI:如果没有,则表示这个tag描述的可选择版本在主PlayList的EXT-X-STREAM-INF中存在;

(b) TYPE:AUDIO and VIDEO;

(c) GROUP-ID:具有相同ID的MEDIA tag,组成一组样式;

(d) LANGUAGE:确定使用的主要语言。

(e) NAME:人类可读的语言的翻译。

(f) DEFAULT: YES或是NO,默认是No,如果是YES,则客户端会以这种选项来播放,除非用户自己进行选择。

(g) AUTOSELECT:YES或是NO,默认是No,如果是YES,则客户端会根据当前播放环境来进行选择(用户没有根据自己偏好进行选择的前提下)。
————————————————
版权声明:本文为优快云博主「路痴的旅行」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/u011857683/article/details/84863250

EXT-X-STREAM-INF

指定一个包含多媒体信息的 media URI 作为PlayList,一般做M3U8的嵌套使用,它只对紧跟后面的URI有效,格式如下:

#EXT-X-STREAM-INF:<attribute-list>

<URI>

有以下属性:

(a) BANDWIDTH:带宽,必须有。

(b) PROGRAM-ID:该值是一个十进制整数,惟一地标识一个在PlayList文件范围内的特定的描述。一个PlayList 文件中可能包含多个有相同ID的此tag。(这个属性在后面的协议版本废除了)

(c) CODECS:指定流的编码类型,不是必须的。

(d) RESOLUTION:分辨率。

(e) AUDIO:这个值必须和AUDIO类别的“EXT-X-MEDIA”标签中“GROUP-ID”属性值相匹配。

(f) VIDEO:这个值必须和VIDEO类别的“EXT-X-MEDIA”标签中“GROUP-ID”属性值相匹配。

示例:

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=500000, RESOLUTION=720x480

mid_video_index.M3U8
 

HLS playback

Android HLS播放过程

HLS prepare的过程,取消带宽切换,记录以前的带宽index:morigBandwidthIndex,目前的带宽Index:mCurBandwidthIndex; streamMask:新的URI流,resumeMask:uri没有变得流。

在ChangeConfiguration中,停止和抛弃不在需要的fetcher,如果目前的uri和新的rui相同,使用原来的fetcher,否则disFetcher=ture;

在seek的过程中,触发kwhatChangeConfiguration2,否则发送kwhatconfiguration3

处理kwahtchangeconfiguration2时,seek time>0, 清理掉已经缓冲的mPacketSource中的buffer

处理KwhatConfiguration3时,如果uri有变换,设置switching为true,依据新的URI或新增的流创建PlaylistFetcher;

PlaylistFetch:监控缓冲队列,刷新播放列表,触发下载

HttpDownload:由于下载指定的ts

ATSParser:解析相应的playlist

AnotherPacketSource:保存相应的解析的数据

数据获取的流程

从Nuplayerdecoder的onRequesetInputBuffers->httpLivesource的dequeueAccessUnit->LiveSession的dequeueAccessunit-> AnotherPacketSource

然后queue到MediaCodec

Seek过程

根据seek的时间、firstSeqNumberInPlaylist、lastSeqNumberPlayList,获取seek的时间位于那个片段n+1内,然后startTimeUs=seektime-(0.......n)总时间为startimeUs,设置mStartTimeUsRelative=true;在seek的过程中,如果是H264,需要判断是否是IDR帧,如果是isStartTimeReached,开始保存数据。

Playlist的更新

如果每次检测playlist都没有变化,时间就会相应的增加:

INITIAL_MIINIMUM_RELOAD_DELAYitemDuration-10s
FIRST_UNCHANGED_RELOAD_ATTEMPTtargetDuration/2-5s
SECOND_UNCHANGED_RELOAD_ATTEMPTtargetDuration*3/2
THIRD_UNCHANGED_RELOAD_ATTEMPTtargetDuration*3 -30s

在refreshPlaylist中:如果发现没有变化mRefreshState+1

HLS buffering

1.获取当前缓冲的buffer的时间,如果缓冲的时间小于30s,会立刻启动下载

2.如果大于30s,就会计算下一次监控buffer的delayUS

delay的时间取决于两个要素,第一个是多缓冲的时间,和刷新playlist的时间。

多缓冲的时间T1=buffer duration-minbuffer duration

刷新的时间:T2=mLastPlaylistFetchTime+minPlaylistAgeUs-Now

delay=min(T1,T2);

带宽切换 

通过提供不同的带宽和下载速度下的资源,可以做到动态切换分辨率;主要依据两个变量,一个是实际带宽,另外一个是缓存的大小;

如果实际的带宽大于阈值,并且缓存大于阈值,就上升带宽;

如果实际带宽小于阈值,并且缓存小于阈值,就下降带宽。

带宽的计算:下载量/下载时间;

每一个ts被按照47K分片进行下载,然后记录每次下载的size,duration,和开始下载的时间。队列中的最后一项的开始时间减去第一项的就是有效期;

 当队列中的数据满足条件后,会每1s检测一次带宽;计算好的bw仍然会被保存在长度为3的带宽队列里面;

短期带宽:去对应带宽队列中的带宽的,数据队列中的item,然后是size的总和/duration;

带宽稳定性的检测:

当max小于等于最小的133%时,短期带宽大于min的70%时,是稳定的;最大最小来自带宽队列。

Buffer检测:

往下切换,min(20,targetDuration*9/4);

往上切换,min(15, targetDuration*7/4);

如果所有的track都大于kupSwitchMarkUs就会往上切换;任何一个小于kDownSwthcMarkUs就往下切换。

启动时间计算

 带宽上升时:

 

9const int64_t LiveSession::kUpSwitchMarginUs = 5000000ll;

下降:

 

带宽数据的合并:

如果带宽切换的过程中,如果下载的新数据的时间戳-旧数据时间戳大于限制,启动旧数据下载;

否则,结束旧数据下载,合并mPacketSource2和mPacketSource的数据。

ATS Parser:

TS流的包结构长度固定为188字节,而PS流的包长度可变。

节目关联表(Program Association Table,PAT)

标识    位数    说明
sync_byte    8 bits    固定是0x47
transport_error_indicator    1 bits    值为0,表示当前包没有发生传输错误。
payload_unit_start_indicator    1 bits    值为1,负载数据从包头数据1字节后开始
transport_priority    1 bits    值为0,表示当前包是低优先级。传输优先级标志(1:优先级高)
PID    13 bits    PID=0x0000,说明是PAT表。
transport_scrambling_control    2 bits    值为0x00,表示节目没有加密。
adaptation_field_control    2 bits    值为0x01,改Packet区域含控制调整字段
continuity_counter    4 bits    值为0x00,表示当前传送的相同类型的包是第0个。
节目映射表(Program Map Table, PMT)

 

PMT表中包含的数据如下:

  • 当前节目中所有Video ES流的PID
  • 当前节目所有Audio ES流的PID
  • 当前节目PCR的PID等。

HLS 流媒体性能测试 HLS 流媒体性能测试是为了确保流媒体服务的性能和可靠性而进行的测试。HLS 是苹果公司开发的一种流媒体传输协议,它可以在网络环境差的情况下,保证视频的稳定播放。 在进行 HLS 流媒体性能测试之前,需要准备好测试环境,包括测试用的视频文件、测试服务器以及测试客户端。 测试流程如下: 在测试服务器上搭建流媒体服务,并将测试用的视频文件上传到服务器上。 在测试客户端上使用 HLS 播放器打开测试... 阅读详情

相关推荐

HLS流媒体协议使用详解

HLS作为当前主流的流媒体协议,具有兼容性好、实现简单等优势。开发者可以基于以上代码进一步扩展,实现更完整的HLS客户端,包括自适应码率切换、解密播放等功能。随着LL-HLS等新特性的普及,HLS协议将继续在流媒体领域发挥重要作用。理解HLS底层原理对于开发高性能流媒体应用至关重要。

程序猿老樊的博客 1223

第二模块(函数编程(极速版))-第一章-函数编程

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、bytes类型二、字符编码的转换三、深浅copy三、函数来了四、函数返回值与作用域总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下

qq_36993243的博客 635

流媒体协议HLS和DASH

简要介绍流媒体协议HLS和DASH

夏日 の blog 4424

M3U8 视频封装格式的深度解析

M3U8 视频封装格式的深度解析

m0_73443478的博客 2398

nginx上搭建HLS流媒体服务器

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

cjsafty的专栏 5万+

HLS流媒体协议介绍

HLS流媒体协议介绍HLS流媒体协议介绍 简介 结构 组件 传输协议HTTP 封装格式mpegts 多码率自适应m3u8一级 媒体内容描述m3u8二级 应用架构实战 相关工具使用简介HLS(HTTP Live Streaming)是苹果公司推出的流媒体协议, 用于直播或点播场景, 应该算是当前平台兼容性最好的流媒体协议了. 其他主流的流媒体协议还有RTP(内容传输使用UDP)和Adobe的RTMP(

RdaOniCelK的专栏 1804

m3u8介绍

在IOS device和mac上可以用http的方式进行分发,其中playlist标准为由m3u扩展而来的m3u8文件,媒体文件为MPEG2-TS或者AAC文件(audio only)。 m3u8文件有两种应用场景: 多码率适配流,     #EXTM3U     #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1280000    

yuanfen139re的专栏 3140

视频知识点(13)- M3U8 视频封装格式的深度解析

前言 M3U8 作为一种常见的视频封装格式,具有广泛的使用场景,不仅被应用到点播场景中,也被应用到直播场景中。 正文 格式简介 M3U8 视频封装格式其实是一个统称,它实际上是由 m3u8 索引文件和若干个 ts 分片文件组成的,很多时候大家可能对 HLS(Http Live Streaming)的说法更加熟悉。是的,HLS 是由苹果公司提出的基于 HTTP 的流媒体网络传输协议,是苹果公司 QuickTime X和 iPhone 软件系统的一部分。 工作原理 M3U8 视频封装格式的工作原

liuzhen007的专栏 2922

hls之m3u8、ts流格式详解

HLS,Http Live Streaming 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。 1、M3U8文件    用文本方式对媒体文件进行描述,由一系列标签组成。 #EXTM3U #EXT-X-TARGETDURATION:5 #EXTINF:5, ./0.ts #EXTINF:5, ./

郭风朴(guofengpu)的Android影音专栏 1万+

流媒体之HLS详解

HLS(HTTP Live streaming),是基于HTTP的流媒体传输协议,由apple公司所提出的一种由于传输音视频的协议交互方式,当前HLS被广泛应用于视频点直播领域。HLS采用HTTP协议传输音视频数据,HLS通过将音视频流切割成一个个小的TS切片及生成m3u8的播放列表文件,播放客户端通过HTTP协议下载播放列表文件,按照播放列表文件制定的顺序下载切片文件并播放,从而实现便下载边播放,类似于实时在线播放的效果。

技术控的笔记 23万+

高效多比特率HLS流媒体包装工具:hls-packager

本文还有配套的精品资源,点击获取 简介:HLS(HTTP Live Streaming)是一种流媒体传输协议,支持视频内容的实时传输,适应不同网络条件。本文介绍的“hls-packager”是一个基于ffmpeg的shell脚本工具,旨在自动化创建和管理多比特率的HLS变体播放列表。该脚本功能涵盖目录监视、视频转码、播放列表生成以及文件上传,简化了HLS流媒体服务的部署和管...

weixin_34725745的博客 1214

流媒体格式之HLS

在当今数字化的时代,流媒体技术已经成为我们获取信息和娱乐的重要方式。无论是观看精彩的影视作品,还是实时关注重要的新闻事件,流畅、稳定和高质量的流媒体体验至关重要。而在众多流媒体传输格式中,HLS(HTTP Live Streaming)格式凭借其独特的优势和特点,逐渐成为行业内广泛应用的重要技术之一。HLS(HTTP Live Streaming)是苹果公司推出的基于 HTTP 的流媒体传输协议。

wushakun的博客 1617

UG NX与PLC-1500的在环虚拟测试

TIA、PLCSIM、NetToPLCsim、KEPServerEX以及UG NX的在环虚拟测试

lvtlvtlvtlvt的博客 4220

srt2hls:实现简单音频HLS流媒体服务的开源项目

srt2hls:实现简单音频HLS流媒体服务的开源项目 项目介绍 srt2hls 是一款开源的音频HLS流媒体服务器程序。其主要目的是接收采用 SRT 协议的音频流并将其转换为 HLS 格式进行广播。srt2hls 可以作为 CDN 源服务器,也可以作为一个简单易用的流媒体服务器。 HLS(HTTP Live Streaming)是一种流行的流媒体协议,常用于音频和视频的实时传输。srt2hls ...

gitblog_01020的博客 781

Zoom AI 技术架构研究:联合式方法与多模态集成

通过 Zoom AI 开放平台,企业可以自定义 AI 模块 (如法律合规审查、客户反馈分析),扩展应用场景。这种开放平台策略使企业能够根据自身需求定制 AI 功能,满足特定业务需求。

shao.bing的专栏 1318

ICG setup timing violation介绍?

门控时钟(clock gating)在RTL级电路设计过程中进行低功耗优化常用方法,能够有效降低动态功耗(翻转功耗)。Clock gating cell 可以由与门,与非门,或门或者或非门构成,但很容易产生Glitch。在实际使用中,一般用ICG(集成门控时钟单元)来完成clock gating。 下图展示了glitch的产生原因 在CTS时钟树综合的时候,ICG不会被看作sink,通常放置在source点附近,因此就会出现如上图这种结果。上图可以看出,在分析DFF到ICG的setup timing

m0_61003348的博客 9809

流媒体传输协议之HLS((HTTP Live Streaming))

HLS(HTTP Live Streaming)是一种基于HTTP的流媒体传输协议,最初由苹果公司在2009年推出,用于在iOS设备上实现实时的音视频流播放。HLS已经成为一种广泛应用于在线视频流传输的标准,不仅在苹果设备上,也在其他平台上得到了支持。HLS是一种用于实现流媒体的协议,它基于HTTP,通过将媒体文件切割成小片段并使用播放列表进行组织,实现了高效、灵活的视频传输。其出现的背景可以追溯到对于在不同网络条件下提供稳定、高质量视频流的需求。

qq_42241500的博客 2786

不用写代码!3个免费在线工具教你完成Lasso回归分析(含生存资料处理)

本文介绍3款免费在线工具,帮助用户无需编程即可完成临床数据的Lasso回归分析,特别适合处理生存资料。通过详细的操作指南和实战技巧,读者可以轻松掌握变量筛选、模型优化及结果解读,提升临床研究的效率和准确性。

weixin_33738555的博客 349

浅析 HLS 流媒体协议

文章目录一、前言二、常见流媒体协议三、HLS 协议介绍四、HlS 系统架构1、HLS 服务器端2、HLS 分发端3、HLS 客户端4、小结五、示例分析六、总结 一、前言 在最近工作中接触到了视频点播和直播业务,也了解到了一些流媒体的后端技术,这段时间希望将了解到的一些知识总结下来,这篇文章主要介绍 HLS 流媒体协议 的基础知识。 二、常见流媒体协议 常用的流媒体协议主要有 HTTP 渐进下载和基于 RTSP/RTP 的实时流媒体协议,这两种协议是完全不同的实现方式。主要区别如下: 一种是分段渐近下载,一

7DGroup,让技术更有价值! 2100

华为铁三角(AR、SR、FR)的考核指标设计

以和为核心,通过和实现协同。考核维度分为和,并随市场阶段动态调整权重。

从技术实践立足,从项目管理方法论延伸思考 2772

DrawCall、Batches、SetPassCalls的区别和联系

一、DrawCall、Batches、SetPassCalls的基本理解 我们先从图形渲染的角度对这些概念做一个基本的理解。 1.1 DrawCall DrawCall实际上指的是一次图形渲染接口的调用,比如OpenGL的glDrawArrays或者glDrawElements的一次调用,以及DirectX的DrawPrimitive或者DrawIndexedPrimitive。因此,DrawCall可以简单理解为一次渲染指令调用。 1.2 Batches 我们知道,在调用DrawCall之前,需要设置渲染

远行's Blog 6378

《hls流媒体开发指南》

hls.js是一款轻量级的JavaScript库,用于在非原生支持HLS协议的浏览器中实现视频播放。它通过解析M3U8索引文件和TS视频分片,利用浏览器的MSE API实现流畅的视频播放。本文详细介绍了hls.js的核心功能,包括快速入门指南、配置选项、API使用方法、进阶功能(如多码率切换、DRM加密播放、字幕支持等),以及性能优化和常见问题解决方案。文章还提供了兼容性处理建议和调试技巧,帮助开发者构建稳定高效的HLS播放器。关键点包括:初始化流程、错误处理、内存管理以及跨域配置等实际开发中的核心问题。

北京锋通科技有限公司的技术blog 1233

国内网络环境下Calico v3.26.4安装避坑指南(附华为云镜像加速脚本)

本文为国内开发者提供Calico v3.26.4的高效部署指南,重点介绍如何通过华为云镜像加速服务解决Kubernetes集群网络插件镜像拉取问题。文章包含详细的镜像加速脚本、部署清单修改方法及深度排错技巧,帮助开发者快速完成Calico网络插件的安装与配置。

brown的博客 288

RTSP、RTMP、HLS流媒体协议的区别与联系

本文聚集于RTSP、RTMP、HLS这3种主流的流媒体协议介绍,从协议起源、协议特点、优点、缺点、应用场景等多维度进行解析,希望能给大家带来收获。 为了便于大家理解本次的内容,我们先要了解一些必备知识。 首先,我们要知道,网络可以用于给我们传输数据,最简单的例子就是我们给对方发送微信信息。那么这些信息在网络的世界到底是如何传输的呢?是谁在背后默默的付出耕耘,帮我们传递信息呢? 答案是:UDP/TCP 他们是TCP/IP协议族的成员,处于网络信息的传输层,我们可以理解,数据传输的事情就是他们两个.

m0_60259116的博客 6979

【路径规划】基于matlab蚁群算法机器人栅格地图最短路径规划【含Matlab源码 4590期】

基于matlab蚁群算法机器人栅格地图最短路径规划 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1277

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

基于 SRS+NG 搭建 HLS 直播流媒体服务器

协议介绍 SRS 支持 HLS/RTMP 两种成熟而且广泛应用的流媒体分发方式。 RTMP 指 Adobe 的 RTMP ( Realtime Message Protocol ),广泛应用于低延时直播,也是编码器和服务器对接的实际标准协议,在 PC(Flash)上有最佳观看体验和最佳稳定性。 HLS 指 Apple 的 HLS ( Http Live Streaming ),本身就是 Live...

AI早餐汇 3439

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: RTP和RTCP协议
下一篇: 3.2 Execution Model
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值