SRS(simple-rtmp-server)流媒体服务器源码分析--HLS切片

一、前言

        SRS流媒体服务器支持rtmp协议,但是rtmp协议仅仅支持PC直播。移动端直播需要HLS协议,HLS协议是由苹果公司发布,用于移动端视频直播,后来Android也对HLS做了友好支持。所以,SRS流媒体服务器支持rtmp协议和hls协议,满足了PC和移动端直播要求。

     HLS协议有两个关键文件:.m3u8文件和.ts文件:

  • .m3u8文件:播放控制文件,存放了地址和播放参数。
  • .ts文件:真正存储视频文件。

相关HLS协议详细说明参见:HLS协议详解

       SRS流媒体接受到通过rtmp传输协议传输的编码格式为H264/AAC(注意:HLS协议只支持Video编码:H264;Audio编码:AAC/mp3)音视频数据,进行切片成.m3u8文件和.ts文件,存储在磁盘或者内存当中(注意:一般为了提高cpu使用率,将.m3u8和.ts文件存储在内存中)。再通过nginx分发到端(注意:nginx工作目录要和存储.m3u8路径一致)。

       HLS切片处理,其实就是ts编码的处理,通过将H264/AAC编码数据按照TS协议来分成一个一个的TS包。TS协议规定,TS首包内容为PAT(Program Association Table 节目关联表)表,其PID为0x0;接下来为PMT(Program Map Table 节目映射表)表,其PID为0x1001。其次,视频帧PID为:0x100,音频PID为:0x101。后面TS包为实际音视频数据。

二、代码分析

SRS源码相关其他总结:

       SRS(simple-rtmp-server)流媒体服务器源码分析--系统启动

       SRS(simple-rtmp-server)流媒体服务器源码分析--RTMP消息play

       SRS(simple-rtmp-server)流媒体服务器源码分析--RTMP信息Publish

       SRS(simple-rtmp-server)流媒体服务器源码分析--HLS切片

SRS源码HLS处理框架如下:

接着SRS(simple-rtmp-server)流媒体服务器源码分析--RTMP消息play分析,在接受到rtmp信息之后,进行HLS处理。

int SrsSource::on_video_imp(SrsSharedPtrMessage* msg)

在函数中,除了转发给client和forward之外,还有HLS处理。注意:在HLS这一讲中,只分析跟video相关的代码,audio类同。

#ifdef SRS_AUTO_HLS
    if ((ret = hls->on_video(msg, is_sequence_header)) != ERROR_SUCCESS) {
        // apply the error strategy for hls.
        // @see https://github.com/ossrs/srs/issues/264
        std::string hls_error_strategy = _srs_config->get_hls_on_error(_req->vhost);
        if (srs_config_hls_is_on_error_ignore(hls_error_strategy)) {
            srs_warn("hls process video message failed, ignore and disable hls. ret=%d", ret);
            // unpublish, ignore ret.
            hls->on_unpublish();
            // ignore.
            ret = ERROR_SUCCESS;
        } else if (srs_config_hls_is_on_error_continue(hls_error_strategy)) {
            if (srs_hls_can_continue(ret, cache_sh_video, msg)) {
                ret = ERROR_SUCCESS;
            } else {
                srs_warn("hls continue video failed. ret=%d", ret);
                return ret;
            }
        } else {
            srs_warn("hls disconnect publisher for video error. ret=%d", ret);
            return ret;
        }
    }
#endif

进入on_video(),

