1. 程式人生 > >開發實現C++ RTMP直播推流sdk

開發實現C++ RTMP直播推流sdk

前言

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:[email protected]/690759587

相關推薦

開發實現C++ RTMP直播sdk

前言 rtmp即Real Time Messaging Protocol(實時訊息傳輸協議)的首字母縮寫,它是由Adobe公司提出的一種應用層的協議,用來解決多媒體資料傳輸流的多路複用(Multiplexing)和分包(packetizing)的問題。 目前

拋開flash,自己開發實現C++ RTMP直播播放器

  眾所周知,RTMP是以flash為客戶端播放器的直播協議,主要應用在B/S形式的場景中。本人研究並用C++開發實現了RTMP直播流協議的播放器(延遲極低,內網可以做到百毫秒,目前已經實現PC端和Android端),結合之前做的RTMP直播採集端,可以將RTMP協議完全擴充套件到C/S形式

day122:MoFang:OSSRS媒體直播伺服器&基於APICloud的acLive直播模組實現RTMP直播

目錄 1.docker安裝OSSRS流媒體直播伺服器 2.基於APICloud的acLive直播推流模組實現RTMP直播推流 3.直播流管理 1.docker安裝OSSRS流媒體直播伺服器 1.OSSRS簡介 在外界開發中, 如果要實現直播功能.常用的方式有: 1. 通過第三方介面來實現. 可以申請阿里雲

[轉]不用任何第三方,寫一個RTMP直播

2016年是移動直播爆發年,不到半年的時間內無數移動直播App掀起了全民直播的熱潮。然而個人覺得直播的門檻相對較高,從推流端到服務端器到播放端,無不需要專業的技術來支撐,僅僅推流端就有不少需要學習的知識。目前大部分直播採用的都是RTMP協議,我這裡寫一個簡單的Demo,幫助大家更好的理解直播推流的過

騰訊直播——SDK(Android)

功能篇 騰訊視訊雲RTMP SDK由兩部分構成:推流器 + 播放器,本文將主要介紹推流器的相關資訊。 該SDK遵循標準RTMP視訊推送協議,可以對接包括騰訊雲在內的標準視訊直播伺服器。與此同時,SDK內部囊括了騰訊音視訊團隊多年的技術積累,在視訊壓縮、硬體加速、美顏濾鏡、音訊降噪、位元速率控制等方面都

FFmpeg+Nginx搭建RTMP直播服務

    Nginx是優秀的開源並且可以新增外掛的服務端,其中就有開源的RTMP外掛nginx-rtmp-module實現了RTMP推流服務。     專案地址為: https://github.com/arut/nginx-rtmp-module 搭建思路:    

不用任何第三方,寫一個RTMP直播

壓縮後的視訊幀:壓縮後的視訊有三種幀型別:I ,B ,P幀,I幀也叫關鍵幀。經過解碼後能夠獨立展示出一幅影象,P幀是前向預測幀,參考前一幀才能解碼顯示出一幅完整的影象。B 為雙向預測幀,必須參考前一幀和後一幀才能解碼出影象,因此幀的壓縮比最低,大約為0.7,它只能採用幀內壓縮,P幀壓縮比次之,大概能達到0.

手機直播開發雜談之:直播原生源碼+APP+直播系統SDK(Android)

手機直播源碼 手機軟件開發情不知所起而一往情深心不知所動而生死相許先朗誦兩句詩詞抒發一下美好的心情,正如兩句詩詞一樣,我的心慢慢的也被這個自媒體時代的直播網絡所偷走,時代的變化註定這個時代的文化,下面是我對直播開發一些淺顯的解析:第一步:分解手機直播系統開發功能,了解你所需要的直播功能第二步:尋找合適的雲

直播實現RTMP協議的一些注意事項

018年8月4日第三次更新,詳細介紹了RTMP協議與遇到的坑,另外純Java重寫了RTMP協議,做了個Android 推流專案,包含安卓相機採集,編碼和RTMP推流,上傳到github了。 專案地址:https://github.com/gezhaoyou/SimpleLivePublisherLi

