Simple-RTMP-Server 服务器测试

本文介绍如何从源码编译并配置SRS直播服务器,包括服务器镜像获取、编译安装及服务管理等步骤。此外,还提供了使用FFmpeg进行本地FLV文件及代码方式推流到SRS服务器的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 服务器镜像获取
    github源码地址
    git clone https://github.com/winlinvip/simple-rtmp-server.git
  2. 编译系统
    ./configure –disable-all –with-ssl –with-hls –with-nginx –with-ffmpeg –with-transcode
    make
    make install
    安装命令会将SRS默认安装到/usr/local/srs中,可以在configure时指定其他目录,譬如./configure –prefix=pwd/_release 可以安装到当前的_release目录
  3. 建立启动服务
    3.1 建立软连接
    sudo ln -sf /usr/local/srs/etc/init.d/srs /etc/init.d/srs
    备注:若SRS安装到其他目录,将/usr/local/srs替换成其他目录。
    3.2 添加服务
    sudo /sbin/chkconfig –add srs
    4.3 使用init.d脚本管理SRS
    查看SRS状态:
    /etc/init.d/srs status
    启动SRS:
    /etc/init.d/srs start
    停止SRS:
    /etc/init.d/srs stop
    重启SRS:
    /etc/init.d/srs restart
    Reload SRS:
    /etc/init.d/srs reload

  4. 服务器开放1935端口

  5. FFmpeg推流
    5.1推流本地flv文件
    ffmpeg -re -i /Users/sample.flv -vcodec libx264 -acodec aac -f flv rtmp://阿里云服务器公网ip:1935/rtmplive/home
    5.2代码推流
#include <iostream>
#include <stdio.h>

extern "C"
{
#include "libavformat/avformat.h"
#include "libavutil/mathematics.h"
#include "libavutil/time.h"
}

int main(int argc, char* argv[])
{
    AVOutputFormat *ofmt = NULL;
    AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;
    AVPacket pkt;
    const char *in_filename, *out_filename;
    int ret, i;
    int videoindex=-1;
    int frame_index=0;
    int64_t start_time=0;
    in_filename  = "/Users/stellazhou/Documents/音视频测试文件/sample.flv";
    out_filename = "rtmp://阿里云服务器公网ip/live/livestream";

    av_register_all();
    avformat_network_init();

    if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {
        printf( "Could not open input file.");
        goto end;
    }
    if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {
        printf( "Failed to retrieve input stream information");
        goto end;
    }

    for(i=0; i<ifmt_ctx->nb_streams; i++)
        if(ifmt_ctx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){
            videoindex=i;
            break;
        }

    av_dump_format(ifmt_ctx, 0, in_filename, 0);

    //输出(Output)
    avformat_alloc_output_context2(&ofmt_ctx, NULL, "flv", out_filename); //RTMP
    if (!ofmt_ctx) {
        printf( "Could not create output context\n");
        ret = AVERROR_UNKNOWN;
        goto end;
    }
    ofmt = ofmt_ctx->oformat;
    for (i = 0; i < ifmt_ctx->nb_streams; i++) {
        //根据输入流创建输出流(Create output AVStream according to input AVStream)
        AVStream *in_stream = ifmt_ctx->streams[i];
        AVStream *out_stream = avformat_new_stream(ofmt_ctx, in_stream->codec->codec);
        if (!out_stream) {
            printf( "Failed allocating output stream\n");
            ret = AVERROR_UNKNOWN;
            goto end;
        }
        //复制AVCodecContext的设置(Copy the settings of AVCodecContext)
        ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
        if (ret < 0) {
            printf( "Failed to copy context from input to output stream codec context\n");
            goto end;
        }
        out_stream->codec->codec_tag = 0;
        if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
            out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
    }

    //Dump Format------------------
    av_dump_format(ofmt_ctx, 0, out_filename, 1);
    //打开输出URL(Open output URL)
    if (!(ofmt->flags & AVFMT_NOFILE)) {
        ret = avio_open(&ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);
        if (ret < 0) {
            printf( "Could not open output URL '%s'", out_filename);
            goto end;
        }
    }
    //写文件头(Write file header)
    ret = avformat_write_header(ofmt_ctx, NULL);
    if (ret < 0) {
        printf( "Error occurred when opening output URL\n");
        goto end;
    }

    start_time=av_gettime();
    while (1) {
        AVStream *in_stream, *out_stream;
        //获取一个AVPacket(Get an AVPacket)
        ret = av_read_frame(ifmt_ctx, &pkt);
        if (ret < 0)
            break;
        //FIX:No PTS (Example: Raw H.264)
        //Simple Write PTS
        if(pkt.pts==AV_NOPTS_VALUE){
            //Write PTS
            AVRational time_base1=ifmt_ctx->streams[videoindex]->time_base;
            //Duration between 2 frames (us)
            int64_t calc_duration=(double)AV_TIME_BASE/av_q2d(ifmt_ctx->streams[videoindex]->r_frame_rate);
            //Parameters
            pkt.pts=(double)(frame_index*calc_duration)/(double)(av_q2d(time_base1)*AV_TIME_BASE);
            pkt.dts=pkt.pts;
            pkt.duration=(double)calc_duration/(double)(av_q2d(time_base1)*AV_TIME_BASE);
        }
        //Important:Delay
        if(pkt.stream_index==videoindex){
            AVRational time_base=ifmt_ctx->streams[videoindex]->time_base;
            AVRational time_base_q={1,AV_TIME_BASE};
            int64_t pts_time = av_rescale_q(pkt.dts, time_base, time_base_q);
            int64_t now_time = av_gettime() - start_time;
            if (pts_time > now_time)
                av_usleep(pts_time - now_time);

        }

        in_stream  = ifmt_ctx->streams[pkt.stream_index];
        out_stream = ofmt_ctx->streams[pkt.stream_index];
        /* copy packet */
        //转换PTS/DTS(Convert PTS/DTS)
        pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
        pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
        pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
        pkt.pos = -1;
        //Print to Screen
        if(pkt.stream_index==videoindex){
            printf("Send %8d video frames to output URL\n",frame_index);
            frame_index++;
        }
        //ret = av_write_frame(ofmt_ctx, &pkt);
        ret = av_interleaved_write_frame(ofmt_ctx, &pkt);
        if (ret < 0) {
            printf( "Error muxing packet\n");
            break;
        }

        av_free_packet(&pkt);
    }
    //写文件尾(Write file trailer)
    av_write_trailer(ofmt_ctx);
end:
    avformat_close_input(&ifmt_ctx);
    /* close output */
    if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))
        avio_close(ofmt_ctx->pb);
    avformat_free_context(ofmt_ctx);
    if (ret < 0 && ret != AVERROR_EOF) {
        printf( "Error occurred.\n");
        return -1;
    }
    return 0;
}
  1. 用VLC播放rtmp://阿里云服务器公网ip/live/livestream
