librtmp h265 推流
h264和h265的区别:
h264和H265总的来说格式是一样的,H265多了一个VPS。
在解码H264时,sps、pps是必须的。而在解码H265时,sps、vps、pps是必须的。
//H264 NAL Type
typedef enum {NALU_TYPE_SLICE = 1,NALU_TYPE_DPA = 2,NALU_TYPE_DPB = 3,NALU_TYPE_DPC = 4,NALU_TYPE_IDR = 5,NALU_TYPE_SEI = 6,NALU_TYPE_SPS = 7,NALU_TYPE_PPS = 8,NALU_TYPE_AUD = 9,NALU_TYPE_EOSEQ = 10,NALU_TYPE_EOSTREAM = 11,NALU_TYPE_FILL = 12,
#if (MVC_EXTENSION_ENABLE)NALU_TYPE_PREFIX = 14,NALU_TYPE_SUB_SPS = 15,NALU_TYPE_SLC_EXT = 20,NALU_TYPE_VDRD = 24 // View and Dependency Representation Delimiter NAL Unit
#endif
} AvcNaluType;//H265 NAL Type
typedef enum
{ NAL_UNIT_CODED_SLICE_TRAIL_N = 0, // 0 NAL_UNIT_CODED_SLICE_TRAIL_R, // 1 NAL_UNIT_CODED_SLICE_TSA_N, // 2 NAL_UNIT_CODED_SLICE_TLA, // 3 // Current name in the spec: TSA_R NAL_UNIT_CODED_SLICE_STSA_N, // 4 NAL_UNIT_CODED_SLICE_STSA_R, // 5 NAL_UNIT_CODED_SLICE_RADL_N, // 6 NAL_UNIT_CODED_SLICE_DLP, // 7 // Current name in the spec: RADL_R NAL_UNIT_CODED_SLICE_RASL_N, // 8 NAL_UNIT_CODED_SLICE_TFD, // 9 // Current name in the spec: RASL_R NAL_UNIT_RESERVED_10, NAL_UNIT_RESERVED_11, NAL_UNIT_RESERVED_12, NAL_UNIT_RESERVED_13, NAL_UNIT_RESERVED_14, NAL_UNIT_RESERVED_15, NAL_UNIT_CODED_SLICE_BLA, // 16 // Current name in the spec: BLA_W_LP NAL_UNIT_CODED_SLICE_BLANT, // 17 // Current name in the spec: BLA_W_DLP NAL_UNIT_CODED_SLICE_BLA_N_LP, // 18 NAL_UNIT_CODED_SLICE_IDR, // 19 // Current name in the spec: IDR_W_DLP NAL_UNIT_CODED_SLICE_IDR_N_LP, // 20 NAL_UNIT_CODED_SLICE_CRA, // 21 NAL_UNIT_RESERVED_22, NAL_UNIT_RESERVED_23, NAL_UNIT_RESERVED_24, NAL_UNIT_RESERVED_25, NAL_UNIT_RESERVED_26, NAL_UNIT_RESERVED_27, NAL_UNIT_RESERVED_28, NAL_UNIT_RESERVED_29, NAL_UNIT_RESERVED_30, NAL_UNIT_RESERVED_31, NAL_UNIT_VPS, // 32 NAL_UNIT_SPS, // 33 NAL_UNIT_PPS, // 34 NAL_UNIT_ACCESS_UNIT_DELIMITER, // 35 NAL_UNIT_EOS, // 36 NAL_UNIT_EOB, // 37 NAL_UNIT_FILLER_DATA, // 38 NAL_UNIT_SEI, // 39 Prefix SEI NAL_UNIT_SEI_SUFFIX, // 40 Suffix SEI NAL_UNIT_RESERVED_41, NAL_UNIT_RESERVED_42, NAL_UNIT_RESERVED_43, NAL_UNIT_RESERVED_44, NAL_UNIT_RESERVED_45, NAL_UNIT_RESERVED_46, NAL_UNIT_RESERVED_47, NAL_UNIT_UNSPECIFIED_48, NAL_UNIT_UNSPECIFIED_49, NAL_UNIT_UNSPECIFIED_50, NAL_UNIT_UNSPECIFIED_51, NAL_UNIT_UNSPECIFIED_52, NAL_UNIT_UNSPECIFIED_53, NAL_UNIT_UNSPECIFIED_54, NAL_UNIT_UNSPECIFIED_55, NAL_UNIT_UNSPECIFIED_56, NAL_UNIT_UNSPECIFIED_57, NAL_UNIT_UNSPECIFIED_58, NAL_UNIT_UNSPECIFIED_59, NAL_UNIT_UNSPECIFIED_60, NAL_UNIT_UNSPECIFIED_61, NAL_UNIT_UNSPECIFIED_62, NAL_UNIT_UNSPECIFIED_63, NAL_UNIT_INVALID,
} HevcNaluType;
当拿到H264裸流时,可以很容易解析到sps、pps。可以参考https://github.com/leixiaohua1020/simplest_librtmp_example.git雷神的基于librtmp h264的rtmp流实现。
根据H265 NAL Type解析出来H265的vps、pps、sps等信息之后,要做的就是把H265的流数据打包成rtmp格式。
支持h265转发的nginx:
https://github.com/illuspas/nginx-rtmp-win32
高人编译的win下的nginx,已经支持h265的rtmp,hls未使用
rtmp 和hls中的h265 的ID为 12
nginx rtmp模块源码,支持h265:
https://github.com/adwpc/nginx-rtmp-module
h265 的 rtmp封包:
/*** 发送视频的sps和pps、vps信息** @param pps 存储视频的pps信息* @param pps_len 视频的pps信息长度* @param sps 存储视频的pps信息* @param sps_len 视频的sps信息长度* @param vps 存储视频的vps信息* @param vps_len 视频的vps信息长度** @成功则返回 1 , 失败则返回0*/
int SendVideoSpsPps(unsigned char *pps,int pps_len,unsigned char * sps,int sps_len,unsigned char* vps, int vps_len)
{RTMPPacket * packet=NULL;//rtmp包结构unsigned char * body=NULL;int i;packet = (RTMPPacket *)malloc(RTMP_HEAD_SIZE+1024);//RTMPPacket_Reset(packet);//重置packet状态memset(packet,0,RTMP_HEAD_SIZE+1024);packet->m_body = (char *)packet + RTMP_HEAD_SIZE;body = (unsigned char *)packet->m_body;int i = 0;body[i++] = 0x1C;body[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;//general_profile_idc 8bitbody[i++] = sps[1];//general_profile_compatibility_flags 32 bitbody[i++] = sps[2];body[i++] = sps[3];body[i++] = sps[4];body[i++] = sps[5];// 48 bit NUll nothing deal in rtmpbody[i++] = sps[6];body[i++] = sps[7];body[i++] = sps[8];body[i++] = sps[9];body[i++] = sps[10];body[i++] = sps[11];//general_level_idcbody[i++] = sps[12];// 48 bit NUll nothing deal in rtmpbody[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;//bit(16) avgFrameRate;body[i++] = 0x00;body[i++] = 0x00;/* bit(2) constantFrameRate; *//* bit(3) numTemporalLayers; *//* bit(1) temporalIdNested; */body[i++] = 0x00;/* unsigned int(8) numOfArrays; 03 */body[i++] = 0x03;printf("HEVCDecoderConfigurationRecord data = %s\n", body);body[i++] = 0x20; //vps 32body[i++] = (1 >> 8) & 0xff;body[i++] = 1 & 0xff;body[i++] = (vps_len >> 8) & 0xff;body[i++] = (vps_len) & 0xff;memcpy(&body[i], vps, vps_len);i += vps_len;//spsbody[i++] = 0x21; //sps 33body[i++] = (1 >> 8) & 0xff;body[i++] = 1 & 0xff;body[i++] = (sps_len >> 8) & 0xff;body[i++] = sps_len & 0xff;memcpy(&body[i], sps, sps_len);i += sps_len;//ppsbody[i++] = 0x22; //pps 34 body[i++] = (1 >> 8) & 0xff;body[i++] = 1 & 0xff;body[i++] = (pps_len >> 8) & 0xff;body[i++] = (pps_len) & 0xff;memcpy(&body[i], pps, pps_len);i += pps_len;packet->m_packetType = RTMP_PACKET_TYPE_VIDEO;packet->m_nBodySize = i;packet->m_nChannel = 0x04;packet->m_nTimeStamp = 0;packet->m_hasAbsTimestamp = 0;packet->m_headerType = RTMP_PACKET_SIZE_MEDIUM;packet->m_nInfoField2 = m_pRtmp->m_stream_id;/*调用发送接口*/int nRet = RTMP_SendPacket(m_pRtmp,packet,TRUE);free(packet); //释放内存return nRet;
}/*** 发送H265数据帧** @param data 存储数据帧内容* @param size 数据帧的大小* @param bIsKeyFrame 记录该帧是否为关键帧* @param nTimeStamp 当前帧的时间戳** @成功则返回 1 , 失败则返回0*/int SendH265Packet(unsigned char *data,unsigned int size,int bIsKeyFrame,unsigned int nTimeStamp)
{ if(data == NULL && size<11){ return false; } unsigned char *body = (unsigned char*)malloc(size+9); memset(body,0,size+9);int i = 0; if(bIsKeyFrame){ body[i++] = 0x1C;// 1:Iframe 7:AVC 这里改为C(12)nginx转发必须的SendVideoSpsPps(metaData.Pps,metaData.nPpsLen,metaData.Sps,metaData.nSpsLen,metaData.Vps,metaData.nVpsLen);}else{ body[i++] = 0x2C;// 2:Pframe 7:AVC } body[i++] = 0x01;// AVC NALU body[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;// NALU size body[i++] = size >> 24 & 0xff;body[i++] = size >> 16 & 0xff;body[i++] = size >> 8 & 0xff;body[i++] = size & 0xff;// NALU data memcpy(&body[i], data, size);int bRet = SendPacket(RTMP_PACKET_TYPE_VIDEO,body,i+size,nTimeStamp); free(body); return bRet;
}
备注:
rtmp 和hls中的h265 的ID为 12。参考 https://github.com/donwg/msnet/blob/master/utils/UtilRtmp.h
nginx rtmp h264/h265 下载 https://github.com/illuspas/nginx-rtmp-win32
可以参考nginx.conf。 原有的ok
worker_processes 1;
#worker_processes 4;
#worker_cpu_affinity 0001 0010 0100 1000;error_log logs/error.log debug;events {worker_connections 1024;#use select;
}#rtmp_auto_push on;#daemon off;
#master_process off;worker_priority -20;rtmp {server {listen 1935;chunk_size 128;#chunk_size 60000;buflen 3s;application live {live on;interleave on;wait_key on;wait_video on;publish_notify on;drop_idle_publisher 10s;sync 1000ms;idle_streams off;meta off;#meta copy;#以下部分内容开启HLS支持hls on; hls_path temp/hls; #hls_fragment 5s;hls_fragment 15s;}#屏蔽单独的hls#application hls {# live on;# hls on; # hls_path temp/hls; # hls_fragment 8s; #}}
}http {sendfile on;tcp_nopush on;#keepalive_timeout 60;tcp_nodelay on;keepalive_timeout 60;server {listen 8800;#limit_rate 2000k; #带宽限制limit_rate 0;location / {root html;}location /stat {rtmp_stat all;rtmp_stat_stylesheet stat.xsl;}location /stat.xsl {root html;}location /hls {#server hls fragments types{ application/vnd.apple.mpegurl m3u8; video/mp2t ts; } alias temp/hls;expires -1; } }
}
librtmp h265 推流相关推荐
- LAL v0.35.4发布,OBS支持RTMP H265推流,我跟了
Go语言流媒体开源项目 LAL 今天发布了v0.35.4版本. LAL 项目地址:https://github.com/q191201771/lal 老规矩,简单介绍一下: ▦ 一. OBS支持RTM ...
- RTMP 直播 H265 推流适配总结
1.在iOS11的系统之上,苹果逐渐放开H265硬编硬解的能力,硬解码的能力只要升级到iOS11之后,iPhone6+以上的机型就支持了(印象中): H265硬编码的能力对设备要求较高,不仅要求系统版 ...
- android rtmp推流,Android使用libRtmp直播推流
初始化rtmp //分配空间 RTMP *rtmp = RTMP_Alloc(); //初始化 RTMP_Init(rtmp); //设置推流URL RTMP_SetupURL(rtmp, url); ...
- rtmp支持h265推流
实现参考 金山云:https://github.com/CDN-Union/Code/tree/master/flv265-Kingsoft patch参考:https://github.com/CD ...
- 1小时学会:最简单的iOS直播推流(十)librtmp使用介绍
最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 源 ...
- webRTC H265浏览器播放器+metaRTC推流实现webRTC H265解决方案
概述 webRTC H265解决方案中metaRTC native端到端以及SFU等都已经有成熟解决方案,但这些解决方案中缺乏浏览器拉流播放,近期网友superxxd推出了webRTC H265浏览器 ...
- 视频直播推流技术(MediaCodec硬编码+libRTMP,编码器),Demo - Android
- aac audio_codec; h264,video_codec;25 framerate 25帧; - Camera-YUV帧序列-YUV帧预处理(镜像 缩放 旋转)-编码器-H264数据 从 ...
- 直播推流方案及过程分解
直播过程 1.相机预览及数据采集Camera - 取数据(onPreviewFrame(Byte[] rawFrameData, Camera camera)) 2.原始帧处理(Rotate旋转/Sc ...
- 计算机网络-基本概念(11)【应用层】
实时流式协议RTSP和RTMP 共同点: RTSP RTMP HTTP都是在应用层. 区别: RTSP+RTP主要用于IPTV,原因是传输数据使用的是UDP,在网络环境比较稳定的情况下,传输效率是比较 ...
最新文章
- 【目标检测】(5) YOLOV1 目标检测原理解析
- JSON解析与XML解析的区别
- 一、ExtMail Solution概述--EXTMAIL
- 波形捕捉:(7)“捕捉缓冲区”特效
- js pug 代码_用JS写的windows95操作系统
- 1虚拟机下U盘或磁盘挂载,Ubuntu下的网络配置,图形化界面和命令界面之间的切换,软件源配置
- 针对Selenium环境搭建的一些小解说
- CH - 6901 骑士放置(二分图最大独立集-二分图最大匹配+奇偶拆点)
- IOS之AFNetworking,SDWebImage,Kingfisher,Alamofire,FMDB框架的使用
- 直接从chrome中复制的body到postman中希望能自动识别去除空格
- 方法之输出星型及其调用
- DAC8563芯片参考手册重要内容总结
- 自动驾驶使用贝塞尔曲线进行动态障碍物避障测试
- java控制台输出五行字符串_java五行代码导出Excel
- POJ1321(深搜)
- 如何在markdown(csdn)中打出某个字符上面的三角帽子符号
- 基于HAL库的32流水灯
- QAM的符号能量及比特能量
- 【黑马程序员pink老师前端】HTML
- kubernetes 开发必须要知道的知识点—— API Group