iOS直播--Nginx伺服器搭建和RTMP,HLS實現

Nginx介紹Nginx ("engine x") 是一個高效能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。Nginx是由Igor Sysoev為俄羅斯訪問量第二的Rambler.ru站點開發的,第一個公開版本0.1.0釋出於2004年10月

nginx-rtmp-module授權機制實現直播多房間授權認證

假設nginx直播伺服器已經搭建完畢,如果還沒有搭建完畢可以查閱利用nginx的nginx-rtmp-module搭建流媒體直播伺服器這篇文章。在開發直播專案時推流應該是需要做許可權認證的,不是任何人都可以隨意向直播伺服器推流,這就需要許可權認證,實現起來也不復雜,只需要在nginx配置檔案中的rt

使用ffmpeg實現RTMP直播功能

其中檔名in_filename為輸入檔名,out_filename為輸出rtmp地址。 void UpliveThread::uplive_process( ) { AVOutputFormat *p_ofmt = NULL; AVFor

寫代碼實現直播

global tag double 掌握 點播 -i void turn duration 花滿樓原創 小白:你之前介紹過使用nginx來實現直播,使用攝像頭來錄制,這些知識已經可以做到推流了。 花滿樓:之前是使用ffmpeg命令來推流,控制度不夠高,現在以代碼的方式

ubuntu下使用nginx和nginx-rtmp-module配置直播伺服器

本來準備在centos伺服器上搭建的,因為筆者工作系統是ubuntu,因此直接在本機上搭建,更方便快捷,配置過程比較簡單,記錄一下。 目錄 配置環境 安裝obs-studio開始第一次推流 安裝vlc播放器開始拉流 配置環境 配置環境 配

阿里直播SDK直播地址和播地址生成

最近,公司要搞螢幕遠端控制,包含了螢幕直播。一開始公司準備自己搭伺服器的,後來 公司java後臺說伺服器轉碼,前端還要外掛的,麻煩之類的。然後就變成了用阿里的SDK 一條龍服務。 不過 我自己在前期調研階段 ,也自己實現了直播推送H.264 到伺服器,伺服器轉發

視訊直播與拉實現

序言 最近在研究直播的彈幕,東西有點多,準備記錄一下免得自​​己忘了又要重新研究,也幫助有這方面需要的同學少走點彎路。關於直播的技術細節其實就是兩個方面一個是推流一個是拉流,而彈幕的實現核心在即時聊天,使用聊天室的就能實現,只是訊息的展示方式不同而已。在大多數的

iOS簡單直播實現(二:

 推流用的是一個第三方的IFLiveKit框架。這個框架基於rtmp協議的,c語言和oc語言分開的非常清楚,對oc語言非常友好,使用起來相對簡單。   IFLiveKit內部集成了GPUIImage。內部實現了圖片渲染等美豔效果。減少了開發時候美豔效果的除錯。   需

wex5 cordova直播與播放器外掛開發

1.android開發可實現功能的原生程式碼(能執行不會程式崩潰,不然後期在wex5中的h5頁面中js呼叫原生程式碼的時候會一直在jni_onload程式無反應)2.配置外掛檔案建立如下圖的目錄libs檔案中放外掛需要的依賴包等,res裡面存放的是android的原生程式碼中

直播nginx-rtmp-module整合

戰鬥民族俄羅斯人民開發的一款NGINX的流媒體外掛,除了直播發布音視訊流之外具備流媒體伺服器的常見功能 比如推拉流媒體資源 基於HTTP的FLV/MP4 VOD點播 HLS (HTTP Live Streaming) M3U8的支援 基於http的操

Android平臺使用EasyRTMP將RTSP轉RTMP進行RTMP直播

介紹 目前安防行業很多IP Camera只提供了RTSP播放地址,不支援RTMP協議,很難接入目前流行的網際網路直播中來。就需要一個程式或工具能夠將實時RTSP流轉成RTMP推送。EasyDarwin團隊提供過EasyRTMP_RTSP的Demo(下載地址ht