SkeyeRTMPClient扩展支持HEVC(H.265)解决方案之兼容H264和H265帧数据解析详解

这篇具有很好参考价值的文章主要介绍了SkeyeRTMPClient扩展支持HEVC(H.265)解决方案之兼容H264和H265帧数据解析详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在之前两篇关于SkeyeRTMPClient扩展支持HEVC(H.265)解决方案的文章中,我们已经完成了对H265的支持,本文主要阐述将H26和H265支持兼容起来,实现不同视频编码格式的自适应兼容适配。

1. 根据CodecId判断数据编码类型

根据视频编码ID判断视频编码类型,如果视频编码ID==FlvCodeId_Hevc(12),则判断视频编码格式为H265,反之则为H264(因为目前我们只支持这两种编码格式的视频推送),如下代码所示:

    parser_VideoTag *video_tag = (parser_VideoTag*)(buf+parser_offset);
	FlvCodeId video_code_id = (FlvCodeId)(video_tag->code_id&0x0f);
	if (video_code_id == FlvCodeId_Hevc)
	{
		av_frame.u32AVFrameFlag = SKEYE_SDK_VIDEO_CODEC_H265;// HEVC;
	} 
	else
	{
		av_frame.u32AVFrameFlag = SKEYE_SDK_VIDEO_CODEC_H264;// 默认h264, 其他类型是否需要判断?!;
	}
2. 数据帧头部判断

根据FLV/RTMP扩展支持H265标准,支持HEVC的VideoTagHeader定义如下图所示:
SkeyeRTMPClient扩展支持HEVC(H.265)解决方案之兼容H264和H265帧数据解析详解
即 当CodecID == 12时,AVCPacketType为HEVCPacketType:

  • 如果HEVCPacketType为0,表示HEVCVIDEOPACKET中存放的是HEVC sequence header;

  • 如果HEVCPacketType为1,表示HEVCVIDEOPACKET中存放的是HEVC NALU;

  • 如果HEVCPacketType为2,表示HEVCVIDEPACKET中存放的是HEVC end of sequence,即HEVCDecoderConfigurationRecord;

而当CodecID == 7时,AVCPacketType为AVCPacketType:

  • 如果AVCPacketType为0,表示HEVCVIDEOPACKET中存放的是AVC sequence header;

  • 如果AVCPacketType为1,表示HEVCVIDEOPACKET中存放的是AVC NALU;

  • 如果AVCPacketType为2,表示HEVCVIDEPACKET中存放的是AVC end of sequence,即AVCDecoderConfigurationRecord;

SkeyeRTMPClient对sequence header的解析函数如下代码段所示:

int ParserVideoSequencePacket(FlvCodeId video_code_id, char *buf,int len)
{
	int parser_offset = 0;
	char *parser_config = buf;
	if (video_code_id == FlvCodeId_Hevc)
	{
		if(len <= sizeof(Parser_HEVCDecoderConfigurationRecord))
		{
			return -1001;
		}			
 		......’
		//Parser HEVCDecoderConfigurationRecord 
		......
		rtmpclient_h265_decode_sps((unsigned char *)sps_buf_, sps_len_, width_, height_);	
	} 
	else
	{
		if(len <= sizeof(parser_AVCDecoderHeader))
		{
			return -1001;
		}
 		......’
		//Parser HEVCDecoderHeader
		......
		rtmpclient_h264_decode_sps((unsigned char *)sps_buf_, sps_len_, width_, height_);
	}

    return 0;
}
3. 视频数据体帧数据nalu类型判断

根据FLV/RTMP扩展支持协议标准,支持H265的VideoTagBody定义如下, 扩展后的VideoTagBody如下图所示(红色字体为HEVC新增内容)::
SkeyeRTMPClient扩展支持HEVC(H.265)解决方案之兼容H264和H265帧数据解析详解

当CodecID为12时,VideoTagBody中存放的就是HEVC视频帧内容。
SkeyeRTMPClient视频帧nalu解析如下代码所示:

