rtsp实时流通过rtmp推送到服务端
很多朋友都会问到rtsp如何通过rtmp协议推送到服务端,正好前段时间开发了这个功能写在这里,和大家分享下。
首先我想说的是:ffmpeg可以实现这个功能。ffmpeg支持rtsp协议,也支持rtmp。在这个案例中rtsp是输入,
rtmp是输出,ffmpeg实现了转码的功能。下面可出一个整体思路流程图。

图1
如图1所示:在获取都rtsp流以后,解复用(demux)获取ES流packet,最后将ES流封装成rtmp格式并发送
到服务端。
基本思路完毕,下面上代码。
一:初始化ffmpeg库
void Init()
{
av_register_all();
avfilter_register_all();
avformat_network_init();
av_log_set_level(AV_LOG_ERROR);
}
二. 打开rtmp视频流
int OpenInput(char *fileName)
{
context = avformat_alloc_context();
int ret = avformat_open_input(&context, fileName, nullptr,nullptr);
if(ret < )
{
return ret;
}
ret = avformat_find_stream_info(context,nullptr);
auto codecContext = context->streams[]->codec;
ret = avcodec_open2(codecContext, avcodec_find_decoder(codecContext->codec_id), nullptr);
return ret;
}
返回值小于0 表示打开流失败。
三. 创建输出流
int OpenOutput(char *fileName)
{
int ret = ;
ret = avformat_alloc_output_context2(&outputContext, nullptr, "flv", fileName);
if(ret < )
{
goto Error;
}
ret = avio_open2(&outputContext->pb, fileName, AVIO_FLAG_READ_WRITE,nullptr, nullptr);
if(ret < )
{
goto Error;
}
for(int i = ; i < context->nb_streams; i++)
{
AVStream * stream = avformat_new_stream(outputContext, nullptr);
ret = avcodec_copy_context(stream->codec, context->streams[i]->codec); if(ret < )
{
goto Error;
}
}
ret = avformat_write_header(outputContext, nullptr);
if(ret < )
{
goto Error;
}
return ret ;
Error:
if(outputContext)
{
for(int i = ; i < outputContext->nb_streams; i++)
{
avcodec_close(outputContext->streams[i]->codec);
}
avformat_close_input(&outputContext);
}
return ret ;
}
返回值小于0,创建输出流失败,以rtmp格式发送视频流一定要以flv格式初始化output context。
四. 读取Packet
shared_ptr<AVPacket> ReadPacketFromSource()
{
shared_ptr<AVPacket> packet(static_cast<AVPacket*>(av_malloc(sizeof(AVPacket))), [&](AVPacket *p) { av_free_packet(p); av_freep(&p);});
av_init_packet(packet.get());
int ret = av_read_frame(context, packet.get());
if(ret >= )
{
return packet;
}
else
{
return nullptr;
}
}
五. 写Packet到服务端
av_interleaved_write_frame(outputContext, packet.get());
六. 简单demo
int _tmain(int argc, _TCHAR* argv[])
{
string fileInput= "rtsp://admin:admin@172.29.183.103/media/video1/multicast";
string fileOutput="rtmp://127.0.0.1/live/mystream";
Init();
if(OpenInput((char *)fileInput.c_str()) < 0)
{
cout << "Open file Input failed!" << endl;
this_thread::sleep_for(chrono::seconds(1000));
return 0;
}
if(OpenOutput((char *)fileOutput.c_str()) < 0)
{
cout << "Open file Output failed!" << endl;
this_thread::sleep_for(chrono::seconds(1000));
return 0;
}
auto timebase = av_q2d(context->streams[0]->time_base);
while(true)
{
auto packet = ReadPacketFromSource(); if(packet)
{ int ret = av_interleaved_write_frame(outputContext, packet.get());
}
else
{
cout <<"write packet end!"<< endl;
break;
}
}
CloseInput();
CloseOutput();
cout <<"Transcode file end!" << endl;
this_thread::sleep_for(chrono::seconds(1000));
return 0;
}
七. 小结:
经测试,内网rtmp直播延时在1秒以内,公网延时在3,4秒左右。
如需交流,可以加QQ群766718184,或者QQ:350197870
视频教程 播放地址: http://www.iqiyi.com/u/1426749687
视频下载地址:http://www.chungen90.com/?news_3/
Demo下载地址: http://www.chungen90.com/?news_2
rtsp实时流通过rtmp推送到服务端的更多相关文章
- 转载:iOS 推送的服务端实现
参考网址1: iOS消息推送机制的实现 http://www.cnblogs.com/qq78292959/archive/2012/07/16/2593651.html 参考网址2: iOS 推送的 ...
- 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)
这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...
- iOS开发推送--客户端 服务端
1.推送过程简介 (1)App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请. ...
- 信鸽推送.net 服务端代码
//推送代码 private void send() { #region 安卓推送 XingeApp app = new XingeApp("accessId", "se ...
- Android消息推送的服务端
2.Android消息推送 MQTT服务器采用mosquito http://mosquitto.org/ PHP管理包采用phpmqttclient:https://github.com/toku ...
- 总结:极光推送java服务端(1)
遇到的问题: 1.怎么用极光推送 2.极光推送发送失败报错 返回{ } 3.透传和推送区别以及怎么设置 我的解决方案: 问题1.极光推送类里面有不同的方法,需要发给那些人就调用相应的方法.有安卓.io ...
- erlang-百度云推送Android服务端功能实现-erlang
百度云推送官方地址http://developer.baidu.com/wiki/index.php?title=docs/cplat/push 简单的介绍下原理: 百度云推送支持IOS和Androi ...
- 解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/74161115 引言 最近在测试EasyNVR ...
- Windows平台摄像头或屏幕RTMP推送介绍:OBS VS SmartPublisher
好多开发者问道,既然有了OBS,你们为什么还要开发SmartPublisher? 的确,在我们进行Windows平台RTMP推送模块开发之前,市面上为数不多的Windows平台RTMP推流工具当属OB ...
随机推荐
- JavaScript高级 Function类型
· Function类型 (属于引用类型) 1.JS中,有的函数均是对象,这个一个非常有特点的地方.它既然是对象,那么它的构造函数是谁呢?就是Function.(例如:function Pers ...
- puppet实现主从部署各种软件实战参考模型
puppet实现主从部署各种软件实战参考模型 实验要求: 1.我将准备三个节点 node2 , node3 , node4 2.我们想让节点node3部署ntp,nginx ;节点node ...
- linux下怎么编译运行C语言程序?
linux下的C语言编译器是gcc,C++的编译器是g++. linux下编程可以使用编辑器vi或vim,建议使用vim,因为它有语法高亮显示.程序编写好后,假设你的程序名为test.c,可以使用gc ...
- DevExpress 使用 XtraTabbedMdiManager 控件以 Tab样式加载 Mdi窗体并合并 RibbonControl 解决方案
最近刚接触到 DevExpress 13.1 这个皮肤组件, 觉得相当好用 于是开始准备搭建 个小应用的主体框架. 找了好久的就是没找到对应的文章来讲解这一块.. 翻了他们主网站上人家问的,以及API ...
- Python学习教程(learning Python)--1.2.2 Python格式化输出基础
本节讨论为何要格式化输出数据? 先看一段代码吧,本程序的功能是计算月支付金额. amount_due = 5000.0 #年支付金额 monthly_payment = amount_due / 12 ...
- StyleCop学习笔记——默认的规则
在StyleCop中有一些官方自己写好的检测规则下面就是英文的解释 文档规则 1.SA1600:ElementsMustBeDocumented元素必须添加注释 2.SA1601: PartialEl ...
- ThinkPHP目录结构
ThinkPHP框架目录结构 文件路径 文件描述 \index.php 入口文件 \Application 应用目录 \Public 资源文件目录 \ThinkPHP 框架核心目录 \Applic ...
- flask-cors 实现跨域请求
安装:pip install -U flask-cors from flask import Flask from flask.ext.cors import CORS app = Flask(__n ...
- AppCan认为,移动APP开发不是技术活
很多粉丝反应,AppCan的文章太专业了,技术大大们毫不费劲,小白看的晕乎乎. 时代变了,5年前,AppCan的受众只有开发者.现在,政府高管.集团董事长.非技术类管理者.中小企业主.各行各业的管理者 ...
- Android之通过向WebService服务器发送XML数据获取相关服务
原理图如下: 即客户端向WebService服务器通过HTTP协议发送XML数据(内部包含调用的一些方法和相关参数数据),然后WebService服务器给客户端返回一定的XML格式的数据 ...