zoukankan      html  css  js  c++  java
  • 使用ffmpeg向crtmpserver发布rtsp流

    ffmpeg的调用命令如下:

    ffmpeg -re -i xxx.mp4  -vcodec copy -acodec copy -f rtsp rtsp://127.0.0.1/live/mystream

    用ffmpeg做输入测试

    ffmpeg -re -i "E:片源复仇者联盟720p.mov" -vcodec copy -acodec copy -f flv rtmp://192.168.11.75/live/test1
    ffmpeg -re -i "E:片源复仇者联盟720p.mov" -vcodec copy -acodec copy -f flv rtmpt://192.168.11.75:8080/live/test1

    音视频的编码格式只能为H264、AAC。

    发布以后可以通过rtmp的方式点播,流名称是从s=No Name获取的,即名称就叫“No Name”,而不是ffmpeg命令中rtsp URL地址上的“mystream”。这样就存在一个问题,不能通过ffmpeg向crtmpserver发布多路流了,因为流的名称都为“No Name”。

    从crtmpserver的日志可以看到sdp如下(需要将sources/thelib/include/protocols/rtp/rtspprotocol.h中的RTSP_DUMP_TRAFFIC定义打开):

    ANNOUNCE rtsp://127.0.0.1:554/live/mystream RTSP/1.0

    Content-Type: application/sdp

    CSeq: 2

    Content-Length: 498

    v=0

    o=- 0 0 IN IP4 127.0.0.1

    s=No Name

    c=IN IP4 127.0.0.1

    t=0 0

    a=tool:libavformat 54.63.104

    m=video 0 RTP/AVP 96

    b=AS:509

    a=rtpmap:96 H264/90000

    a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z0KAIJZSAKwMPN4CoQAAAwABAAADAAadoYMkgA==,aMuNSA==; profile-level-id=428020

    a=control:streamid=0

    m=audio 0 RTP/AVP 97

    b=AS:102

    a=rtpmap:97 MPEG4-GENERIC/44100/2

    a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1210

    a=control:streamid=1

    解决方法:

    修改sources/thelib/src/protocols/rtp/basertspappprotocolhandler.cpp文件的HandleRTSPRequestAnnounce函数,原来的代码为

        string streamName = sdp.GetStreamName();

        if (streamName == "") {

            streamName = format("rtsp_stream_%u", pFrom->GetId());

        }

        pFrom->GetCustomParameters()["sdpStreamName"] = streamName;

    即流名称是从sdp的s字段获取的。

    需要改为从url获取,为了方便解析,可规定url中"?"后面的为流名称,形式为rtsp://127.0.0.1/live?mystream。如果url中没有"?",会使用ID命名为“rtsp_stream_ID”的形式。

    代码相应改为:

        vector<string> lines;

        string streamName;

        split(requestHeaders[RTSP_FIRST_LINE][RTSP_URL], "?", lines);

        if (lines.size()  != 2) { 

            streamName = format("rtsp_stream_%u", pFrom->GetId());

        }else {

            streamName = lines[1];

        }    

        pFrom->GetCustomParameters()["sdpStreamName"] = streamName;

  • 相关阅读:
    基于Networks of Brokers的HA方案
    淘宝开源任务调度框架tbschedule
    java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter
    spring boot1.3.0版本及以上版本profile指定参数无法被打入
    diffuse linux 文件比对工具
    PipedInputStream/PipedOutputStream原理
    应聘华为 16道经典面试题及回答思路
    MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 解决方法
    查看linux下某端口被哪个进程占用(linux命令)
    Python3判断自身脚本是不是在运行
  • 原文地址:https://www.cnblogs.com/lidabo/p/3906066.html
Copyright © 2011-2022 走看看