int ParserOneVideoNalu(SkeyeRTMPClient_AV_Frame& av_frame,char *buf,int len,char* processbuf)
{
    if(processbuf == NULL || buf == NULL || len == 0)
    {
        return -3001;
    }
    if(sps_len_ == 0 || pps_len_ == 0)
    {
        printf("do not get sequence head yet\n");
        return -3002;
    }

    int parse_offset = 0;
    int nalu_len = 0;
    int nalu_type = 0;
    int processlen = 0;
    while(parse_offset < len - 4)
    {
        nalu_len = ntohl(*(int*)(buf + parse_offset));  
        parse_offset += 4;
        //如果视频帧编码类型为H265
		if(av_frame.u32AVFrameFlag == SKEYE_SDK_VIDEO_CODEC_H265)
		{
			nalu_type = (buf[parse_offset] >> 1) & 0x3F;
			if(nalu_type == e_H265_NAL_UNIT_VPS)
			{
				ASSERT_PARSER(nalu_len,MAX_VPS_LEN);
				memcpy(vps_buf_,buf + parse_offset,nalu_len);
				vps_len_ = nalu_len;
				parse_offset += nalu_len;
				continue;
			}
		}else{
			nalu_type = buf[parse_offset]&0x1F;
		}
       //H265 以及 H264的SPS头解析兼容
        if((av_frame.u32AVFrameFlag == SKEYE_SDK_VIDEO_CODEC_H265&&nalu_type ==e_H265_NAL_UNIT_SPS) || 
			av_frame.u32AVFrameFlag == SKEYE_SDK_VIDEO_CODEC_H264&&nalu_type == e_H264_Frame_Type_Sps)
        {
            ASSERT_PARSER(nalu_len,MAX_PPS_LEN);
            memcpy(sps_buf_,buf + parse_offset,nalu_len);
            sps_len_ = nalu_len;
            parse_offset += nalu_len;

			if(width_ == 0 && sps_len_ > 0)
			{
				if(av_frame.u32AVFrameFlag == SKEYE_SDK_VIDEO_CODEC_H265)
					rtmpclient_h265_decode_sps((unsigned char *)sps_buf_, sps_len_, width_, height_);
				else
					rtmpclient_h264_decode_sps((unsigned char *)sps_buf_, sps_len_, width_, height_);
			}
            continue;
        }
		       //H265 以及 H264的PPS头解析兼容
		else if((av_frame.u32AVFrameFlag == SKEYE_SDK_VIDEO_CODEC_H265&&nalu_type ==e_H265_NAL_UNIT_PPS) || 
			av_frame.u32AVFrameFlag == SKEYE_SDK_VIDEO_CODEC_H264&&nalu_type == e_H264_Frame_Type_Pps)
        {
            memcpy(pps_buf_,buf + parse_offset,nalu_len);
            pps_len_ = nalu_len;
            parse_offset += nalu_len;
            continue;
        }

       //H265 以及 H264的I帧解析兼容
		else if((av_frame.u32AVFrameFlag == SKEYE_SDK_VIDEO_CODEC_H265&&nalu_type >=e_H265_NAL_UNIT_SLICE_BLA&&nalu_type <=e_H265_NAL_UNIT_SLICE_CRA ) || 
		av_frame.u32AVFrameFlag == SKEYE_SDK_VIDEO_CODEC_H264&&nalu_type == e_H264_Frame_Type_Idr)
        {
			if(av_frame.u32AVFrameFlag == SKEYE_SDK_VIDEO_CODEC_H265)
			{
				memcpy(processbuf + processlen,nalu_head_,4);
				processlen += 4;
				memcpy(processbuf + processlen,vps_buf_,vps_len_);
				processlen += vps_len_;
			}
			.......
			//拷贝SPS和PPS以及Idr nalu
			......
			av_frame.u32VFrameType = SKEYE_SDK_VIDEO_FRAME_I;
            continue ;
        }
       //H265 以及 H264的P帧解析兼容
		else if((av_frame.u32AVFrameFlag == SKEYE_SDK_VIDEO_CODEC_H265&&nalu_type >=e_H265_NAL_UNIT_SLICE_TRAIL_R&&nalu_type <=e_H265_NAL_UNIT_SLICE_TFD ) || 
			av_frame.u32AVFrameFlag == SKEYE_SDK_VIDEO_CODEC_H264&&nalu_type == e_H264_Frame_Type_Slice)
        {
            memcpy(processbuf + processlen,nalu_head_,4);
            processlen += 4;
            memcpy(processbuf + processlen,buf + parse_offset,nalu_len);
            processlen += nalu_len;
            parse_offset += nalu_len;

			av_frame.u32VFrameType = SKEYE_SDK_VIDEO_FRAME_P;
            continue ;
        }
        else
        {
            parse_offset += nalu_len;
            continue;
        }
    }

    av_frame.pBuffer = (uint8_t *)processbuf;
    av_frame.u32AVFrameLen = processlen;
    return 0;
}

至此,SkeyeRTMPClient对H264和H265的兼容适配就完成了,我们可以通过SkeyeRTMPClient拉取任意编码格式为H264或者H265的RTMP进行拉流,均能取得完整的视频帧数据进行解码和播放。

欢迎大家下载SkeyePlayer测试播放支持H265的RTMP流:
https://gitee.com/visual-opening/skeyeplayer

有任何技术问题,欢迎大家和我进行技术交流:
295222688@qq.com

大家也可以加入SkeyePlayer流媒体播放器 QQ群进行讨论:
102644504文章来源地址https://www.toymoban.com/news/detail-402702.html

