开发实现C++ RTMP直播推流sdk
来源:互联网 发布:淘宝返现卡片 编辑:程序博客网 时间:2024/05/18 13:45
前言
rtmp即Real Time Messaging Protocol(实时消息传输协议)的首字母缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。
目前现在流行的是直播技术, 大部分都是采用该协议;本文档重点用C++开发实现了RTMP直播推流sdk部分,并使之跨平台通用。
简单的结构如下:
主要接口设计
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加入了分发器的概念, 同一个流可以推动多个平台
rtmp打包
RTMP 协议栈的实现,这里使用的 srs-libRTMP,它提供的使用demo很多,代码设计也很精炼
联系
点击链接加入群【rtmp直播交流学习合作】:https://jq.qq.com/?_wv=1027&k=4Aqm21F
qq群号:559425694
email:zhanchonglongba@126.com/690759587
阅读全文
0 0
- 开发实现C++ RTMP直播推流sdk
- 安卓直播开源: RTMP 推流SDK
- 安卓直播开源: RTMP 推流SDK
- rtmp推流直播流程
- 使用ffmpeg实现RTMP的直播推流功能
- 直播推流实现RTMP协议的一些注意事项
- 直播推流实现RTMP协议的一些注意事项
- 直播推流实现RTMP协议的一些注意事项
- 直播推流实现RTMP协议的一些注意事项
- 直播推流nginx-rtmp-module集成
- FFmpeg+RTMP 直播 iOS推流
- Android RTMP直播推流方案选择
- 学习SRS(SimpleRtmpServer)--推流+直播rtmp+直播hls
- iOS开发之利用IJKPlayer+nginx+rtmp搭建直播的推流和拉流
- 在hi3518EV200模组上用ffmpeg实现rtmp推流直播测试
- 将EasyRTMP_RTSP移植到Android平台实现的RTSP拉流转推RTMP直播流功能
- ffmpeg+EasyDSS流媒体服务器实现稳定的rtmp推流直播
- 搭建nginx rtmp直播服务器,ffmpeg模拟推流
- 动态规划----传纸条
- HashSet类注释翻译、fast-fail、源码分析
- strchr函数的用法小总结
- oracle锁表当客户端杀掉会话不成功可以服务端杀掉进程
- Android 面试之 Android 篇 发表于 2016-10-27 | 分类于 Android 面试 | | 阅读次数 2249 本文出自 Eddy Wiki ,转载请注
- 开发实现C++ RTMP直播推流sdk
- union
- 算法map简单用法
- 栈 介绍及简单实现
- 转换函数
- Unix/Linux编程实践教程–chmod在Centos7.3的实现
- JVM内存划分
- Eclipse防止定义变量名时后面追加类型后缀
- iOS 运用Runtime机制扩大UIButton的响应区域