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

2017-06-24  本文已影响589人  笑嗯嗯

前言

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;

}

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

上一篇下一篇

猜你喜欢

热点阅读