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

news2024/9/28 1:21:36

ffmpeg可以实现这个功能。ffmpeg支持rtsp协议,也支持rtmp。在这个案例中rtsp是输入,

rtmp是输出,ffmpeg实现了转码的功能。下面可出一个整体思路流程图。

 

     如图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)
{
    AVDictionary *opts = 0;
    av_dict_set(&opts, "rtsp_transport", "tcp", 0);
    int ret = avformat_open_input(&inf_context, in_fileName, nullptr, &opts);
    
    if (ret < 0)
    {
        cout << "can not open input file" << endl;
        return ret;
    }
    ret = avformat_find_stream_info(inf_context, nullptr);
    if (ret< 0 )
    {
        cout << "Failed to retrieve input stream information" << endl;
    }
    
    av_dump_format(inf_context, 0, in_fileName, 0);
    
    auto codecContext = inf_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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

检测之VOC转YOLO

文章目录检测所用数据有几种文件格式&#xff0c;我们对于检测&#xff0c;将使用VOC格式做为基础&#xff0c;与其它格式的的互转实现部分如下&#xff1a;检测系列相关文章参考如下链接&#xff1a; VOC数据的结构介绍及自定义生成&#xff0c;用labelimg自已标注VOC标准数据…

Notepad++作死,国产文本编辑器Notepad--发布

作死的Notepad Notepad 和 Notepad 都是基于 Windows 的文本编辑器&#xff0c;通常用于编写和编辑纯文本文件。 这两个应用程序都是简单的轻量级程序&#xff0c;提供基本的文本编辑功能。 Notepad是一口君经常使用的一款文本编辑软件&#xff0c;用了大概10年了。 然而Not…

配置并行(RH294)

当Ansible处理playbook的时候会顺序运行每个play确定play的主机列表之后Ansible将按顺序运行每个任务一般来说&#xff0c;所有主机必须在任何主机在play中启动下一个任务之前成功完成任务理论上&#xff0c;Ansible可以同时连接到play中的所有主机来执行每项任务Ansible所进行…

​力扣解法汇总1669. 合并两个链表

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。…

解决Vue启动失败报错:Module not found: Error: Can‘t resolve ‘less-loader‘

问题描述 今天想在网上找一个好看的登录页面&#xff0c;把别人的代码引入进来之后&#xff0c;发现项目编译不了&#xff0c;并且报错了&#xff1a; Module not found: Error: Can’t resolve ‘less-loader’ 分析问题 从错误的日志就可以看出来&#xff0c;是缺少了less-…

Linux: 关于 SIGCHLD 的更多细节

僵尸进程 何为僵尸进程&#xff1f; 一个进程使用fork创建子进程&#xff0c;如果子进程退出&#xff0c;而父进程并没有调用 wait 或 waitpid获取子进程的状态信息&#xff0c;那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程成为僵尸进程的因素 子进程 先…

AOP的一点浅薄理解

AOP思想应该怎么去理解&#xff01; Aspect&#xff08;切面&#xff09;&#xff1a; Aspect 声明类似于 Java 中的类声明&#xff0c;在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。 Joint point&#xff08;连接点&#xff09;&#xff1a;表示在程序中明确定义的点…

C语言学习笔记-变量

我们知道每一个程序的运行都需要内存&#xff0c;那么C语言的变量的定义是什么含义呢&#xff1f; 假如我花了200元买了一块4G内存条&#xff0c;然后我定义了一个int a ;就意味着从这4G的内存上要拿走4个字节&#xff0c;又定义了一个int b&#xff1b;那么b同样也要从4G的内存…

【OpenGL学习】OpenGL实现 基于Phong模型的基础光照

基于Phong模型的基础光照 在本节中&#xff0c;我们将利用 Phong 光照模型来完成一个简单的光照场景的渲染。 一、Phong 光照模型 Phong光照模型是20世纪70年代被提出的一种渲染逼真图像的方法&#xff0c;模型的提出者是越南出生的计算机图形学研究员Bui Tuong Phong&#…

JavaScript中的String和自定义对象~

String对象&#xff1a; 它是 JavaScript 的一种基本的数据类型 String 对象的 length 属性声明了该字符串中的字符数&#xff0c;String 类定义了大量操作字符串的方法&#xff0c;例如从字符串中提取字符或子串&#xff0c;或者检索字符或子串 需要注意的是&#xff0c;Ja…

单行文本域,多行文本域隐藏问题

多行文本域隐藏问题 overflow: hidden; 首先是溢出隐藏&#xff0c;不可或缺 display: -webkit-box; 以弹性盒模型显示 -webkit-box-orient: vertical; 盒模型元素的排列方式 -webkit-line-clamp: 3; 显示行数 <style>.postnameStyle{font-size: 30rpx;font-weight: …

【科研】ET-BERT资料库梳理

作者原repo链接 https://github.com/linwhitehat/ET-BERT 0.资料总库 分为数据模型语料库 1.数据集 包含fine-tuning数据集&#xff08;cstnet-tls 1.3&#xff09;与公开数据集&#xff08;USTC-TFC、VPN-app、VPN-service的数据包级和流级&#xff09;目录链接 1.1 微调…

【博客602】net.ipv4.conf.eth0.route_localnet的作用

net.ipv4.conf.eth0.route_localnet的作用 背景&#xff1a;默认情况下不能将本机的请求跳转/转发到回环接口上 在某些场景下会用在一台主机内网络流量重定向&#xff0c;比如将在本机回环设备中的数据包强行转发到另一台主机上。结果发现原本在正常的NAT场景中生效的iptables…

windbg抓一个windows蓝屏分析

前言 设备一直以来挺稳定&#xff0c;但还是小概率事件意外出现某设备突然蓝屏了。查看windows事件查看器提示计算机已经从检测错误后重新启动。检测错误: 0x0000009f (0x0000000000000003, 0xffffad0f4edc7570, 0xfffff8046a09ec20, 0xffffad0f4ef318a0)。已将转储的数据保存…

搭建不同网络训练MNIST

问题在之前的学习过程中&#xff0c;我们学习了如何搭建全连接神经网络训练Mnist数据集。初始时&#xff0c;全连接神经网络训练结果验证集和训练集的精确度不高&#xff0c;在对数据进行归一化&#xff0c;调参等操作提高了精确度。我们这次使用Le-Net5和VGG对MNIST进行训练&a…

STM32—串口

串口介绍 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简单&#xff0c;只…

.NET MAUI 安卓 UI 资源设置

本文主要介绍使用 MAUI 开发安卓应用时&#xff0c;如何更换和处理 UI 资源&#xff1a;应用名称&#xff0c;图标&#xff0c;主题配色&#xff0c;状态栏&#xff0c;闪屏。 文章目录1. 背景2. 资源设置2.1 项目创建2.2 应用名称2.3 应用图标2.4 应用闪屏2.5 沉浸式状态栏1. …

通用智能如何拥有生命的简单设计

如第一个图所示 是和环境交互的时候 行为交互时间和环境反馈时间T0 T1 还有行为消耗能量E0 环境反馈能量E1 如图有四种情况 其中反馈时间T1小于交互时间T0的任务是积极反馈 和打游戏一样要及时反馈才能提起兴趣 这个是整个行为交互过程中最小的记录单元 图二的每个元素都代表多…

STM32项目-STM32智能小车-电子设计大赛-STM32cubemx-STM32f103c8t6STM32串口通信-

记录项目的详细制作过程&#xff0c;所以笔记很长&#xff0c;图很多、很多图不好CSDN搬运&#xff0c; 我把笔记放网盘或者自己根据资料下载 笔记网盘下载: 链接&#xff1a;https://pan.baidu.com/s/1Mk2EVIha7Fpj4Xductg3Uw?pwdVCC1 提取码&#xff1a;VCC1 笔记CSDN下载:…

C++11 入门

作者&#xff1a;小萌新 专栏&#xff1a;C进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍C11的一些背景知识 本篇博客主要是讲解一些关键字 C11前言C11诞生简介列表初始化{}初始化关键字autodecltypenullptr范围forSTL的更…