当前位置: 首页 > news >正文

Android笔记--MediaCodec(二)

         这一节主要了解MediaCodec处理音频,MediaCodec直译媒体解码器,用于访问媒体编解码器,即编码器/解码器组件,它是 Android 多媒体支持基础设施的一部分;从广义上讲,编解码器处理输入数据以生成输出数据。它异步处理数据并使用一组输入和输出缓冲区。在简单的层面上,您请求(或接收)一个空的输入缓冲区,用数据填充它并将其发送到编解码器进行处理。编解码器用完数据并将其转换为空输出缓冲区之一。最后,您请求(或接收)已填充的输出缓冲区,使用其内容并将其释放回编解码器。

        PCM(脉冲编码调制)是一种常见的音频数据格式,但由于其体积较大,不利于网络传输和存储,因此通常需要将其转换为AAC(高级音频编码)格式,简单看个栗子:

 PCM转AAC:

 1. 创建AAC编码器MediaFormat format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, sampleRate, channelCount);  
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);  
format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate);  
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, frameSize); // 根据你的PCM数据设置  MediaCodec encoder = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_AUDIO_AAC);  
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);  
encoder.start();
2. 编码PCM数据ByteBuffer[] inputBuffers = encoder.getInputBuffers();  
ByteBuffer[] outputBuffers = encoder.getOutputBuffers();  
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();  // 假设你有一个PCM数据的ByteBuffer  
ByteBuffer pcmData = ...; // 从文件或网络获取PCM数据  int inputBufferIndex = encoder.dequeueInputBuffer(-1);  
if (inputBufferIndex >= 0) {  ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];  inputBuffer.clear();  inputBuffer.put(pcmData);  encoder.queueInputBuffer(inputBufferIndex, 0, pcmData.remaining(), 0, 0);  
}  int outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, 10000);  
while (outputBufferIndex >= 0) {  ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];  byte[] aacData = new byte[bufferInfo.size];  outputBuffer.get(aacData);  // 处理AAC数据,例如写入文件或发送到网络  encoder.releaseOutputBuffer(outputBufferIndex, false);  outputBufferIndex = encoder.dequeueOutputBuffer(bufferInfo, 0);  
}  // 结束编码  
encoder.signalEndOfInputStream();

AAC转PCM

1. 创建AAC解码器MediaFormat format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, sampleRate, channelCount);  
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);  
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, aacFrameSize); // 根据你的AAC数据设置  MediaCodec decoder = MediaCodec.createDecoderByType(MediaFormat.MIMETYPE_AUDIO_AAC);  
decoder.configure(format, null, null, 0);  
decoder.start();
2. 解码AAC数据ByteBuffer[] inputBuffers = decoder.getInputBuffers();  
ByteBuffer[] outputBuffers = decoder.getOutputBuffers();  
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();  // 假设你有一个AAC数据的ByteBuffer  
ByteBuffer aacData = ...; // 从文件或网络获取AAC数据  int inputBufferIndex = decoder.dequeueInputBuffer(-1);  
if (inputBufferIndex >= 0) {  ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];  inputBuffer.clear();  inputBuffer.put(aacData);  decoder.queueInputBuffer(inputBufferIndex, 0, aacData.remaining(), 0, 0);  
}  int outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, 10000);  
while (outputBufferIndex >= 0) {  ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];  byte[] pcmData = new byte[bufferInfo.size];  outputBuffer.get(pcmData);  // 处理PCM数据,例如播放或写入文件  decoder.releaseOutputBuffer(outputBufferIndex, true);  outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, 0);  
}  // 结束解码  
decoder.stop();  
decoder.release();

注:

正确配置编解码器:在创建和配置MediaCodec实例时,需要确保使用正确的参数,如音频格式、采样率、通道数等。这些参数应该与你的音频数据源和目标格式相匹配。错误的配置可能导致编码或解码失败。

