1.SRS(simple-rtmp-server)流媒体服务器源码分析--HLS切片
2.全民K歌推流直播Web实践
3.Hls.js加载m3u8主流程源码解析
4.音视频骚操作,苹果FFmpeg 如何播放带「」的源源码 M3U8 视频,IJKPlyaer 适配非标 TS 文件
5.SRS(simple-rtmp-server)流媒体服务器源码分析--启动
6.HLS 优化系列基础篇-pragma HLS unroll
SRS(simple-rtmp-server)流媒体服务器源码分析--HLS切片
SRS流媒体服务器支持rtmp协议,苹果同时也支持HLS协议,源源码满足了PC和移动端直播需求。苹果HLS协议的源源码股东数源码关键文件包括.m3u8和.ts文件,其中.m3u8文件包含播放信息,苹果ts文件则包含音视频数据。源源码SRS接收H/AAC编码的苹果音视频数据,进行切片处理成.m3u8和.ts文件,源源码通常存储在内存中。苹果这些文件通过nginx进行分发。源源码
HLS切片处理遵循TS协议,苹果将音视频数据按照TS协议规则分割成TS包,源源码其中PAT表(PID为0x0)和PMT表(PID为0x)作为首包,苹果视频数据PID为0x,音频数据PID为0x。这样,每一段音视频数据就被封装在一个TS包中。
在SRS源码中,HLS处理流程涉及获取SPS和PPS信息、检测视频编码格式、进行RTMP抖动矫正以及实际的HLS切片处理。在on_video函数中,重点进行的工作包括获取H编码的SPS和PPS信息,检查视频编码格式必须为H,执行RTMP抖动矫正,以及关键的HLS切片处理。
在HLS切片处理部分,主要完成两件事:首次或ts文件时间溢出时,调用reap_segment函数进行.m3u8和.ts文件的大漠开发源码管理,包括创建、打开、关闭等操作;其他时间则进入flush_video函数,负责ts流编码和.ts文件的写入。编码过程中,会根据音视频类型获取不同PID,执行TS编码,并将PAT帧、PMT帧和音视频数据编码成TS包,写入文件。
总结,TS编码实质是按照TS协议重新整理数据,保持H/AAC的编码格式。TS切片遵循TS协议要求的字段长度对音视频数据进行分包处理。TS文件作为TS包的存储位置,其生成与HLS协议和TS协议之间有密切关系。
全民K歌推流直播Web实践
背景
年疫情期间,大众转向线上活动,直播行业迎来爆发,用户量持续增长,特别在线演唱模式受到欢迎。TME主办了近场明星在线演唱会。面对站外直播需求的增加,原有的K歌直播技术难以满足新功能和用户需求。
推流直播技术实践
K歌Web使用HLS流为主。HLS是Apple提出的HTTP流媒体协议,通过切片处理流传输,客户端下载m3u8文件以找到媒体流并下载MPEG-TS格式的片段。iOS和Android支持HLS,只需做好视频采集、源码之家含数据推流服务,H5页面可直接播放。
HLS局限性
HLS流主要局限在延迟和稳定性方面。为解决这些问题,考虑使用FLV流。
FLV流的优势
FLV流支持更低延迟和稳定传输,平均延迟1~2秒,且避免防火墙干扰,支持跳转和HTTPS加密。然而,iOS浏览器不支持MSE API,无法直接播放FLV流。
移动端FLV播放方案
调研发现几种支持移动端FLV播放的js SDK,其中NodePlayer.js通过ASM.js软解码实现移动端播放,WXInlinePlayer和ffmpeg-player分别使用不同的构建方案实现跨平台支持。
优化与封装
对WXInlinePlayer和腾讯的TCPlayer进行源码优化,解决iOS端画音不同步、系统适配和webgl渲染旋转问题,封装成kg-player SDK。优化flv解析流程,支持多码率流和流地址切换,确保直播流畅。
性能对比
hls与flv流各有优劣,kg-player SDK接入后,flv流在延迟和卡顿率方面表现更优,且支持iOS 及以上和Android 5及以上系统。通过检测页面卡顿,自动降级到低码率流以保证播放性能。
技术架构
推流直播技术架构包含kg-player SDK的播放模块、kg-im SDK的php病人的源码消息模块和礼物动画渲染模块。kg-im SDK支持实时消息拉取和消息结构优化,kg-gift支持多种动画需求。
直播性能数据
在接入kg-player SDK后,flv流的首帧渲染时间较长,播放卡顿率低于hls流。遇到卡顿会自动降级以提高播放体验。
优化与展望
通过优化wasm软解码和webgl渲染,kg-player SDK支持了移动端flv流播放。针对不同系统性能,优化策略进一步提高播放性能和稳定性。未来将支持更多直播业务场景,不断完善技术架构,开源SDK代码。
Hls.js加载m3u8主流程源码解析
hls.js加载m3u8主流程源码解析
hls.js简介与配置
hls.js是一个用于在浏览器中播放流媒体的库,配置相对简单,通常使用默认配置即可满足大部分需求。然而,对于特定场景,调整配置成为可能,并且理解配置执行过程对于开发者至关重要。事件机制与控制器
hls.js采用eventemitter3管理事件,实现逻辑解耦,尽管维护成本随事件数量增加而提高,但在加载视频流至播放过程中,事件监听与派发功能的运用极为合适,且便于业务方扩展事件监听。控制器与任务划分
库内部被划分为多个控制器,如abr-controller、buffer-controller、stream-controller等,github源码编译示例每个控制器专注于特定任务,通过事件监听与派发完成视频流的拉取、解析、播放等操作。加载流程
从初始化到加载m3u8,选择不同码率加载对应ts文件,解码ts转为mp4并在浏览器播放,整个过程涉及复杂步骤。下图展示了关键流程。关键环节解释
主流程包含两个关键定时器。第一个由StreamController启动,用于轮询ts文件列表更新状态。第二个用于监听ts片段加载速率,动态调节码率。初始默认码率为playlist的中间值,如p、p、p码率列表,则默认选择p。音视频骚操作,FFmpeg 如何播放带「」的 M3U8 视频,IJKPlyaer 适配非标 TS 文件
在音视频播放领域,FFmpeg 与 IJKPlayer 等工具的灵活性和扩展性为解决非标准格式和骚操作提供了可能。本文将深入探讨如何播放带有「」的 M3U8 视频以及如何适配非标 TS 文件,以更直观的方式阐述 M3U8 基础知识。
M3U8,即 HTTP Live Streaming(HLS)文件格式,是苹果为提供点播和直播能力而开发的一种基于 HTTP 协议的流媒体解决方案。M3U8 文件通常包含一个索引,指向多个 TS 格式的视频切片。然而,有时 M3U8 文件中会包含非标准格式,如 png 或 bmp 文件链接,引发播放问题。
在 M3U8 文件中出现 png 或 bmp 链接的原因在于「劳动人民的智慧」,通过将视频切片伪装成上传至公共 CDN,以实现类似免费 CDN 的视频加载加速效果。M3U8 文件本身并不关注链接的后缀,而是通过读取 #EXTINF tag 下的二进制 Header 来识别编码和封装格式。
FFmpeg 在播放视频时,并不依赖文件后缀,而是根据 Header 内容来识别视频格式。因此,无论链接的后缀是 png、bmp,甚至是其他格式如 txt,只要数据包本身遵循正确的编码格式,视频都能被正确播放。不过,如果链接本身是一个,且数据经过特殊处理(如加密、非标准封装),则需要额外的适配。
当 M3U8 文件包含特殊格式链接时,如 bmp、png 与 TS 的混杂,或者内嵌有视频数据且经过加密处理,播放器需要进行更为复杂的解码和处理。例如,若 bmp 中的视频数据被 AES- 加密,通过下载 M3U8 文件中的相关链接,使用特定工具下载解密后,可以恢复视频数据的原始 TS 封装格式。
在解析 TS 文件时,关键步骤包括识别 PAT(节目表)和 PMT(节目映射表)等信息。PAT 表包含所有节目的 PID(程序标识符),PMT 则对应特定节目的音视频数据。当 PAT 表被忽略或解析错误时,可能导致播放无画面。解决这类问题通常需要调整播放器的解码逻辑,如在 FFmpeg 的源码中添加特定的逻辑判断,以正确解析 PAT 和 PMT,从而确保视频的正确播放。
通过上述方法,播放器能够适配并播放带有链接的非标准 M3U8 视频,以及处理包含加密或非标准封装的 TS 文件。这样的适配不仅展示了 FFmpeg 和 IJKPlayer 等工具的强大灵活性,也为处理复杂的音视频格式提供了可能。然而,这些方法的实现需要对音视频编码、封装和播放流程有深入理解,并可能涉及对播放器源码的修改。
SRS(simple-rtmp-server)流媒体服务器源码分析--启动
小卒最近探索了SRS源码,并撰写博客以整理思路,方便日后查阅。SRS源码具备以下优势:
1、轻量化设计,代码结构清晰,SRS3.0版本代码量约为8万行,功能却足以支撑直播业务。
2、采用State Threads架构,实现高性能、高并发。
3、支持rtmp和hls,满足PC和移动直播的需求。
4、支持集群部署,适应不同规模的部署需求。
代码分析分为两个阶段:一、梳理代码框架,理解流程;二、深入细节,熟悉SRS工作原理。
SRS源码框架包括系统启动、RTMP消息处理、RTMP信息发布、HLS切片等功能模块。系统启动时,初始化类,监听端口,对每个访问请求创建线程,专门处理连接操作。
系统监听包含不同类型的请求,如RTMP连接、HTTP API等,通过创建线程处理。
RTMP连接处理中,SRS采用协程而非线程,实现高效并发。创建协程后,进入协程循环处理。
HTTP API连接监听机制与RTMP类似,仅参数不同。
HTTP API回调接口在run_master函数中注册,允许访问服务器参数。
SRS对拉流处理独特,通过ffmpeg工具实现,SRS代码负责简单的系统调用。
系统启动代码结构清晰,从初始化、监听到线程处理,再到回调注册、拉流处理、自服务,各环节紧密衔接。
总结SRS源码分析,不仅展现了代码的高效性和扩展性,还提供了灵活的部署方案,适用于多种直播场景。
HLS 优化系列基础篇-pragma HLS unroll
在HLS优化中,pragma HLS unroll是一个重要的工具,它通过在硬件描述语言(RTL)设计中创建循环体的副本来提高性能。默认情况下,C/C++中的循环是滚动执行的,每次迭代顺序进行。使用pragma HLS unroll,可以展开循环,允许部分或全部迭代并行发生,从而提升数据访问和吞吐量。
完全展开循环会为每个迭代创建一个独立的副本,如for循环中的每个迭代会独立执行。部分展开则允许指定一个因子N,使得循环体复制N次,迭代次数相应减少。在部分展开时,Vitis HLS工具会添加退出检查以确保功能正确,但若因子是最大迭代计数的整数倍,可以使用skip_exit_check选项简化逻辑。
当使用ARRAY_PARTITION或ARRAY_RESHAPE等pragma时,HLS会自动根据需要展开消耗这些数据的循环,以充分利用数据。编译指示通常放置在循环主体中的C源代码内,如`#pragma HLS unroll factor= region skip_exit_check`,其中factor参数控制展开程度,skip_exit_check在部分展开时可选,根据循环迭代情况决定是否删除检查。
实战中,pragma HLS unroll的应用可以显著提高性能,例如,延迟降低%,LUT使用增加%,FF使用量增加%。通过合理使用这个pragma,可以优化代码的硬件实现,提高效率。