开发实现C++ RTMP直播推流sdk

2023-05-16

前言

rtmp即Real Time Messaging Protocol(实时消息传输协议)的首字母缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。
目前现在流行的是直播技术, 大部分都是采用该协议;本文档重点用C++开发实现了RTMP直播推流sdk部分,并使之跨平台通用。
简单的结构如下:

3.png

主要接口设计

class  SRLibRtmpInterface
{
public:    
    virtual int Connect(const char* url) = 0;
    virtual int StartRtmpSend(int EnableVideo, int EnableAudio) = 0;
    virtual int InitVideoParams(SR_VideoCodecSetting videoCodecSetting) = 0;
    virtual int InitAudioParams(SR_AudioCodecSetting audioCodecSetting) = 0;
    virtual int SetAudioDelay(int msecs) = 0;
    virtual int StartRecordMp4File() = 0;
    virtual int StopRecordMp4File() = 0;
    virtual int SendYUVCapture(unsigned char * yuvframe, int  yuvframeLen, unsigned long nTimeStamp) = 0;
    virtual int SendPCMFrame(unsigned char * pcmframe, int  frameLen, unsigned long nTimeStamp) = 0;
    virtual int Close() = 0;

    SRLibRtmpInterface(){};
    virtual ~SRLibRtmpInterface() = 0;

}
  • 用户直接设置需要连接的url 例如腾讯云的推流地址
  • 用户直接输入yuv和pcm数据,推流sdk打包推送到各个平台
  • 用户可以录制本地推送的流到mp4 文件

H264编码

int i_frame_size_byte = x264_encoder_encode(_enc, &nalu, &num_nals, &xpic, &oxpic);

    if(i_frame_size_byte < 0)
    {
        xbase::XLog::Printf("EncodeX264", xbase::XLOG_ERR, "x264 encode failed");
        return -1;
    }

    if(num_nals <= 0)
    {
        xbase::XLog::Printf("EncodeX264", xbase::XLOG_ERR, "frame delayed in encoder.");
        return -2;
    }

    _frameNbr++;


    for(int i = 0; i < num_nals; i++)
    {
           //unsigned char nalu_header[4] = { 0, 0, 0, 1 };
            //fwrite(nalu_header, 1, 4, fp_h264);
            //fwrite(nalu[i].p_payload, 1, nalu[i].i_payload, fp_h264);
        x264_nal_t &nal = nalu[i];

        if (nal.i_type == NAL_SPS)
        {
            uint8_t * h264Data = nal.p_payload;

            if (video_broadcaster)
            {
                base::DataBuffer* RecvdataBuf = new base::DataBuffer(h264Data, nal.i_payload);
                video_broadcaster->PreSendVideoDataPacket(RecvdataBuf, nTimeStamp, true);
            }

        }

        if (nal.i_type == NAL_PPS)
        {

            uint8_t * h264Data = nal.p_payload;

            if (video_broadcaster)
            {
                base::DataBuffer* RecvdataBuf = new base::DataBuffer(h264Data, nal.i_payload);
                video_broadcaster->PreSendVideoDataPacket(RecvdataBuf, nTimeStamp, true);
            }

        }

        if (nal.i_type == NAL_SLICE_IDR)
        {
            uint8_t * h264Data = nal.p_payload;

            if (video_broadcaster)
            {
                base::DataBuffer* RecvdataBuf = new base::DataBuffer(h264Data, nal.i_payload);
                video_broadcaster->PreSendVideoDataPacket(RecvdataBuf, nTimeStamp, true);
            }
        }



        if (nal.i_type == NAL_SLICE)
        {
            uint8_t * h264Data = nal.p_payload;

            if (video_broadcaster)
            {
                base::DataBuffer* RecvdataBuf = new base::DataBuffer(h264Data, nal.i_payload);
                video_broadcaster->PreSendVideoDataPacket(RecvdataBuf, nTimeStamp, false);
            }

        }
    }

分发器

本sdk加入了分发器的概念, 同一个流可以推动多个平台

4.png

rtmp打包

RTMP 协议栈的实现,这里使用的 srs-libRTMP,它提供的使用demo很多,代码设计也很精炼

联系

点击链接加入群【rtmp直播交流学习合作】:https://jq.qq.com/?_wv=1027&k=4Aqm21F
qq群号:559425694
email:zhanchonglongba@126.com/690759587

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开发实现C++ RTMP直播推流sdk 的相关文章

