代码编织梦想

参考ffmpeg解析vps,sps和pps:

在ffmpeg中可以参考下面的函数是如何解析extradata得到vps,sps,pps的:

hevc_decode_extradata()


AVCodecContext中 extradata 的 parse

aligned(8) class HEVCDecoderConfigurationRecord
{
    unsigned int(8) configurationVersion = 1;
    unsigned int(2) general_profile_space;
    unsigned int(1) general_tier_flag;
    unsigned int(5) general_profile_idc;
    unsigned int(32) general_profile_compatibility_flags;
    unsigned int(48) general_constraint_indicator_flags;
    unsigned int(8) general_level_idc;
    bit(4) reserved = ‘1111’b;
    unsigned int(12) min_spatial_segmentation_idc;
    bit(6) reserved = ‘111111’b;
    unsigned int(2) parallelismType;
    bit(6) reserved = ‘111111’b;
    unsigned int(2) chroma_format_idc;
    bit(5) reserved = ‘11111’b;
    unsigned int(3) bit_depth_luma_minus8;
    bit(5) reserved = ‘11111’b;
    unsigned int(3) bit_depth_chroma_minus8;
    bit(16) avgFrameRate;
    bit(2) constantFrameRate;
    bit(3) numTemporalLayers;
    bit(1) temporalIdNested;
    unsigned int(2) lengthSizeMinusOne;
    unsigned int(8) numOfArrays;
    for (j=0; j < numOfArrays; j++)
    {
        bit(1) array_completeness;
        unsigned int(1) reserved = 0;
        unsigned int(6) NAL_unit_type;
        unsigned int(16) numNalus;
        for (i=0; i< numNalus; i++)
        {
            unsigned int(16) nalUnitLength;
            bit(8*nalUnitLength) nalUnit;
        }
    }
}


从AVCodecContext读取h265的vps,sps,pps信息

        vps_length = (mCodec->extradata[26] * 256) + mCodec->extradata[27];
        sps_length = (mCodec->extradata[28 + vps_length + 3] * 256) + mCodec->extradata[28 + vps_length + 4]; 
        pps_length = (mCodec->extradata[28 + vps_length + 5 + sps_length + 3] * 256) + mCodec->extradata[28 + vps_length + 5 + sps_length + 4]; 

        if ((sps_length > INFO_LENGTH) || (pps_length > INFO_LENGTH)) {
                ulog_err("UHwDecoderVideo::init failed! sps_length=%d, pps_length=%d, longer than length %d", sps_length, pps_length, INFO_LENGTH);
                return -1; 
        }   

        for (i = 0; i < vps_length; i++) {
                sps[i] = mCodec->extradata[i + 28];
        }   
        for (i = 0; i < sps_length; i++) {
                pps[count] = mCodec->extradata[i + 28 + vps_length + 5]; 
                count++;
        }   
        pps[count++] = 0; pps[count++] = 0; pps[count++] = 0; pps[count++] = 1;
        for (i = 0; i < pps_length; i++) {
                pps[count] = mCodec->extradata[i + 28 + vps_length + 5 + sps_length + 5]; 
                count++;
        }   

        // print extra data for debug
        //for (i = 0; i < mCodec->extradata_size; i++) {
                //snprintf(tmp_str, sizeof(tmp_str), "0x%x ", mCodec->extradata[i]);
        for (i = 0; i < vps_length; i++) {
                snprintf(tmp_str, sizeof(tmp_str), "0x%x ", sps[i]);
                strncat(extra_str, tmp_str, strlen(tmp_str));
        }   
        //ulog_info("UHwDecoderVideo::init extradata_size=%d, extradata=%s", mCodec->extradata_size, extra_str);
        ulog_info("UHwDecoderVideo::init sps_size=%d, sps=%s", count, extra_str);
        ulog_info("UHwDecoderVideo::init vps_length=%d sps_length=%d, pps_length=%d, count=%d", vps_length, sps_length, pps_length, count);

        //init decoder
        //ret = Java_com_youku_uplayer_initDecoder(sps, sps_length, pps, pps_length);
        ret = Java_com_youku_uplayer_initDecoder(sps, vps_length, pps, count);
        if (0 == ret) {
                mHwThreadIsRunning = true;
        }   

Mediacodec

解码h265,mediacodec的接口初始化时,需要在csd-0 buffer中填入vps,sps,pps信息;注意三个参数前都必须加上0,0,0,1的前缀码,后面接着是nalu的两个字节头;


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/HTJOY1202/article/details/80776980

android 硬解码mediacodec配合surfaceview的踏坑之旅_tomybestlove的博客-爱代码爱编程_mediacodec surfaceview