处理缓冲区:MediaCodec使用输入和输出缓冲区来传递音频数据。你需要正确地管理这些缓冲区,包括从PCM数据源读取数据到输入缓冲区,以及从输出缓冲区获取编码后的AAC数据。

线程同步:音频编码和解码通常是异步进行的,因此需要在正确的线程上调用MediaCodec的方法,并妥善处理线程同步问题。

相关文章:

Android笔记--MediaCodec(二)

这一节主要了解MediaCodec处理音频,MediaCodec直译媒体解码器,用于访问媒体编解码器,即编码器/解码器组件,它是 Android 多媒体支持基础设施的一部分;从广义上讲,编解码器处理输入数据以生成输出数据。它异…...

【Java探索之旅】方法重载 递归

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、方法重载1.1 为什么要有方法重载1.2 方法重载的概念与使用1.3 方法签名 二、递归2…...

多输入多输出 | Matlab实现XGboost多输入多输出预测

多输入多输出 | Matlab实现XGboost多输入多输出预测 目录 多输入多输出 | Matlab实现XGboost多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现XGboost多输入多输出预测 1.data为数据集,10个输入特征,3个输出变量…...

【设计模式】3、builder 建造者模式

文章目录 三、builder 模式(生成器)3.1 build 房屋3.1.1 builder.go3.1.2 director.go3.1.3 director_test.go3.1.4 house.go3.1.5 igloo_builder.go3.1.6 normal_builder.go3.1.7 测试 3.2 option3.2.1 pool_test.go3.3.2 pool.go3.3.3 option.go 3.3 自…...

使用ROCm的HIP API向量加法程序

一、向量加法程序 Radeon Open Compute (ROCm) 是一个开源平台,用于加速高性能计算 (HPC) 和机器学习应用程序。它支持包括GPUs在内的多种硬件,并提供HIP (Heterogeneous-compute Interface for Portability) 作为CUDA代码的便捷转换工具。为了提供一个…...

Vue3---基础7(Props)

props&#xff0c;用于给子组件传递父组件的值的方法 代码示例&#xff1a; 父组件 <template><Text1 :list"personList"/> </template><script lang"ts" setup namae"App">import Text1 from ./components/text2.vu…...

第一节:什么是操作系统

什么是操作系统 一、一台计算机的组成部分1、计算机能干啥2、谈谈计算机硬件 二、什么是操作系统三、学习操作系统的层次 一、一台计算机的组成部分 如下图所示&#xff1a; 这就是就是构成一台计算机的组成部分 1、计算机能干啥 ∙ \bullet ∙计算机是我们专业吃饭的家伙&a…...

Day:007(1) | Python爬虫:高效数据抓取的编程技术(scrapy框架使用)

Scrapy的介绍 Scrapy 是一个用于抓取网站和提取结构化数据的应用程序框架&#xff0c;可用于各种有用的应用程序&#xff0c;如数据挖掘、信息处理或历史存档。 尽管 Scrapy 最初是为网络抓取而设计的&#xff0c;但它也可用于使用API提取数据或用作通用网络爬虫。 Scrapy的优势…...

Echarts使用dataTool写可自定义横坐标的盒须图(箱线图)

在vue2中的完整盒须图组件代码 可自适应浏览器窗体变化&#xff0c;可自定义横坐标&#xff0c;无需写箱线图数据处理逻辑。dataTool是echarts自带的&#xff0c;无需额外安装&#xff0c;只要引入。 <template><span><div ref"BoxPlotChart" id&qu…...

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…...

【Qt编译】ARM环境 Qt5.14.2-QtWebEngine库编译 (完整版)

ARM 编译Qt5.14.2源码 1.下载源码 下载Qt5.14.2源代码&#xff08;可根据自己的需求下载不同版本&#xff09; 下载网站&#xff1a;https://download.qt.io/new_archive/qt/5.14/5.14.2/single/ 2.相关依赖(如果需要的话) 先参考官方文档的需求进行安装&#xff1a; 官方…...

