rtsp播放h265(hevc)

11 篇文章 1 订阅
8 篇文章 0 订阅
本文介绍了如何通过RTSP播放H265(HEVC)视频,包括H265 NAL单元头的结构、SDP参数解析,如profile-space、sprop-vps、sprop-sps、sprop-pps,以及RTP打包的两种常见格式:单个NAL单元和NAL单元分片打包。提供了测试H265 RTSP播放的建议和交流群号。
摘要由CSDN通过智能技术生成

   对rtsp来说,要播放h265只要正确解析sdp和rtp包即可,这里分享下h265 sdp&rtp相关知识点,希望有用.

   1. H265 Nal Unit Header 简单介绍:

    H264的Nal Unit头是一个字节,265变成两个字节:

     

   
   F: 1 bit. forbidden_zero_bit.  265要求是0,是1的话指示语法违规等.

   Type: 6 bits. Nal类型.  vps是32, sps是33, pps是34, 前缀sei是39. IDR是19和20.

   LayerId: 6 bits. nuh_layer_id. 现在是0,将来可能扩展用.

   TID: 3 bits. nuh_temporal_id_plus1. TemporalId 是TID-1.

   2. SDP 参数介绍:

   2.1 IETF 分配给h265的媒体子类型如下:
   Type name:     video
   Subtype name:  H265
   可选参数: 
      profile-space, tier-flag, profile-id, profile-compatibility-indicator, interop-constraints,level-id,
      sprop-sub-layer-id, recv-sub-layer-id, max-recv-level-id, tx-mode, sprop-vps, sprop-sps, sprop-pps等等, 具体请参考相关
     文档,建议解析sprop-vps, sprop-sps, sprop-pps.
     
    2.2 SDP 举例:
    m=video 0 RTP/AVP 96
    a=rtpmap:96 H265/90000
a=fmtp:96 profile-space=0;profile-id=0;tier-flag=0;level-id=0;interop-constraints=000000000000;sprop-vps=QAEMAf//AIAAAAMAAAMAAAMAAAMAALUCQA==;sprop-sps=QgEBAIAAAAMAAAMAAAMAAAMAAKACgIAtH+W1kkbQzkkktySqSfKSyA==;sprop-pps=RAHBpVgeSA==
    注意编码名称必须是:H265, Clock rate必须是90000.

   3. RTP 打包格式.

   实际中其实就用到两种格式,一种是一个nal单元打包到一个rtp包中。一种是nal单元比较大,分片打包在多个rtp中.

   3.1 单个Nal单元打包:

  

       PayloadHdr 把 NAL单元头填入就好.

     3.2 Nal单元分片打包:

   

      PayloadHdr还是拷贝NAL单元头,但是要把Type换成49.  FU header 就一个字节,格式如下:

      +---------------+
      |0|1|2|3|4|5|6|7|
     +-+-+-+-+-+-+-+-+
      |S|E|  FuType   |
     +---------------+

     S:为1表示第一个分片。 E:为1表示表示最后一个分片。FuType就是实际的Nal type类型。

     4. 小结:

         h265和h264有很多相似之处,都有sps和pps,用00 00 00 01进行nal 单元分隔. 如果想测试h265 rtsp播放效果,可以从github下载播放器 测试h265播放。 更多问题欢迎交流: 294891451   499687479.

Android支持H.265视频编解码器,同时也支持RTSP协议来实现流媒体传输。你可以使用Android的MediaCodec API来实现H.265视频编解码器的开发,同时使用Android的MediaPlayer或ExoPlayer来实现RTSP协议的流媒体传输。下面是一个简单的示例: ```java // 创建H.265编码器 MediaCodec encoder = MediaCodec.createEncoderByType("video/hevc"); MediaFormat format = MediaFormat.createVideoFormat("video/hevc", width, height); format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate); format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate); format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval); encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); encoder.start(); // 创建H.265解码器 MediaCodec decoder = MediaCodec.createDecoderByType("video/hevc"); decoder.configure(format, surface, null, 0); decoder.start(); // 创建RTSP播放器 String url = "rtsp://xxx.xxx.xxx.xxx:xxxx/xxx"; MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); mediaPlayer.start(); // 创建ExoPlayer String userAgent = Util.getUserAgent(context, "AppName"); DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory(userAgent); ExtractorMediaSource.Factory mediaSourceFactory = new ExtractorMediaSource.Factory(dataSourceFactory); MediaSource mediaSource = mediaSourceFactory.createMediaSource(Uri.parse(url)); SimpleExoPlayer exoPlayer = new SimpleExoPlayer.Builder(context).build(); exoPlayer.setMediaSource(mediaSource); exoPlayer.prepare(); exoPlayer.play(); ``` 需要注意的是,H.265编码器和解码器的实现可能因硬件支持和系统版本而异,需要根据具体情况进行适配。同时,RTSP协议需要在网络环境中进行传输,需要考虑网络宽和延迟等问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值