从原理到实践:使用Mediacodec编码H265并实现解码H265码流

news2025/2/13 12:45:34

H265

H265,也称为HEVC(High Efficiency Video Coding),是一种高效视频编码格式。它是H264(AVC)的后继者,也是ITU-T和ISO/IEC联合开发的标准。相比H264,H265可以在同样的视频质量下,使用更少的码率传输数据,实现更高的压缩率,同时支持更高的分辨率和比特率。这使得H265在视频传输、视频会议、视频监控等领域有着广泛的应用。

H265编码采用了新的算法和技术,包括更多的预测模式、更好的运动估计和补偿、更高效的量化和熵编码等,以实现更高效的视频压缩。与H264相比,H265还支持8K(7680x4320)和10K(10240x4320)分辨率的视频,以及更高的比特率和更多的色彩空间。

虽然H265编码技术成熟,但由于其复杂度较高,需要更多的计算和存储资源,所以在实际应用中需要根据具体场景进行优化和适配。同时,为了得到更好的视频质量和更高的压缩率,也需要对H265编码的参数进行调整和优化。

Mediacodec

Mediacodec是Android系统提供的用于音视频编解码的API。通过Mediacodec,开发者可以对视频和音频进行硬编解码或软编解码,实现高效的音视频处理。Mediacodec提供了相对底层的API,需要开发者自己管理多个编码器、解码器和输入缓冲区、输出缓冲区等资源,但使用Mediacodec可以获得更高的性能和更优秀的质量。

Mediacodec的使用包含以下几个步骤:

创建Mediacodec对象和MediaFormat对象

创建名为“video/avc”或“audio/mp4a-latm”的MediaFormat对象,表示要编解码的音视频格式。然后创建名为“video/avc”或“audio/mp4a-latm”的Mediacodec对象,使用MediaCodec.createEncoderByType或MediaCodec.createDecoderByType方法创建编解码器。

MediaCodec mediaCodec = MediaCodec.createDecoderByType("video/hevc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/hevc", width, height);

配置Mediacodec对象

通过Mediacodec的configure方法,设置输入格式、输出格式、编解码器参数等信息,然后调用start方法启动编解码器。

mediaCodec.configure(mediaFormat, surface, null, 0);
mediaCodec.start();

输入数据

通过dequeueInputBuffer方法获取一个输入缓冲区,从输入流中读取音视频数据,将数据填充到输入缓冲区中,然后通过queueInputBuffer方法将输入缓冲区加入编码队列。

int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
    ByteBuffer inputBuffer = mediaCodec.getInputBuffer(inputBufferIndex);
    inputBuffer.clear();
    int sampleSize = extractor.readSampleData(inputBuffer, 0);
    if (sampleSize < 0) {
        // end of stream, signal EOS to decoder
        mediaCodec.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
    } else {
        long presentationTimeUs = extractor.getSampleTime();
        mediaCodec.queueInputBuffer(inputBufferIndex, 0, sampleSize, presentationTimeUs, 0);
        extractor.advance();
    }
}

处理数据

通过dequeueOutputBuffer方法获取一个输出缓冲区,从编码队列中取出编码数据,将数据填充到输出缓冲区中,然后通过releaseOutputBuffer方法将输出缓冲区加入输出队列。如果需要编解码速度更快,可以使用异步模式,使用Mediacodec.Callback回调处理输入输出缓冲区。

MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, TIMEOUT_US);
while (outputBufferIndex >= 0) {
    mediaCodec.releaseOutputBuffer(outputBufferIndex, true);
    outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, TIMEOUT_US);
}
if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
    // handle format change
    MediaFormat newFormat = mediaCodec.getOutputFormat();
} else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
    // handle buffer change
}

停止Mediacodec

通过stop和release方法停止和释放编解码器。

需要注意的是,使用Mediacodec进行音视频编解码时,要根据具体的设备和编解码器,进行相应的参数设置和优化。使用硬件编解码可以获得更好的性能和更优秀的质量,但也需要注意硬件加速器的兼容性和使用方式。

mediaCodec.stop();
mediaCodec.release();

更多有关音视频开发的开发技术,可以参考《音视频全套入门精通手册》点击查看详细内容。

最后 注意事項

使用Mediacodec实现解码H265码流需要注意以下几点:

设备需要支持H265解码器

