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;

  • 相关阅读:
    数据结构 括号法二叉树转化为二叉链表链式存储结构
    数据结构 二叉树的非递归遍历算法再回顾
    C语言算法 设计一个算法,将数组m个元素循环右移。要求算法空间复杂度为O(1)
    JAVA 递归输出所有可能的出栈序列
    C语言数据结构 头尾指针数组的综合应用
    C语言 重写strcmp函数
    C语言数据结构 判断出栈序列合法性
    PMD执行Java代码分析的原理
    Redis缓存和MySQL数据一致性方案详解
    mybtais 源码分析
  • 原文地址:https://www.cnblogs.com/lidabo/p/3906066.html
Copyright © 2011-2022 走看看