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 推流相关推荐

  1. LAL v0.35.4发布,OBS支持RTMP H265推流,我跟了

    Go语言流媒体开源项目 LAL 今天发布了v0.35.4版本. LAL 项目地址:https://github.com/q191201771/lal 老规矩,简单介绍一下: ▦ 一. OBS支持RTM ...

  2. RTMP 直播 H265 推流适配总结

    1.在iOS11的系统之上,苹果逐渐放开H265硬编硬解的能力,硬解码的能力只要升级到iOS11之后,iPhone6+以上的机型就支持了(印象中): H265硬编码的能力对设备要求较高,不仅要求系统版 ...

  3. android rtmp推流,Android使用libRtmp直播推流

    初始化rtmp //分配空间 RTMP *rtmp = RTMP_Alloc(); //初始化 RTMP_Init(rtmp); //设置推流URL RTMP_SetupURL(rtmp, url); ...

  4. rtmp支持h265推流

    实现参考 金山云:https://github.com/CDN-Union/Code/tree/master/flv265-Kingsoft patch参考:https://github.com/CD ...

  5. 1小时学会:最简单的iOS直播推流(十)librtmp使用介绍

    最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 源 ...

  6. webRTC H265浏览器播放器+metaRTC推流实现webRTC H265解决方案

    概述 webRTC H265解决方案中metaRTC native端到端以及SFU等都已经有成熟解决方案,但这些解决方案中缺乏浏览器拉流播放,近期网友superxxd推出了webRTC H265浏览器 ...

  7. 视频直播推流技术(MediaCodec硬编码+libRTMP,编码器),Demo - Android

    - aac audio_codec; h264,video_codec;25 framerate 25帧; - Camera-YUV帧序列-YUV帧预处理(镜像 缩放 旋转)-编码器-H264数据 从 ...

  8. 直播推流方案及过程分解

    直播过程 1.相机预览及数据采集Camera - 取数据(onPreviewFrame(Byte[] rawFrameData, Camera camera)) 2.原始帧处理(Rotate旋转/Sc ...

  9. 计算机网络-基本概念(11)【应用层】

    实时流式协议RTSP和RTMP 共同点: RTSP RTMP HTTP都是在应用层. 区别: RTSP+RTP主要用于IPTV,原因是传输数据使用的是UDP,在网络环境比较稳定的情况下,传输效率是比较 ...

最新文章

  1. 【目标检测】(5) YOLOV1 目标检测原理解析
  2. JSON解析与XML解析的区别
  3. 一、ExtMail Solution概述--EXTMAIL
  4. 波形捕捉:(7)“捕捉缓冲区”特效
  5. js pug 代码_用JS写的windows95操作系统
  6. 1虚拟机下U盘或磁盘挂载,Ubuntu下的网络配置,图形化界面和命令界面之间的切换,软件源配置
  7. 针对Selenium环境搭建的一些小解说
  8. CH - 6901 骑士放置(二分图最大独立集-二分图最大匹配+奇偶拆点)
  9. IOS之AFNetworking,SDWebImage,Kingfisher,Alamofire,FMDB框架的使用
  10. 直接从chrome中复制的body到postman中希望能自动识别去除空格
  11. 方法之输出星型及其调用
  12. DAC8563芯片参考手册重要内容总结
  13. 自动驾驶使用贝塞尔曲线进行动态障碍物避障测试
  14. java控制台输出五行字符串_java五行代码导出Excel
  15. POJ1321(深搜)
  16. 如何在markdown(csdn)中打出某个字符上面的三角帽子符号
  17. 基于HAL库的32流水灯
  18. QAM的符号能量及比特能量
  19. 【黑马程序员pink老师前端】HTML
  20. kubernetes 开发必须要知道的知识点—— API Group

热门文章

  1. ax.patches 表示什么?
  2. 字节跳动小程序对接环信IM遇到的问题
  3. base+ball=games
  4. windows 远程桌面无法连接的问题
  5. SendKeys.SendWait()用法
  6. vs编译 error C2001: 常量中有换行符
  7. 【jmeter-参数化】
  8. 小知识·CMake基本指令
  9. 关于Java中的引用的用法
  10. 经济类英文期刊排行榜