到了这里,关于SkeyeRTMPClient扩展支持HEVC(H.265)解决方案之兼容H264和H265帧数据解析详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ChatGPT扩展系列之ChatHub解决被OpenAI 封号的终极解决方案

    本节介绍了一个解决ChatGPT在中国大陆无法使用和担心被封号的问题的方法。近期有很多亚洲用户被封号,原因是有人滥用API接口或者批量注册账号,不符合官方规定。对于这个问题,提出了一个解决方法,可以在中国大陆无需翻墙使用ChatGPT,并且不用担心被封号。 最近两天

    2024年02月07日
    浏览(61)
  • 进口跨境商城源码:高效、安全、可扩展的电商平台解决方案

    电子商务的兴起为跨境贸易提供了前所未有的机会和挑战。在这个全球化的时代,跨境电商平台成为许多企业进军国际市场的首选。然而,搭建一个高效、安全、可扩展的进口跨境商城并非易事。 1. 解决方案概述 我们推出的 \\\"进口跨境商城源码\\\" 提供了一个完整的电商平台解

    2024年02月06日
    浏览(36)
  • 使用独立显卡安装黑苹果,但无法扩展显示器的解决方案

    本文的外部链接🔗 引用文中的一句话:“这也许是无法驱动独显的黑苹果笔记本想要外接显示器的唯一方案。” ---- 购买拥有displaylink的外置显卡的usb转接器 文章作者给我了启发,是不是只要用 displaylink的芯片 就可以使用苹果系统的usb接口来扩展显示器,现实的确是这样的

    2024年02月07日
    浏览(75)
  • 解决win10自带播放器 HEVC视频扩展 需付费方法

    问题现象如图: 解决办法: 第一步: 复制   ms-windows-store://pdp/?ProductId=9n4wgh0z6vhq 第二步:浏览器打开,点击打开  第三步:会自动跳到微软商店,请耐心等待几分钟,然后点击安装,安装完成后再次打开播放器即可正常使用。  

    2024年02月12日
    浏览(38)
  • 【chrome扩展开发】vue-i18n使用问题及解决方案

    记录chrome扩展开发时调用vue-i18n的一些问题和解决方法 vue : ^3.3.4 vue-i18n : ^9.2.2 vite : ^4.4.8 Uncaught (in promise) EvalError: Refused to evaluate a string as JavaScript because \\\'unsafe-eval\\\' is not an allowed source of script in the following Content Security Policy directive: \\\"script-src \\\'self\\\' \\\'wasm-unsafe-eval\\\' \\\'inline-speculation-

    2024年02月14日
    浏览(33)
  • ChatGPT扩展系列之解决ChatGPT 被大面积封号的终极方案

    本节介绍了一个解决ChatGPT在中国大陆无法使用和担心被封号的问题的方法。近期有很多亚洲用户被封号,原因是有人滥用API接口或者批量注册账号,不符合官方规定。对于这个问题,提出了一个解决方法,可以在中国大陆无需翻墙使用ChatGPT,并且不用担心被封号。 最近两天

    2024年02月03日
    浏览(34)
  • 详解Layer 2扩展解决方案Optimism(OP)是如何工作的?|Tokenview

    Optimism是一个快速、稳定、可扩展和低成本的以太坊Layer 2区块链。这意味着它在以太坊区块链(Layer1)之上运行,以帮助缓解拥塞,进而降低交易成本和处理时间。作为现有以太坊软件的最小扩展,Optimism的EVM-equivalent 架构可以扩展以太坊应用程序。如果它能在以太坊上工作

    2024年02月06日
    浏览(30)
  • HEVC(H.265)视频压缩编码格式与其原理

    本人最近开始研究视频重编码的检测,因此做个笔记记录一下自己学习的视频编码相关知识。视频编码的目的是为了压缩原始视频,压缩的主要思路是从空间、时间、编码、视觉等几个主要角度去除冗余信息。而H.265(HEVC)则是目前常用的视频压缩编码格式,本文将主要介绍其

    2024年02月05日
    浏览(44)
  • Flask-WhooshAlchemy: 快速、高效且可扩展的全文搜索引擎解决方案

    Flask-WhooshAlchemy 是一个基于 Flask 和 Whoosh 的插件,它提供了一种简单的方法为 Flask 应用程序中的数据库模型实现全文搜索功能。 Flask-WhooshAlchemy 将 Flask SQLAlchemy ORM 模型与谁osh全文搜索引擎相结合,使得用户能够在 Flask 应用中方便地创建和管理索引,实现快速高效的全文检索

    2024年04月23日
    浏览(32)
  • HEVC(H.265)视频压缩编码格式与基础概念

    本人最近开始研究视频重编码的检测,因此做个笔记记录一下自己学习的视频编码相关知识。视频编码的目的是为了压缩原始视频,压缩的主要思路是从空间、时间、编码、视觉等几个主要角度去除冗余信息。而H.265(HEVC)则是目前常用的视频压缩编码格式,本文将主要介绍其

    2024年02月15日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包