在 Android 上切换视频编解码方式为 H.264

在 Android 上切换视频编解码方式为 H.264,可以使用 MediaCodec API。具体步骤如下:

  1. 创建一个 H.264 编码器或解码器的实例。

  2. 配置编码器或解码器的参数,包括视频格式、分辨率、比特率等。

  3. 准备输入数据和输出数据的缓冲区,并将其与编码器或解码器绑定。

  4. 将需要编码或解码的数据写入输入缓冲区。

  5. 从输出缓冲区读取编码或解码后的数据。

  6. 释放资源并销毁编码器或解码器的实例。

以下是示例代码,以创建一个 H.264 编码器为例:

MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height);
format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);
format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFrameInterval);

MediaCodec encoder = MediaCodec.createEncoderByType("video/avc");
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
Surface inputSurface = encoder.createInputSurface();
encoder.start();

在这个示例中,我们首先创建了一个 MediaFormat 对象,用于指定编码器的参数。然后,我们使用 MediaCodec.createEncoderByType() 方法创建一个 H.264 编码器的实例。接下来,我们调用 configure() 方法将编码器配置为编码模式,并传入之前创建的 MediaFormat 对象。最后,我们调用 start() 方法启动编码器。

接下来,在处理视频数据时,我们将视频帧渲染到 Surface 上,然后将 Surface 作输入缓冲区与编码器绑定。具体代码如下:

// 渲染视频帧到 Surface
inputSurface = encoder.createInputSurface();
EglCore eglCore = new EglCore(null, EglCore.FLAG_RECORDABLE);
WindowSurface windowSurface = new WindowSurface(eglCore, inputSurface, true);
windowSurface.makeCurrent();

// 处理视频数据
GLES20.glClearColor(0.0f, 1.0f, 0.0f, 0.5f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
windowSurface.swapBuffers();

在处理完视频数据后,我们需要通过编码器的输出缓冲区获取编码后的数据。具体代码如下:

int outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, TIMEOUT_US);
if (outputBufferIndex >= 0) {
    ByteBuffer encodedData = encoder.getOutputBuffer(outputBufferIndex);
    if (encodedData == null)        throw new RuntimeException("encoderOutputBuffer " + outputBufferIndex + " was null");
    }

    // 处理编码后的数据
    handleEncodedData(encodedData, bufferInfo);

    encoder.releaseOutputBuffer(outputBufferIndex, false);
} else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
    // 处理格式变化,例如获取 sps、pps 等信息
    MediaFormat newFormat = encoder.getOutputFormat();
    handleOutputFormatChanged(newFormat);
}

在这个示例中,我们使用 dequeueOutputBuffer() 方法从编码器的输出缓冲区获取编码后的数据,并将其传递给 handleEncodedData() 方法进行处理。如果输出缓冲区中有变化,则会返回 MediaCodec.INFO_OUTPUT_FORMAT_CHANGED,此时我们需要获取新的格式信息并进行相应的处理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

chmod 命令 (chmod 0660)

chmod的作用: 用于设置文件所有者和文件关联组的命令,就是控制用户的权限命令 注意事项: chown 需要超级用户 root 的权限才能执行此命令。 自己常用chmod 命令是 chmod 777 * 给所有文件权限 chmod 777 文件名 给单独文件权限 这个777 是怎么来的, 或者chmod 0660 这…

java 获取时间的方法

Java的时间是通过字节码指令来控制的,所以 java程序的运行时间是通过字节码指令来控制的。但是由于 Java程序在运行时, JVM会产生一些状态,所以在执行 JVM指令时, JVM也会产生一些状态。 我们在执行 java程序时,主要是…

kafka延时队列内部应用简介

kafka延时队列_悠然予夏的博客-CSDN博客 两个follower副本都已经拉取到了leader副本的最新位置,此时又向leader副本发送拉取请求,而leader副本并没有新的消息写入,那么此时leader副本该如何处理呢?可以直接返回空的拉取结…