H265解码需要硬件支持,所以设备需要有H265解码器才能进行解码,否则只能使用软解。

设置MediaFormat格式

H265码流的MediaFormat格式应该设置为"video/hevc",否则会无法解码。

注意输入数据的时间戳

H265码流中每一帧的时间戳可能不是递增的,需要解码器能够正确识别时间戳。在调用queueInputBuffer方法时,第四个参数presentationTimeUs就是该帧数据的时间戳,需要正确传入。

处理解码后的数据

解码后的数据可以通过MediaCodec.BufferInfo中的offset、size和presentationTimeUs等参数获取,可以将解码后的数据渲染到Surface上。

及时释放资源

使用完Mediacodec后需要及时调用stop()和release()方法释放资源,否则会导致内存泄漏等问题。

总之,在使用Mediacodec解码H265码流时需要注意以上几个问题,才能正确地进行解码和渲染。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/639556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据库原理与应用 - 第三章】数据库设计

数据库设计的步骤 需求分析阶段概念模型设计阶段 —— E-R图逻辑模型设计阶段 —— 关系模型物理结构设计阶段 数据库实施阶段数据库运行和维护阶段 目录 数据库设计的步骤 一、需求分析 1、主要任务 2、对象模型 二、数据库概念结构设计 1、概念数据模型 E-R图 1、概念…

Mybatis《学习笔记(22版尚硅谷)》

Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c;iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于“intern…

C语言中的for循环语句

表达式1&#xff1a;设置初始条件&#xff0c;只执行一次&#xff0c;可以为多个变量设置初始值 表达式2&#xff1a;循环条件表达式&#xff0c;判断是否集训循环 表达式3&#xff1a;执行循环体后再执行 例如&#xff0c;使用for循环打印1-10的数字首先定义整形变量a0&…

【V4L2】 v4l2框架分析之v4l2_device

&#x1f440;&#x1f449;本系列文章基于linux内核版本4.1.15分析media子系统下的V4L2。先分析组成V4L2的核心数据结构以及各组成元素的含义和作用。相关文章&#xff1a; ❤&#xff08;1&#xff09;《【V4L2】v4l2框架分析之video_device》 ❤&#xff08;2&#xff09;《…

30分钟了解并学会git的使用(绝对干货)

概述&#xff1a; 在programmer行业有一句流传许久的话&#xff1a;不会用git的程序员&#xff0c;不是真的程序员&#xff01;&#xff01;&#xff01; 足以看出来git在业界的认可度有多高&#xff0c;所以我们混这行的都应该学会这个由Linux之父林纳斯开发 的第二大发明&a…

【QT/OpenCV】Qt创建并发布OpenCV dll项目

文章目录 01、开发版本02、QT创建dll项目03、dll项目配置说明04、dll动态库测试 01、开发版本 以下所有源码与软件都是基于下面的版本。 1、QT&#xff1a; Based on Qt 5.12.2 (MSVC 2017, 32 bit) 2、OpenCV&#xff1a; OpenCV – 4.5.1 tips&#xff1a; OpenCV的版本不一…

web漏洞-逻辑越权之登录脆弱支付篡改(34)

这节课是这两个内容&#xff0c;登录的内容会讲不完&#xff0c;会有一小点部分&#xff0c;在别的课将&#xff0c; #登录应用功能点产生的安全问题 只要有登录功能都可以检测&#xff08;排除之前讲过的&#xff09; 1.登陆点的暴力破口&#xff08;很好理解 2.http/http…

【第三节】列表

上一节介绍了最常见的两种数据类型 字符串和数字 这一节将介绍列表 列表 首先&#xff0c;什么是列表&#xff1f;列表是由一系列按照特定顺序排列的元素组成&#xff0c;在python中由中括号[ ]定义 首先列表是一系列的元素&#xff0c;这些元素的种类可以不同&#xff0c;一…

python3 爬虫相关学习9:BeautifulSoup 官方文档学习

目录 1 BeautifulSoup 官方文档 2 用bs 和 requests 打开 本地html的区别&#xff1a;代码里的一段html内容 2.1 代码和运行结果 2.2 用beautiful 打开 本地 html 文件 2.2.1 本地html文件 2.2.2 soup1BeautifulSoup(html1,"lxml") 2.3 用requests打开 本地 h…

微服务治理【注册发现】Nacos

