• 使用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;

  • 相关阅读:
    运算符和表达式详解
    超实用的Java web面试题
    80道最新java基础部分面试题(七)
    80道最新java基础部分面试题(六)
    80道最新java基础部分面试题(五)
    12道算法与编程面试题
    javaee和javase的区别
    2019年最新50道java基础部分面试题(四)
    2019年最新50道java基础部分面试题(三)
    2019年最新50道java基础部分面试题(二)
  • 原文地址:https://www.cnblogs.com/zjoch/p/3277056.html
Copyright © 2020-2023  润新知