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

时间: 2024-10-22 06:18:09

使用ffmpeg向crtmpserver发布rtsp流的相关文章

nginx+ffmpeg搭建rtmp转播rtsp流的flash服务器

本文概要:         nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择.本文介绍了一种简易方法快速搭建rtmp流媒体服务器,也叫rtsp转播,数据源不是读取文件,而是采用获取rtspNal流后使用ffmpeg转播.csdn固本培元:leoluopy@gmail.com 开发环境:centos6.4 (主流的linux服务器选择,30%以上的市场占有率) 需要这几个包. 版本号:nginx 1.7.3  openssl 1.0.2   rtmp-mod

代码-如何利用ffmpeg库实现对实时rtsp流每一秒截一张图

问题描述 如何利用ffmpeg库实现对实时rtsp流每一秒截一张图 我想实现这个功能,利用ffmpeg库,对实时rtsp流每一秒截一张图.我自己写了段代码 while(av_read_frame(pAVFormatContext,&pAVPacket) >= 0){ if(pAVPacket.stream_index == videoStreamIndex){ avcodec_decode_video2(pAVCodecContext,pAVFrame,&m_i_frameFinis

ffmpeg rtsp rtmp-Ubuntu上用FFmpeg将rtsp流转换成rtmp流出错!

问题描述 Ubuntu上用FFmpeg将rtsp流转换成rtmp流出错! 使用"ffmpeg -i rtsp://admin:12345@172.27.35.55 -f flv rtmp://172.27.35.2/live/stream"命令时出错 其中172.27.35.2是我电脑的IP,172.27.35.55是网络摄像机的IP 解决方案 你本地有LiveServer吗?https://github.com/winlinvip/simple-rtmp-server

切片保存-FFmpeg对RTSP流能够切片吗?

问题描述 FFmpeg对RTSP流能够切片吗? 如题,我想将一个RTSP流切片保存为文件,命令如下:ffmpeg -i rtsp://192.168.21.82:554/aa.mp4 -vcodec copy -acodec copy -c copy -map 0 -f segment -segment_time 20 -segment_format mp4 /lishan/test/out%03d.mp4由于找不到现成的RTSP流,我在192.168.21.82上自己搭建了一个流媒体服务器,将

ffmpeg处理rtmp/文件/rtsp的推流和拉流

ffmpeg处理rtmp/文件/rtsp的推流和拉流   本demo演示了利用ffmpeg从服务器拉流或本地文件读取流,更改流url或文件类型名称发送回服务器或存到本地的作用. 由于本程序只写了3个小时,还要忙别的,所以会有一些bug和优化的地方.不过demo的意义已经达到了.   [cpp] view plain copy   //info.h   #ifndef __INFO_H__   #define __INFO_H__      #include <string.h>    #inc

FFmpeg实现监控摄像头的RTSP协议转RTMP协议直播

文章来源:http://www.cuplayer.com/player/PlayerCode/RTSP/2014/0706/1419.html     FFmpeg实现监控摄像头的RTSP协议转RTMP协议直播,我们使用的摄像头是海康的可以通过rtsp协议获取到摄像头的直播数据.所以可以通过 整理了一下要解决如下问题: 1.  摄像头的数据采集. 2.  如何将采集到的数据交给Red5处理. 3.  [FFmpeg]图文介绍windows下实现编译ffmpeg工程的详细步骤   解决方法: 1.

[求教]rtsp流的保存

问题描述 该项目是这样的,多种摄像机的实时监控,为统一所以使用onvif协议来实行实时监控,车牌识别,录像保存.现在通过onvif已经获取到相对应的rtsp流,并能实时播放软件项目是c/s架构的,用的C#,播放实时视频流用的vlc开发的由于项目需求,录像的保存是放在服务器上的,即保存录像时不需要播放问题:如何进行对应rtsp流的保存,或者是在onvif协议下,在C#下如何进行多路视频流的保存,大家给点意见或者是思路. 解决方案 解决方案二:问题已解决,通过ffmpeg来实现

android上 用ffmpeg解码rtp组播流

问题描述 android上 用ffmpeg解码rtp组播流 android上 用ffmpeg解码rtp组播流,avformat_find_stream_info这一步总是失败,错误信息是 Connection timed out,同样的代码linux下测试是没问题的,移植到android后就不行,这是为什么呢? 解决方案 Connection timed out 连接超时.看看网络处理是否正确!! 解决方案二: 权限,看看权限,打印一些日志.安卓上的各位权限都看看! 解决方案三: 我也遇到这个问

cpu-使用vlc串流将rtsp流保存成mp4文件,非常耗CPU

问题描述 使用vlc串流将rtsp流保存成mp4文件,非常耗CPU 用vlc将一个rtsp流的数据保存成mp4文件, 当只开一个vlc保存一路rtsp流时,4核i3处理器cpu占70%左右,但至少还能正常保存 mp4文件.但如果开两个vlc同时保存的话,cpu直接就100%了,而且保存的两个mp4文件都不是正常的,播放到中间就播不下去了.我怀疑是cpu不够,导致vlc没有完整的将接收的rtsp流数据保存成mp4文件,问题是在哪里呢,什么方法使用vlc的函数保存rtsp流