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 decodermediaCodec.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 changeMediaFormat 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码流时需要注意以上几个问题,才能正确地进行解码和渲染。

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

  1. 04_《计算机安全原理与实践》密码编码工具(下)

    04_<计算机安全原理与实践>密码编码工具(下)含本章理论性习题解答 前言 本专栏上一篇博文介绍了消息认证的机理和非对称加密体系,从实际应用角度,二者是不可分割的.本章将在上一章的基础上进 ...

  2. Android MediaCodec 解码H264码流播放

    视频编解码,编的是什么码?解的又是什么码?有没有想过?现在主流的就是H264码流,Android 采集摄像头原始帧数据 这篇博客讲解的是如何从摄像头从提取YUV画面色值,然后由MediaCodec进行 ...

  3. Spring AOP中的静态代理和动态代理的原理和实践

    对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利.无论你是对的还是错的,都会在这个平台上找到答案.所以,我会尽可能去写 ...

  4. H264/H265码流类型

    文章目录 H.264码流 H.264码流格式 Annex B AVCC H.265码流 H.264码流 H264中,NALU类型1-5为视频帧,其余则为非视频帧.在解码过程中,我们只需要取出NALU头 ...

  5. 编码原则实例------c++程序设计原理与实践(进阶篇)

    编码原则: 一般原则 预处理原则 命名和布局原则 类原则 函数和表达式原则 硬实时原则 关键系统原则 (硬实时原则.关键系统原则仅用于硬实时和关键系统程序设计) (严格原则都用一个大写字母R及其编号标 ...

  6. 2018-2019-2 网络对抗技术 20165239Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165239 Exp3 免杀原理与实践 win10 ip地址 192.168.18.1 fenix ip地址为 192.168.18.128 (1)杀软是如何 ...

  7. Webpack原理与实践

    简单了解了几个常用的插件,一般适合用于任何类型的项目,不管是否使用了框架.webpack为每个工作环节都预留了合适的钩子,扩展时只需要找到合适的时机去做合适的事情. 写在前面 webpack插件机制的 ...

  8. 2018-2019-2 网络对抗技术 20165301 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165301 Exp3 免杀原理与实践 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用 ...

  9. 20145317 《网络对抗技术》免杀原理与实践

    20145317 <网络对抗技术>免杀原理与实践 免杀技术 技术分类 改变特征码 加壳:使用专业的加壳软件,掩盖特征码: 使用encode等进行编码,进行异或.+1.-1等类似操作改变特征 ...

最新文章

  1. 黑白青春-纪念那年我的秋天
  2. iOS Bluetooth(蓝牙)
  3. linux vsftp的配置
  4. 关于jsp中jstl-core标签循环遍历的使用
  5. Redhat Linux编译安装LAMP环境
  6. 点云上的卷积神经网络及其部分应用
  7. 必须要知道Java如何取得当前路径
  8. Position定位
  9. 2015.7.9(1000股涨停,未按分段交易中国重工、中国软件减仓失误!补做大智慧、中色股份追高,而后控制仓位预防高开跳水——重新整理分段交易原则)发现中软吸筹率极高...
  10. linux 开机加载的文档,Linux 修改文档“打开方式”
  11. 计算机专业英语职高 试卷,职高对口高考英语模拟考试题.doc
  12. app一键签名工具 --- Android Sign Kit v1.0免费版
  13. win7电脑桌面便签哪个好用
  14. 阿里云企业邮箱使用步骤
  15. 计算机导论论文含图,计算机导论(论文).doc
  16. 如何使用光盘启动计算机,怎么用光盘PE安装win7系统
  17. Java 日志框架简介
  18. HTTP(超文本传输协议)详细解析
  19. 题目 1609: 黑色星期五
  20. python求梅森尼数_谈谈梅森旋转:算法及其爆破

热门文章

  1. backgroundWorker学习
  2. 家具销售如何引流获客的?
  3. 一款简约好看的html5音乐播放器,HTML5 之美:推荐9款优秀的 HTML5 音乐播放器
  4. Snake Rana (容斥定理)
  5. 民生银行核心分布式改造实践分享
  6. [供应商管理]-汽车零配件企业快速搭建供应商评价、绩效管理体系
  7. 访客模式 无痕模式 区别_访客设计模式
  8. Linux的网络设置
  9. 前端-Layui-,图标以及页面滚动问题
  10. HPE DL560Gen10下的闪退逃兵“windows2016 ”————自动重启问题