vue简单使用二(循环)

目录 属性绑定 if判断&#xff1a; for循环&#xff1a; 属性绑定 代码的形式来说明 三元表达式的写法&#xff1a; if判断&#xff1a; for循环&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"…...

JavaScript入门--变量

JavaScript入门--变量 一、JS变量二、变量命名三、常量四、局部变量 一、JS变量 定义变量a, b, c&#xff0c;并输出到控制台。 var a 1; var b 13.14; var c hello Js;console.log(a, b, c) //console.log()语句用于输出结果到控制台&#xff0c;类似python的print语句…...

给自己的机器人部件安装单目摄像头并实现gazebo仿真功能

手术执行器添加摄像头 手术执行器文件夹surgical_new内容展示如何添加单目摄像头下载现成的机器人环境文件启动仿真环境 手术执行器文件夹surgical_new内容展示 进入src文件夹下选择进入vision_obliquity文件夹 选择launch 有两个可用gazebo中rviz展示的launch文件&#xff0…...

用AI的视角看世界

前言 2024年将是Ai人工智能在各个行业垂直领域发展的元年。 随着2022年11月openai 的大语言模型chatgpt3.5的诞生&#xff0c;已经预示着互联网时代&#xff0c;移动互联网时代即将迎来新的变革&#xff0c;也预示着web3.0和元宇宙更近了一步。 回顾历史&#xff0c;互联网的…...

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64)

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64) 一、算法介绍二、算法步骤三、算法实现1.代码 (完整,注释清晰,可直接用)2.结果一、算法介绍 首先说明: ------这里代码手动实现,不调用matlab提供的法向量计算接口,更有助于大家了解法向量和曲率的计算方法,…...

拯救鲨鱼!Helping wireshark!wireshark未响应解决方法

前言 做题的的时候 在用wireshark解密tls秘钥的时候 我的小鲨鱼突然未响应了 然后我多次尝试无果 并且殃及池鱼 我电脑上所有的流量包都打不开了&#xff1f;&#xff01;&#xff01;&#xff01; 于是乎 尝试删了重下 还是未响应 开始怀疑电脑 重启电脑两次 还是打…...

设计模式之责任链讲解

责任链模式适用于需要将请求和处理解耦的场景&#xff0c;同时又需要动态地组织处理逻辑的场景。 通过使用责任链模式&#xff0c;可以实现请求的动态处理、灵活的扩展和简化的代码编写&#xff0c;提高系统的可维护性和可扩展性。 一、责任链入门 以下这是GPT生成的责任链代…...

K8s: 将一个节点移出集群和相关注意事项

前置步骤 在Kubernetes集群中&#xff0c;要移出一个节点&#xff0c;你需要执行以下步骤&#xff1a; 1 &#xff09;将节点标记为不可调度 首先&#xff0c;你需要将目标节点标记为不可调度&#xff0c;以确保Kubernetes不会在该节点上调度新的Pod这可以通过执行以下命令实…...

Python学习笔记24 - 学生信息管理系统

1. 需求分析 2. 系统设计 3. 系统开发必备 4. 主函数设计 5. 学生信息维护模块设计 a. 录入学生信息 b. 删除学生信息 c. 修改学生信息 d. 查询学生信息 e. 统计学生总人数 f. 显示所有学生信息 g. 排序模块设计 6. 项目打包...

自动化测试(十二) 分布式系统测试-缓存-注册中心与链路追踪验证

分布式系统测试&#xff1a;缓存、注册中心与链路追踪验证上篇咱们搞定了消息队列测试&#xff0c;今天继续深入分布式系统的其他组件——Redis缓存、服务注册中心、分布式链路追踪。这些"基础设施"的测试往往被忽略&#xff0c;但出了问题定位起来最头疼。一、Redis…...

别再死记硬背段码了!用Python脚本自动生成数码管显示码表(支持共阳/共阴)