int SrsHls::on_video(SrsSharedPtrMessage* shared_video, bool is_sps_pps)
{
    int ret = ERROR_SUCCESS;
    
    if (!hls_enabled) {
        return ret;
    }
    
    // update the hls time, for hls_dispose.
    last_update_time = srs_get_system_time_ms();
<think>嗯,用户之前问过如何将OBS推流码推送到内网直播,现在他们想了解如何搭建内网的流媒体服务器。看来用户可能在进行内部直播,比如企业培训、内部会议或者校园内的活动。需要搭建一个稳定的内网服务器来支持他们的直播需求。 首先,用户可能对网络和服务器搭建不太熟悉,所以需要分步骤详细说明。之前的回答里提到了使用SRS、nginx-rtmp或者FFmpeg,这里需要进一步展开每个工具的安装和配置步骤,确保用户能够一步步跟着操作。 用户可能是在公司或者学校的内网环境中,没有公网IP,所以需要确保所有配置都是内网可用的。同时,他们可能关心安全性和稳定性,比如如何限制访问权限,防止未授权的推流,以及如何优化服务器性能避免卡顿。 另外,用户可能遇到防火墙或端口的问题,之前的故障排查指南里有提到,但这里需要更详细地指导如何检查端口开放,比如使用telnet或者防火墙设置。可能还需要提醒用户注意服务器的硬件配置,比如CPU、内存和带宽是否足够支持预期的直播流量。 考虑到用户可能希望有图形界面操作,或许可以补充一些基于Docker的部署方法,这样更简便。同时,测试部分需要具体说明如何用VLC或OBS来验证服务器是否正常工作,确保用户能够确认每个步骤是否成功。 最后,用户可能对后续的外网访问有潜在需求,虽然当前问题在内网,但可以简要提到如何通过端口映射实现外网访问,作为扩展内容。这样用户如果有后续需求,可以知道如何操作。</think>以下是搭建内网流媒体服务器的完整技术方案,包含主流工具的实现方法: 一、服务器选型对比 | 工具名称 | 适用场景 | 特点 | 学习成本 | |-----------------|-----------------------|-----------------------------|--------| | SRS(Simple-RTMP-Server) | 中小规模直播 | 支持RTMP/HLS/HTTP-FLV三协议 | 中等 | | nginx-rtmp | 快速部署 | 基于Nginx模块扩展 | 低 | | FFmpeg | 轻量级转发 | 纯命令行操作 | 高 | | MediaSoup | WebRTC实时通信 | 支持超低延迟(200ms以下) | 高 | 二、详细搭建流程(以SRS为例) 1. 服务器环境配置 ```bash # Ubuntu/Debian系统 sudo apt update && sudo apt install -y git gcc g++ make ``` 2. 源码编译安装 ```bash git clone https://github.com/ossrs/srs.git cd srs/trunk ./configure --full && make ``` 3. 基础配置文件 创建`conf/srs.conf`: ```nginx listen 1935; max_connections 1000; daemon on; http_server { enabled on; listen 8080; dir ./objs/nginx/html; } vhost __defaultVhost__ { hls { enabled on; hls_path ./objs/nginx/html; hls_fragment 10; hls_window 60; } } ``` 4. 启动服务 ```bash ./objs/srs -c conf/srs.conf ``` 三、关键配置参数说明 1. 推流限制(IP白名单) ```nginx vhost __defaultVhost__ { security { allow publish 192.168.1.0/24; # 限制C类内网地址 deny publish all; } } ``` 2. 存储设置(录制功能) ```nginx dvr { enabled on; dvr_path /data/live_records/[app]/[stream].[timestamp].flv; dvr_plan session; } ``` 3. HLS切片配置(网页播放优化) ```nginx hls { hls_fragment 5; # 切片时长() hls_window 30; # 保留切片总时长 hls_cleanup on; # 自动清理旧切片 } ``` 四、验证测试方法 1. 推流测试(使用OBS): - 服务器地址:`rtmp://[服务器IP]/live` - 流密钥:任意字符串(如:test123) 2. 播放验证: - RTMP协议:`ffplay rtmp://[IP]/live/test123` - HLS协议:浏览器访问`http://[IP]:8080/live/test123.m3u8` - HTTP-FLV:`vlc http://[IP]:8080/live/test123.flv` 五、性能优化建议 1. 网络层优化 - 开启TCP_NODELAY: ```nginx tcp_nodelay
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值