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 < 0){return  ret;}ret = avformat_find_stream_info(context,nullptr);auto codecContext = context->streams[0]->codec;ret = avcodec_open2(codecContext, avcodec_find_decoder(codecContext->codec_id), nullptr);return ret;
}

返回值小于0  表示打开流失败。

三. 创建输出流

int OpenOutput(char *fileName)
{int ret = 0;ret  = avformat_alloc_output_context2(&outputContext, nullptr, "flv", fileName);if(ret < 0){goto Error;}ret = avio_open2(&outputContext->pb, fileName, AVIO_FLAG_READ_WRITE,nullptr, nullptr);    if(ret < 0){goto Error;}for(int i = 0; i < context->nb_streams; i++){AVStream * stream = avformat_new_stream(outputContext, nullptr);ret = avcodec_copy_context(stream->codec, context->streams[i]->codec);    if(ret < 0){goto Error;}}ret = avformat_write_header(outputContext, nullptr);if(ret < 0){goto Error;}return ret ;
Error:if(outputContext){for(int i = 0; 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 >= 0){return packet;}else{return nullptr;}
}

五. 写Packet到服务端

1

av_interleaved_write_frame(outputContext, packet.get());

六. 简单demo

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

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秒左右。

rtsp实时流通过rtmp推送到服务端相关推荐

  1. OPPO消息推送服务器,OPPO推送平台服务端API.PDF

    OPPO推送平台服务端API.PDF OPPO推送平台服务端API 修订记录: 版本号 修订人 修订日期 修订描述 V0.1 宫建涛 2017-03-28 初始版本 V0.2 宫建涛 2017-07- ...

  2. 快应用消息推送push服务端开发

    文章目录 快应用消息推送push开发 一.设备信息保存 1.设备id的生成 1-1生成规则 1-2生成弊端 1-3更为简单的方式保证唯一性 2.不合法regId的过滤 3.上报更多设备信息 4.程序实 ...

  3. 用JPUSH极光推送实现服务端向安装了APP应用的手机推送消息(C#服务端接口)

    这次公司要我们做一个功能,就是当用户成功注册以后,他登录以后要收到消息,当然这个消息是安装了我们的手机APP应用的手机咯. 极光推送的网站的网址是:https://www.jpush.cn/ 极光推送 ...

  4. erlang-百度云推送Android服务端功能实现-erlang

    百度云推送官方地址http://developer.baidu.com/wiki/index.php?title=docs/cplat/push 简单的介绍下原理: 百度云推送支持IOS和Androi ...

  5. java百度云推送demo_百度云推送java服务端maven安装完整demo

    /*** 推送单播通知 *@author* @Date 2017年3月2日 * @Desc*/ public classBaiduPush {publicString[] pushNotificati ...

  6. 小米推送之服务端简单开发

    1.获取SDK,并写入常量表 2.引入MiPush_SDK_Sever.jar文件和json-simple-1.1.1.jar 3.开发服务端代码(这里是用别名进行推送) /*============ ...

  7. 友盟消息推送java服务端

    基本概念 appkey:应用唯一标识 app_master_secret:服务器Key. device_token: 友盟后台对设备的唯一标识.注意, Android的device_token是44位 ...

  8. 极光推送java服务端-通知(2)

    1.下载SDK REST API为极光推送开发API 2.下载好后,maven导入后可以参考示例 官方demo 4.小demo // 设置好账号的app_key和masterSecret是必须的pri ...

  9. 华为消息推送 有透传通道吗_华为推送之服务端简单开发

    个人觉得华为推送官方文档写得太....哈哈!完全符合复制拿来用就好,今天我也去复制一番. 1.获取华为appSecretKey和appId 2.然后就是复制官网的代码(是不是纯copy),最后就最后了 ...

最新文章

  1. 通信系统中对眼图的理解(一)
  2. 关于android Activity生命周期的说明
  3. 安装 CORD 之前需要了解的术语
  4. URI和URL及URN的区别
  5. 微型计算机c560,2010广东省计算机等级考试试题 二级C试题最新考试试题库
  6. 3dsmax子菜单无法选择_3DsMax—用平面图片制作3D模型
  7. [js] 你是如何比较js函数的执行速度的?
  8. 九章算法 第七到九章 预习笔记
  9. 华为服务器装系统一直在读盘,系统重装一直在启动服务器
  10. [蓝点zigBee] CC2530 实用教程总览
  11. 自学移动端(APP)自动化测试
  12. 【可视化应用案例】使用ProPlot绘制兰伯特投影的填色图
  13. 八皇后算法python_八皇后问题遗传算法实现(python版)
  14. Photoshop 2023 支持 M1 Mac下载
  15. android熄屏微信收到原理,求助,如何才能在息屏状态下显示收到的微信消息内容?...
  16. 虚拟机的网络改为桥接网络
  17. Hibernate_8_Person和IdCard实例_一对一关系:基于外键
  18. 2021哈工大计算机考研复试名单,哈尔滨工业大学各学院2021年硕士研究生复试名单...
  19. 【RevitAPI】Revit产品按钮自带信息(名称+ID)
  20. window 下 jdk11安装与环境变量的配置(超级详细)

热门文章

  1. 设备上的介质簇的结构不正确_环保设备选型参考系列——生化系统之潜水搅拌机【价格】...
  2. STM32 I2C通信(读写eeprom)
  3. linux写文件操作同步,linux 可执行文件与写操作的同步问题(文件读写操作产生的锁机制)...
  4. 安徽省第二次计算机水平考试,2006第二次安徽省计算机水平考试试卷(ACCESS).doc...
  5. ML、DL、CNN学习记录7
  6. markdown引入代码_第 09 篇:让博客支持 Markdown 语法和代码高亮
  7. 《深入理解 Spring Cloud 与微服务构建》第八章 声明式调用 Feign
  8. 刷题总结——湫湫系列故事——设计风景线(hdu4514 并差集判环+树的直径)
  9. AM5728通过GPMC接口与FPGA高速数据通信实现
  10. 《深入分析Linux内核源代码》读书、私藏笔记大放送