<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    使用ffmpeg向crtmpserver發布rtsp流

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    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;

    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全