用Python解放双手&#xff1a;动态生成数码管段码的工程实践 数码管作为电子设计中最基础的显示元件之一&#xff0c;其驱动原理看似简单却暗藏玄机。传统开发流程中&#xff0c;工程师需要反复查阅手册或记忆十六进制段码&#xff0c;这种低效模式在复杂项目中将消耗大量时间。…...

开源机械爪智能增强:计算机视觉与运动规划赋予抓取超能力

1. 项目概述&#xff1a;当“机械爪”遇上“超能力”如果你玩过抓娃娃机&#xff0c;或者关注过工业自动化&#xff0c;对机械爪&#xff08;Claw&#xff09;这个概念一定不陌生。它的核心任务简单直接&#xff1a;识别、定位、抓取。但现实往往骨感——面对形状不规则、材质光…...

用Matplotlib heatmap分析你的数据:从农产品收成到商品销量的实战案例拆解

用Matplotlib heatmap解锁业务洞察&#xff1a;从农场到电商的数据可视化实战 热力图&#xff08;heatmap&#xff09;远不止是颜色方块的排列——它是数据与商业决策之间的视觉桥梁。想象一下&#xff0c;你面前有一张农场作物产量的热力图&#xff0c;颜色从深绿渐变到亮黄&a…...

从惊叹到依赖:软件定义时代的技术信任与实用指南

1. 从“惊叹”到“依赖”&#xff1a;我们与技术关系的深度剖析“这玩意儿以前没有的时候&#xff0c;我们是怎么活过来的&#xff1f;” 这念头时不时就会冒出来。我能看懂纸质地图&#xff0c;甚至开车时有时觉得它比谷歌地图更靠谱&#xff1b;我也记得在厚厚的黄页里翻找电…...

从Gemini Nano到Orion Core:Google 2026 AI芯片级升级路线图(附17个真实POC性能基准数据)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini Nano到Orion Core&#xff1a;Google 2026 AI芯片级演进全景图 Google 正在以空前的系统性节奏重构其AI硬件栈——从终端侧轻量模型推理引擎 Gemini Nano&#xff0c;到2026年即将量产的全栈自研…...

Python 爬虫反爬突破:CDN 防护节点穿透采集

前言 当下大型互联网站点、电商平台资讯门户、行业数据网站均全面接入 CDN 内容分发网络&#xff0c;借助全球节点缓存、流量调度、智能分流、节点 IP 隐身、区域访问限制等机制构建底层防护体系。传统爬虫直接请求源站 IP 的方式会被 CDN 节点拦截、跳转、限速、IP 封禁、节点…...

GitHub 74.2k Star的Redis,开发者必备的内存数据库

文章目录GitHub 74.2k Star的Redis&#xff0c;开发者必备的内存数据库核心能力覆盖多数开发场景实际使用建议GitHub 74.2k Star的Redis&#xff0c;开发者必备的内存数据库 Redis是GitHub上的热门开源项目&#xff0c;Star数达到74223&#xff0c;是很多开发者日常工作中常用…...

鸿蒙系统安装

一、下载 DevEco Studio 打开华为开发者官网&#xff0c;找到 DevEco Studio 6.1.0 Release 下载页面。 DevEco Studio for Windows 6.1.0.830(2.8GB) 下载。 Mac 用户可以选择对应版本&#xff08;x86/ARM&#xff09;。 等待下载完成&#xff0c;得到 .exe 安装文件。二、安装…...

【研报 A114】2026人工智能时代企业技能管理数字化转型白皮书:AI驱动全生命周期闭环,迭代速度提升70%

摘要&#xff1a;智能汽车产业加速升级&#xff0c;车企正面临员工技能迭代的核心挑战&#xff0c;AI 原生技能管理成为转型关键。依托生成式 AI、多智能体等技术&#xff0c;全新的技能管理体系贯穿技能梳理、培养、评估、应用全生命周期&#xff0c;将技能转化为车企的核心无…...