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

AudioTrack播放音乐之getMinBufferSize

1. AudioTrack播放音乐之前需要做好准备,即需要先计算最小音频数据缓存空间

文件路径:AudioTrack.java (frameworks\base\media\java\android\media)

static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) {

@参数sampleRateInHz,音频源的采样率

@参数channelConfig,音频声道配置,如AudioFormat#CHANNEL_OUT_MONO

@参数audioFormat,音频数据格式,如AudioFormat#ENCODING_PCM_16BIT

@返回值,无效参数则返回ERROR_BAD_VALUE,不能查询硬件输出性能则返回ERROR,顺利执行则返回得到的最小音频数据缓存空间大小

int channelCount = 0;

..................

// 源采样率参数检测

if ( (sampleRateInHz < SAMPLE_RATE_HZ_MIN) || (sampleRateInHz > SAMPLE_RATE_HZ_MAX) ) {

loge("getMinBufferSize(): " + sampleRateInHz + " Hz is not a supported sample rate.");

return ERROR_BAD_VALUE;

}

//下面这个函数就是进入底层获取最小音频数据内存

int size = native_get_min_buff_size(sampleRateInHz, channelCount, audioFormat);

@参数sampleRateInHz,音频源的采样率

@参数channelCount,音频声道类型,如1表示单声道,2表示多声道

@参数audioFormat,音频数据格式,如AudioFormat#ENCODING_PCM_16BIT

..........

}

2. 由native_get_min_buff_size函数通过JNI进入android_media_AudioTrack_get_min_buff_size函数

文件路径:android_media_AudioTrack.cpp (frameworks\base\core\jni)

static jint android_media_AudioTrack_get_min_buff_size(JNIEnv *env, jobject thiz,

jint sampleRateInHertz, jint channelCount, jint audioFormat) {

@参数sampleRateInHz,音频源的采样率

@参数channelCount,音频声道类型,如1表示单声道,2表示多声道

@参数audioFormat,音频数据格式,如AudioFormat#ENCODING_PCM_16BIT

@若获取最小音频数据缓存内存失败,则返回-1;成功则返回帧个数即最小音频数据缓存大小

size_t frameCount;

//获取最小帧个数,这个函数将进入底层的audiotrack函数

const status_t status = AudioTrack::getMinFrameCount(&frameCount,

AUDIO_STREAM_DEFAULT,

sampleRateInHertz);

@参数&frameCount,得到的最小帧个数的存储变量

@参数AUDIO_STREAM_DEFAULT,默认音频流类型

@参数sampleRateInHertz,音频源采样率

if (status != NO_ERROR) {

ALOGE("AudioTrack::getMinFrameCount() for sample rate %d failed with status %d",

sampleRateInHertz, status);

return -1;

}

//音频数据格式转换,如AudioFormat#ENCODING_PCM_16BIT转换为

const audio_format_t format = audioFormatToNative(audioFormat);

@参数audioFormat,音频数据格式,如AudioFormat#ENCODING_PCM_16BIT

if (audio_is_linear_pcm(format)) { //判断是否为PCM音频数据,pcm是音频裸流数据

//每个采样点比特位数,函数路径为system/media/audio/include/system/audio.h

const size_t bytesPerSample = audio_bytes_per_sample(format);

return frameCount * channelCount * bytesPerSample; //计算最小音频数据缓存大小并返回

} else {

return frameCount;

}

}

2.1. 进入AudioTrack::getMinFrameCount()函数获取帧个数

路径:AudioTrack.cpp (frameworks\av\media\libmedia)

// static

status_t AudioTrack::getMinFrameCount(

size_t* frameCount,

audio_stream_type_t streamType,

uint32_t sampleRate)

{

@参数frameCount,得到的最小帧个数的存储变量

http://www.lryc.cn/news/149318.html

相关文章:

  • React和Redux中的不变性
  • NPM 常用命令(一)
  • 【ES6】Promise推荐用法
  • 【JavaScript】版本判断
  • Nano编辑器安装使用指南
  • Java版电子招投标管理系统源码-电子招投标认证服务平台-权威认证
  • Java String类(1)
  • 渗透测试漏洞原理之---【CSRF跨站请求伪造】
  • 带量采购药品数据查询集采分析平台(建议收藏!)
  • 概念解析 | 无线感知的新篇章:异构网络感知的原理与挑战
  • 【大数据模型】让chatgpt为开发增速(开发专用提示词)
  • 读书笔记-《ON JAVA 中文版》-摘要23[第二十章 泛型-2]
  • 【爬虫】5.6 Selenium等待HTML元素
  • 0102阿里云配置3台ECS服务器-大数据学习
  • android 输入法demo
  • 【经验分享】Markdown中如何显示空格和回车
  • 深入篇【C++】set和map(multiset/multimap)特性总结与使用
  • OpenAI推出ChatGPT企业版,提供更高安全和隐私保障
  • Linux虚拟机磁盘扩容
  • 【Go 基础篇】Go语言结构体实例的创建详解
  • 服务器上使用screen的学习记录
  • 基于Django+node.js+MySQL+杰卡德相似系数智能新闻推荐系统——机器学习算法应用(含Python全部工程源码)+数据集
  • 2001-2022年全国各区县最低工资数据
  • D357周赛复盘:模拟双端队列反转⭐⭐+贪心
  • 大数据项目实战(安装Hive)
  • 跨屏无界 | ZlongGames 携手 Google Play Games 打造无缝游戏体验
  • mysql数据文件
  • Vue2里监听localstorage里值的变化
  • QSqlDatabase(2)实例,QTableView显示数据库表数据
  • vue3 监听props 的变化