随机推荐

  • ubuntu系统python实现串口通信

    我使用的是USB TTL串口 xff0c 下面是测试之前的一些准备工作 span class token function ls span dev span class token comment 查看设备 xff0c 插拔串口设备注意有没
  • __FILE__,__func__,__LINE__用法举例

    C语言中 xff0c FILE func LINE 常用于logout xff0c 打trace xff0c debug调试 注意 xff1a 其使用不需要定义 xff0c FILE 指示当前文件名 func 指示当前函数名 LINE 指示
  • STM32 串口超时中断+DMA接收不定长数据 比 空闲中断(IDLE)更加灵活、稳定(一)

    前言 xff1a 最近项目有使用串口接收大段不定长GPS数据的需求 xff0c 调试了很久 xff0c 终于找到一个比较好的解决办法 我觉得这个项目需求 xff08 高波特率 大段数据 不定长 xff09 十分典型 xff0c 所以在这里记
  • STM32串口通信(基于缓冲区)

    一 串口的初始化和中断设置 1 初始化GPIO xff1a 根据手册的8 1 11节 xff0c 我们可以找到下表 xff1a 在全双工的模式下 xff0c 发送引脚需要设置为推挽复用输出 xff0c 接收引脚则设置为浮空输入或带上拉的输入
  • STM32与C#上位机串口通信示例

    1 概述 串口通信是一种非常常用的通信方式 xff0c 本文首先介绍了串口硬件和协议的相关内容 xff0c 然后给出一个STM32与C 上位机通过串口通信的示例 2 串口介绍 参考这份文档 3 通信协议 为了方便数据传输 xff0c 定义了
  • 【转】23个常用的VSCode快捷键(动图演示)

    尽管我们经常使用 VS Code中的许多快捷方式 xff0c 但是我们有可能会忘记它们 这里用可视化制作了一些GIF xff0c 以便更好地记住它们 xff0c 希望对你有所帮助 VSCode中的每个命令也可以通过使用CTRL 43 SHI
  • HI3531编码h.264文件播放偏慢分析随笔

    现象 xff1a 编码h 264文件播放时 xff0c 无论帧率是30fps还是60fps xff0c 播放器显示帧率为25 fps 探索过程 xff1a cat proc umap venc 显示得知 xff0c 编码的的确是30fps和
  • C++ const用法详解

    const 是C 43 43 中常用的类型修饰符 常类型是指使用类型修饰符const说明的类型 xff0c 常类型的变量或对象的值是不能被更新的 目录 一 const的作用 二 const修饰普通类型的变量 三 const修饰指针变量 四
  • Source Insight 4.0打开一会就闪退 解决方法

    遇到Source Insight 4 0打开直接闪退 xff0c 请不要着急卸载 xff0c 在Source Insight 4 0快捷键上 xff0c 点击属性 xff0c 选择兼容性如下 xff1a
  • secureCRT连接ubuntu18.04

    1 安装ssh服务器 sudo apt get install openssh server 2 ssh服务器安装失败 错误提示 xff1a 下列软件包有未满足的依赖关系 xff1a openssh server 原因 xff1a 系统预置
  • STM32——USART串口通信与串口重定向

    简介 UART 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称 作 UART 它将要传输的资料在串行通信与并行通信之间加以转换 作为把并行输入信 号
  • 海思文件系统缺少文件himm 、i2c_read 、i2c_write 、ssp_read 、ssp_write

    原因 xff1a 海思根文件默认没有把himm i2c read i2c write ssp read ssp write工具集成在bin里 xff0c 但是在sdk中 解决办法 xff1a cd osdrv tools board reg
  • Ubuntu 18.04 Samba服务器的安装和配置(详解)

    具体步骤 xff1a 1 设置为静态IP xff1a 点击静态IP设置链接 2 更新当前软件 sudo apt get upgrade sudo apt get update sudo apt get dist upgrade 3 安装sa
  • C52单片机(AT89C52)—流水灯

    本文重点 xff1a C52流水灯代码编写 xff0c keil如何生存hex文件和proteus如何导入hex文件 1 打开keil xff0c 建立工程 xff0c 编写如下代码 include lt reg52 h gt includ
  • Hi3516EV200图像调优

    一 平台搭建 1 将Hi3516EV200 PQ V1 0 0 3 tgz放到nfs挂载目录下解压 xff0c 进入Hi3516EV200 PQ V1 0 0 3 执行StartControl sh 2 执行HiPQTools exe xf
  • Qt低延时/可集成嵌入的网络播放器 –soundTouch的使用

    背景 在观看直播的过程中 xff0c 保不齐网络出现卡的现象 xff0c 可能导致音频数据包累积了好几秒的数据 xff0c 这时候要么丢直接播放新的 xff0c 要么直接播放基音 xff0c soundTouch可以加速播放并不要变调 主要
  • 超低延时直播rtmp推流

    项目起源 xff1a 改项目主要是基于类qt av的模式 xff0c 快速集成 xff0c 将ffmpeg融入到插件当中 xff0c 并提供本地的音频设备和视频设备的查找输出 xff0c 并可以采集各类虚拟摄像头 xff0c 酷狗直播助手
  • minio 使用aws c++ 多线程下载

    C 43 43 下载 Minio 文件 下载 aws sdk cpp git clone recurse submodules GitHub aws aws sdk cpp AWS SDK for C 43 43 麒麟上编译AWS cmak
  • 拉流推流服务器设计

    背景 该服务器也是基于一个客户的需求产生的 客户那边使用的是腾讯的直播sdk xff0c 将不同终端的流推到腾讯云平台 xff0c 但是又想推到其他平台 xff0c 基于此需求 xff0c 该产品产生了 该产品通讯协议使用的是WebSock
  • 开发实现C++ RTMP直播推流sdk

    前言 rtmp即Real Time Messaging Protocol xff08 实时消息传输协议 xff09 的首字母缩写 xff0c 它是由Adobe公司提出的一种应用层的协议 xff0c 用来解决多媒体数据传输流的多路复用 xff