IEEE14节点系统在如短路分析,潮流研究,互连电网中的研究(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

easyrecovery16最新数据恢复软件密钥使用方法教程

easyrecovery是一款专业的数据恢复软件,其最新版本为easyrecovery2023将于2022年底发布。总之,easyrecovery是一款功能齐全、性能稳定的专业数据恢复软件,无论删除文件、格式化分区或磁盘故障,它都可以提供最高的恢复成功率。值得个人用户选用。此版本在功能和性能上有较大提升…

BBR原版/魔改/plus/锐速/七合一脚本linux加速脚本/硬盘挂载/cc防御/宝塔

BBR原版/魔改/plus/锐速七合一脚本linux加速脚本/硬盘挂载/CC防御/宝塔 新云分享的七合一脚本,包含原版BBR、魔改BBR、bbrplus以及锐速可选。 在vultr上Centos 7, Debian 8/9, Ubuntu 16/18测试通过,不支持ovz。 安装指令:复制下面命令在s…

基于构效关系模型的药物设计(QSAR)

基于构效关系模型的药物设计(QSAR) 定量构效关系(QSAR,Quantitative Structure-Activity Relationship)分析是指利用理论计算和统计分析工具来研究系列化合物结构(包括二维分子结构、三维分子结构和电子结…

【Maven 入门】第二章、Maven核心程序解压与配置

一、Maven 官网地址 首页: Maven – Welcome to Apache Maven(opens new window) 下载页面: Maven – Download Apache Maven(opens new window) 本文以maven-3.3.8为例 具体下载地址:https://dlcdn.apache.org/maven/maven-3/3.8.8/bina…

【问题记录】docker 搭建 minio

一、搭建过程 docker 搜索minio镜像 docker search miniodocker 拉取镜像 docker pull minio/miniodocker 启动 minio docker run -p 9900:9900 --name minio -d --restartalways -e MINIO_ACCESS_KEYminio -e MINIO_SECRET_KEY1qazWSX -v /usr/local/minio/data:/data -v …

vue-cli的使用和单页面应用程序、使用vue-cli脚手架创建vue项目步骤

1.vue-cli的使用 vue-cli是Vue.js开发的标准工具。它简化了程序员基于webpack创建工程化的Vue项目的过程。 引用自vue-cli官网上的一句话: 程序员可以专注在撰写应用上,而不必花好几天去纠结webpack配置的问题。 中文官网: https://cli.vuejs.org/zh/ 1.1 安装 …

8年测开年薪30W,为什么从开发转型为测试?谈谈这些年的心路历程……

谈谈我的以前,从毕业以来从事过两个多月的Oracle开发后转型为软件测试,到现在已近过去8年成长为一个测试开发工程师,总结一下之间的心路历程,希望能给徘徊在开发和测试之前的同学一点小小参考。 一、测试之路伏笔 上学偷懒&#…

updateByPrimaryKey和updateByPrimaryKeySelective的区别

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl MyBatis Generator概述 MyBatis Generator是一个专门为MyBatis框架使用者定制的代码生成器,它可以快速的根据表生成对应的映射文件、接口文件、POJO。而且&#…

哪个品牌的洗地机更好用?热门洗地机盘点

洗地机没有使用过之前一直怀疑是不是智商税,等到后面体验过之后,发现是真的香。因为不可否认的是,洗地机的清洁力还是不错的。不仅能够快速清洁干净地面,大大的节省了我们的清洁用时,操作起来也省心省力。作为一个洗地…

Linux下实现C语言程序

一.情况说明 写这篇博客的情况比较复杂,首先我本来是参加新星计划按照规划现在去学习shell脚本语言的,但是博主现在由于其他原因需要了解makefile,makefile是Linux系统下的一种工具,makefile的一些背景要涉及链接库的知识&#xf…

css初入门:网页布局之网格布局-grid

文章目录 网格布局-grid1、设置网格布局2、网格布局介绍3、网格容器grid-template-columns属性grid-template-rows 属性justify-content 属性justify-items属性align-content 属性 4、网格项目grid-column-start、grid-column-start、grid-column属性grid-row-start、grid-row-…

4.2.2字符串KMP算法

对朴素模式匹配算法的优化: 当我们匹配最后一个字符才发现匹配失败。 那么前面这些字符一定是与模式串对应的。 通过模式串的部分匹配 朴素模式匹配算法优化思路: 不匹配的字符之前,一定是和模式串一致的。 可以跳过中间好几个没有必要的对比…

如何将项目提交到别人的仓库

大纲: 1、在gitee中克隆(clone)别人仓库的代码。 首先,进入别人的仓库,点击 克隆/下载 2、在你存放项目的文件夹下克隆你刚刚复制的代码 (右键点击Git Clone即可) 点击OK 就开始克隆了 克隆成功之后,文件上…

Maya英文界面怎么改为中文界面

Maya是一款3D动画和视觉效果软件,用于创建逼真的角色和大片般的效果,也是受到电影、电视和游戏行业的 3D 建模师、动画师、照明艺术家和 VFX 艺术家等多数人喜爱的一款3D软件。我们在使用Maya的过程中,常常会遇到一些小阻碍,比如M…

蓝牙耳机接打电话哪个比较好?接打电话最好的蓝牙耳机

技术已经发展到如此程度,耳机可以淹没嘈杂环境中不断出现的杂音,同时还能让我们在通话、音乐和娱乐方面保持清晰,既然如此,我们就来整理一下2023年适合通话和娱乐的无线耳机清单。 一、南卡小音舱Lite2蓝牙耳机 参考价格&#x…

基于Java+jquery+SpringMVC校园网站平台设计和实现

基于JavajquerySpringMVC校园网站平台设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目…
最新文章