android aac硬解码,android AAC的音频硬解码
android AAC的音频硬解码
上一篇写了AAC音频的硬编码,今天补充硬解码,其实就是硬编码反过来,非常简单
初始化AAC硬解码资源:
public int Start() {
int iRet = 0;
_miVersion = android.os.Build.VERSION.SDK_INT;
if(_miVersion < 16) {
iRet = ErrorInfo.ERR_ANDROID_VER_NOT_SUPPORT;
return iRet;
}
if(mMediaDecode != null) {
return ErrorInfo.ERR_MEDIACODEC_EXIST_ALREADY;
}
if(_audioTrack != null) {
return ErrorInfo.ERR_AUDIOTRACK_EXIST_ALREADY;
}
mMediaDecode = MediaCodec.createDecoderByType("audio/mp4a-latm");
MediaFormat format = new MediaFormat();
format.setString(MediaFormat.KEY_MIME, "audio/mp4a-latm");
format.setInteger(MediaFormat.KEY_CHANNEL_COUNT, 1);
format.setInteger(MediaFormat.KEY_SAMPLE_RATE, _miSamplingRate);
format.setInteger(MediaFormat.KEY_BIT_RATE, _miBitRate);
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC);
mMediaDecode.configure(format, null, null, 0);
mMediaDecode.start();
_audioTrack = new MyAudioTrack(8000, AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);
_audioTrack.init();
inputBuffers = mMediaDecode.getInputBuffers();
outputBuffers = mMediaDecode.getOutputBuffers();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
_mbStartFlag = true;
_mbInitFlag = false;
return iRet;
}
对收到的AAC数据进行解码,并用_audioTrack进行播放:
需要注意的是, AAC音频第一个报文开始是一个两个字节的数据(0x15,0xF8),需要自己手动填写以下:
public void DecodeAudio(byte[] audioData) {
int iRet = 0; _miVersion = android.os.Build.VERSION.SDK_INT; if(_miVersion < 16) { return; } if(audioData == null) { return; } if(!_mbStartFlag) { return; } int iAudioDataLen = audioData.length; try { inputBufferIndex = mMediaDecode.dequeueInputBuffer(WAIT_TIME); if (inputBufferIndex >= 0) { inputBuffer = inputBuffers[inputBufferIndex]; inputBuffer.clear(); if(_mbInitFlag == false) { _mbInitFlag = true; byte[] fisrtData = new byte[2]; fisrtData[0] = 21; fisrtData[1] = -120; inputBuffer.put(fisrtData); }else { inputBuffer.put(audioData); } mMediaDecode.queueInputBuffer(inputBufferIndex, 0, iAudioDataLen, System.nanoTime()/1000, 0); } outputBufferIndex = mMediaDecode.dequeueOutputBuffer(bufferInfo, WAIT_TIME); while (outputBufferIndex >= 0) { outputBuffer = outputBuffers[outputBufferIndex]; outputBuffer.position(0); outData = new byte[bufferInfo.size]; outputBuffer.get(outData); Log.d(TAG, outData.length + " bytes decoded"); if (_audioTrack != null) { _audioTrack.playAudioTrack(outData, 0, outData.length); } mMediaDecode.releaseOutputBuffer(outputBufferIndex, false); outputBufferIndex = mMediaDecode.dequeueOutputBuffer(bufferInfo, WAIT_TIME); } } catch (Exception e) { Log.e(TAG, "Exception: "+Log.getStackTraceString(e)); } return; }
android aac硬解码,android AAC的音频硬解码相关推荐
- 基于 CoreAudio 的音频编解码(二):音频编码
系列文章目录 基于 CoreAudio 的音频编解码(一):音频解码 基于 CoreAudio 的音频编解码(二):音频编码 前言 在 基于 CoreAudio 的音频编解码(一):音频解码 中,我们 ...
- 基于 CoreAudio 的音频编解码(一):音频解码
系列文章目录 基于 CoreAudio 的音频编解码(一):音频解码 基于 CoreAudio 的音频编解码(二):音频编码 前言 Core Audio 是iOS和MAC系统中的关于数字音频处理的基础 ...
- 基于 FFMPEG 的音频编解码(三):音频编码
音频编码 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编码 在前面文章中 ...
- 基于 FFMPEG 的音频编解码(二):音频解码
音频解码 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编码 在 Hell ...
- 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译
Hello FFMPEG 基于 FFMPEG 的音频编解码(一):Hello FFMPEG,安装与编译 基于 FFMPEG 的音频编解码(二):音频解码 基于 FFMPEG 的音频编解码(三):音频编 ...
- android 使用MediaCodec(根据设备状况硬编解码)来转码音频(MP3 to aac),并同时裁剪音频
第一次写这样的博文,写得不好,望大家及时指出博文中的错误,以便于相互学习. 本来主要介绍如何使用mediacodec来转码音频,同时实现音频的裁剪.对于mediacodec相信大家都不陌生,没做过也听 ...
- 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频解码信息 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )
文章目录 安卓直播推流专栏博客总结 一. FAAC 编码器编码 AAC 音频解码信息 二. 封装 RTMP 音频数据头 三. 封装 RTMP 音频数据类型 四. 拷贝 AAC 音频数据到 RTMPPa ...
- Android音频开发(七)音频编解码之MediaCodec编解码AAC下
在上一篇初识MediaCodec中,我们认识了MediaCodec,知道了MediaCodec的基本工作流程和开发注意事项,这一篇我将讲述如何利用MediaCodec编解码AAC. 1:MediaCo ...
- android录制avi视频时aac音频的正确配置方法
在android上面,用avilib.c开源库录制过avi视频加aac音频的同学们,应该都有一段为了aac音频无法正确录制和播放而抓狂的经历.我本人也经历了这样的折磨,现在将踩过的坑记录下来,让后来者 ...
最新文章
- 安顺计算机二级考试,安顺市2020年3月计算机二级报名时间|网上报名入口【12月18日9:00开通】...
- python源码精要(6)-CPython编译标志
- python 编程语言排行榜_2019年6月编程语言排行榜:Python 排名飙升,三年内有望超越Java...
- python中的面向对象
- 基于 MaxCompute + Hologres 的人群圈选和数据服务实践
- 20190826:(leetcode习题)反转链表
- 让别人查看云服务器的文件夹,让别人查看云服务器的文件夹
- linux 卡在grub_关于linux开机进入grub问题的解决方法
- php实现成语小游戏,成语小秀才微信小程序源码-PHP代码类资_aqa7qj 源码采用php实现 - 下载 - 搜珍网...
- 2021-2026年中国畜牧业发展环境分析及投资前景预测报告
- 「GoTeam 招聘时间」滴滴出行系统研发工程师(北京)
- SOA和Web Service
- Android系统介绍与框架
- 构建基于词典的Lucene分析器
- Python综合评价模型(二)灰色关联度法
- 一款可编程的的串口调试工具 报文分类 脚本编程
- 机器学习翻译任务中的constrain decoding 实现流程方法详解
- 计算有固定收入的党员每月所交纳的党费。月工资收入400元及以下者,交纳月工资总额的0.5%;月工资收入401~600元者,交纳月工资总额的1%;月工资收入601~800元者,交纳月工资总额的1.5%;
- uniapp nvue使用live-pusher组件以及腾讯云实现直播推拉流
- 三种技术实现PC1、PC2与PC3都通,而PC1与PC2不通