目录 Nacos是什么&#xff1f; Nacos有什么用&#xff1f; 使用 Nacos 服务发现的流程图 Nacos是什么&#xff1f; Nacos是阿里巴巴开源的一个服务发现、配置管理和服务管理平台&#xff0c;是一种基于云原生架构的动态服务发现和配置管理工具。 Nacos有什么用&#xff…

什么是API测试?开发必知的8种API自动化测试类型

API测试 API自动化测试在产品质量控制和CI/CD流程检测中扮演着非常重要的角色。与GUI测试不同&#xff0c;API测试可以更灵活应地适应发布周期短和频繁变更的需求或产品&#xff0c;而且也不会破坏测试输出结果。 什么是API测试&#xff1f; API是应用程序编程接口的首字母缩…

jetLinks协议开发对接真实设备方式

jetLinks协议开发对接真实设备方式 拿到设备确定设备的SDKSDK调用流程梳理SDK集成JetLinks 拿到设备 首先拿到设备&#xff0c;确认设备型号 然后登入海康威视官网&#xff0c;下载 https://www.hikvision.com/cn/support/tools/hitools/ 连接设备修改其对应的IP地址使得本…

信号都是如何产生的,干货满满

目录 一、哪三大阶段 二、产生信号 1、通过键盘产生信号 2、系统调用 3、软件条件产生信号 4、硬件异常产生信号 三、Term和core是什么 一、信号一生三大阶段 1、产生信号&#xff1a;由通过键盘、系统调用、软件条件、硬件异常产生这几种方法产生信号。 2、信号储存&a…

JMeter必知必会系列 —— JMeter基础

1.1 JMeter概述 JMeter简介 Apache JMeter™是Apache组织开发的一款开源软件&#xff0c;是典型的纯Java开发的应用程序&#xff0c;可以在不同平台比如Windows、Linux或macOS系统上进行软件测试。JMeter主要用于应用程序的功能负载测试以度量软件的性能&#xff0c;也可以用于…

项目使用tensorflow2会出错,下载并使用tensorflow1

背景&#xff1a;使用pycharm安装总显示安装失败&#xff0c;使用pip安装也不行&#xff0c;只能使用conda配置虚拟环境手动安装 1、下载安装anaconda 官网下载&#xff0c;双击安装。用anaconda就是想使用虚拟环境&#xff0c;万一没弄好直接删了重新搞就行。 2、创建虚拟环境…

Kendo UI R2 2023 crack

Kendo UI R2 2023 crack 新组件&#xff1a;角度PDFViewer 直接在Angular应用程序中查看PDF文件&#xff0c;无需第三方软件或附加组件。 凭借直观的分页机制、强大的搜索功能和灵活的缩放选项&#xff0c;用户可以轻松导航和浏览PDF内容。 角度16支架 Angular 16引入了一系列改…

AWS CodeWhisperer(代码辅助工具)使用体验

工具 1.vscode 2.AWS Toolkit插件 CodeWhisperer插件的功能 1.自动优化代码&#xff1a;CodeWhisperer插件可以通过代码分析来自动优化代码&#xff0c;从而提高代码的质量和效率。 2.智能代码提示&#xff1a;CodeWhisperer插件可以根据代码上下文提供智能代码提示&#x…

C语言之数组详解(1)(更新前面数组博客的不足)

目录 一、一维数组 1.一维数组的创建和初始化 (1).数组的创建 (2).数组的初始化 2.一维数组的使用 3.一维数组在内存中的存储 二、二维数组 1.二维数组的创建和初始化 (1).二维数组的创建 (2).二维数组的初始化 2.二维数组的使用 3.二维数组在内存中的存储 三、数组作为函数参…

尚硅谷大数据技术Spark教程-笔记08【SparkSQL(介绍、特点、数据模型、核心编程、案例实操、总结)】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01【SparkCore&#xff08;概述、快速上手、运行环境、运行架构&#xff09;】尚硅谷大数据技术Spark教程…

14.一天搞定主流小程序按分类列表显示文章1

小程序按分类列表显示文章1 (视频对应无13) 本教程均在第一节中项目启动下操作 小程序按分类列表显示文章1 (视频对应无13)前言一、新增分类界面:![在这里插入图片描述](https://img-blog.csdnimg.cn/1dffd20abc8f47d3961dee59426f3a8f.png)二.新增接口apiflex布局组件数据表绑…