一 前言 最近在看一些Android硬解码的内容,顺便写了一个硬解码demo,简直就是踏坑之旅。使用Android自带的MediaCodec会有很多问题,动不动就卡死甚至crash。废话少说直接上代码,最后会将踩过的坑列觉

使用mediacodec硬解码h.265视频及音频进行播放_lovewyf_的博客-爱代码爱编程

h.265这个视频是很多播放器不支持的,就算是bilibili开源的ijkplayer也不能直接播放,需要自己去重新编译 才可以支持。 这里通过这个demo来演示一下如何硬解码视频,播放h.265视频,其实编码的视频同样

ffmpeg之h265解码_g0415shenw的博客-爱代码爱编程_ffmpeg h265

本文详细介绍如何使用ffmpeg把H265解码成YUV420P格式格式的数据。 首先由于采用VS2017开发,我禁用了一个4996的错误: #pragma error(disable:4996) //全部禁用 #pragma warning(disable:4996) ffmpeg接收H265的数据,之能一帧一帧发送,不能接收步全的数据,所以需要先把

h265的sps解析_chinabinlang的博客-爱代码爱编程_h265 sps解析

可以通过很多方法,这里参考一个简答方法: 简答修改了一下: from: http://read.pudn.com/downloads760/sourcecode/multimedia/streaming/3021379/test_h265_sps/h265_sps_prase.c__.htm #ifndef h265_decode_info_h__

librtmp h265 推流_don.wang的博客-爱代码爱编程

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,

关于mediacode播放h265/hevc的总结_朝阳眯眼的博客-爱代码爱编程

H.265 High Profile 可实现低于1.5Mbps的传输带宽下,实现1080p全高清视频传输。 H.265/HEVC的编码架构大致上和H.264/AVC的架构相似,主要也包含,帧内预测(intra prediction)、帧间预测(inter prediction)、转换 (transform)、量化(quantization)、去区块滤波器

GPAC MP4文件写入(支持H264、H265)-爱代码爱编程

1、GPAC模块下载链接https://github.com/gpac/gpac或https://gpac.wp.imt.fr/downloads/ 2、编译指导https://github.com/gpac/gpac/wiki/Build-Introduction Windows:https://github.com/gpac/gpac/wiki/G

Android MediaCodec编码后解析出H264/H265中vps sps pps帧-爱代码爱编程

文章目录 解析的两种方式MediaCodec异步编码具体过程如下:1.配置Camera回调,获取preview的原始数据2.配置encoder和MediaFormat3.开启encoder4.获取到preview数据,并送如编码器5.mediaCodecCallback解析出编码后的vps sps vps帧,两种方式6.解析每个帧的值7.工具byt

【FFmpeg4.1.4】音视频分离器-爱代码爱编程

音视频分离器 一、MP4提取H265裸流无效二、添加头信息三、音视频分离步骤1、简单版本(不支持音频AAC)2、标准版源码(支持音频AAC)四、命令行 一、MP4提取H265裸流无效 FFmpeg解封装得到的AVPacket只包含了视频压缩数据,没有相关的参数集信息(比如:h265的vps头信息,h264的sps、pps头信息,AAC的adt

Android MediaCodec 解码H264/H265码流视频-爱代码爱编程

================================== 音视频学习H264系列:H264码流视频编码原理 音视频学习H264系列:MediaCodec H264/H265解码 音视频学习H264系列:终结篇实战 ================================== 序言 本篇是有关音视频学习系列中的H264 / H

Android音视频【七】H265硬编解码&视频通话-爱代码爱编程

人间观察 我该如何去表达呢 前面介绍了H265的一些知识,本篇实现利用camera采集进行H265硬编码,利用WebSocket来传输H265裸流,接收到H265的码流后进行H265解码渲染到surfaceview上,从而实现简易的视频通话。 主要有:摄像头如何处理,如何拿到摄像头的yuv数据,yuv数据怎么处理,实现Android H265

H265编解码-爱代码爱编程

目录 1.H265压缩技术 2.宏块编码 3.H265应用部分 ​ 1.H265压缩技术 H265 的GOP示意图        划分好宏块后,计算宏块的像素值  以此类推,计算一副图像每个宏块的像素值,所有宏块都处理完后如下面的样子       2.宏块编码  无论是H264还是H265

android音视频——h265编码核心技术解析_程序猿会指北的博客-爱代码爱编程

一、前言 音视频开发需要你懂得音视频中一些基本概念,针对编解码而言,我们必须提前懂得编解码器的一些特性,码流的结构,码流中一些重要信息如sps,pps,vps,start code以及基本的工作原理,而大多同学都只是一知半解,所以导致代码中的部分内容虽可以简单理解却不知其意,所以,在这里总结出了当前主流的H.265编码相关的原理 。 二、定义 H.2