<think>嗯,用户问的是如何在Windows上开启rtsp-simple-server。首先,我需要确认rtsp-simple-server是什么。根据我的知识,这是一个开源的RTSP服务器,用于流媒体传输,通常用于视频直播或者监控系统中。用户可能想搭建一个本地的RTSP服务器测试或者实际应用。 接下来,我需要考虑用户的操作系统是Windows,所以步骤需要针对Windows环境。首先应该指导用户下载正确的版本。rtsp-simple-server的GitHub仓库通常会有Windows的可执行文件,比如.exe文件或者压缩包。用户可能需要访问GitHub的发布页面下载最新的版本。 然后,解压下载的文件到某个目录,比如D:\rtsp-simple-server。接着,用户需要配置服务器。可能需要修改配置文件,比如rtsp-simple-server.yml,设置端口、认证、流路径等。如果用户不需要复杂配置,可能默认配置就足够,但需要说明如何自定义。 运行服务器的话,在Windows下可以通过命令行执行.exe文件,或者编写一个批处理脚本方便启动。用户可能需要知道如何保持窗口打开,以便查看日志。此外,防火墙设置可能会阻止外部访问,所以需要提醒用户允许程序通过防火墙,或者开放相应的端口,如554(RTSP默认端口)和1935(RTMP)。 推流和拉流部分,用户可能需要使用FFmpeg或者OBS等工具推流到服务器,然后用VLC等播放器测试拉流。这里需要给出具体的命令示例,比如FFmpeg的命令行参数,以及VLC的打开URL方式。 可能遇到的问题包括端口冲突、配置错误、权限不足等。需要建议用户检查日志,确认端口是否被占用,配置文件是否正确。另外,路径问题也很重要,确保配置文件在正确的位置,或者通过命令行参数指定。 最后,提醒用户注意安全,比如默认配置可能没有认证,暴露在公网会有风险,建议设置密码或者限制访问。还可以提到查看官方文档获取更多配置选项,比如TLS加密、日志设置等。 总结一下,步骤应该是下载、解压、配置、运行、推流测试、处理防火墙和常见问题。需要确保每个步骤清晰,命令行示例准确,特别是Windows下的路径和命令可能与Linux不同,需要注意反斜杠和空格的处理。可能用户对命令行不熟悉,所以需要给出具体的例子,比如cd命令和启动命令。另外,配置文件的位置和修改方法也需要明确,避免用户找不到文件。</think>以下是Windows系统下开启rtsp-simple-server的详细步骤: 1. **下载安装包** - 访问GitHub发布页:https://github.com/aler9/rtsp-simple-server/releases - 下载最新版 `rtsp-simple-server_windows_amd64.zip` 2. **解压文件** ```powershell Expand-Archive -Path .\rtsp-simple-server_windows_amd64.zip -DestinationPath D:\rtsp-simple-server ``` (建议路径不要包含中文或空格) 3. **基础配置** 在解压目录中新建 `rtsp-simple-server.yml` 文件,示例配置: ```yaml rtsp: port: 8554 paths: cam1: source: tcp://192.168.1.100:554 live: source: ffmpeg -i rtsp://admin:[email protected]/Streaming/Channels/101 ``` 4. **启动服务** ```cmd cd /d D:\rtsp-simple-server rtsp-simple-server.exe ``` 5. **防火墙设置** ```powershell New-NetFirewallRule -DisplayName "RTSP Server" -Direction Inbound -Protocol TCP -LocalPort 8554,1935 -Action Allow ``` 6. **推流测试** 使用FFmpeg推流命令: ```cmd ffmpeg -re -i test.mp4 -c copy -f rtsp rtsp://localhost:8554/mystream ``` 7. **客户端验证** 使用VLC播放器打开: ``` rtsp://你的服务器IP:8554/mystream ``` **常见问题排查**: 1. 端口冲突:使用 `netstat -ano | findstr :8554` 检查端口占用 2. 查看实时日志:启动时添加 `--log-level debug` 参数 3. 后台运行:使用 `start /B rtsp-simple-server.exe` 保持后台服务 **高级功能**: - HTTPS支持:在配置中启用 `encryption` 部分 - 认证配置:添加 `readUser` 和 `readPass` 字段 - HLS输出:配置 `hls` 段实现HTTP直播流 建议通过 `-conf` 参数指定配置文件路径: ```cmd rtsp-simple-server.exe -conf D:\config\custom_config.yml ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值