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

Android为ijkplayer设置音频发音类型usage

官方文档

多区音频路由  |  Android Open Source Projecthttps://source.android.google.cn/docs/automotive/audio/audio-multizone-routing?hl=zh-cn

背景

车机系统开发多分区(zone)功能,可以实现同一个app通过设置,在不同分区发声。比如音乐正常是整车播放的,可以在乘客休息只在司机座位头枕播放。

android14以上可以通过镜像播放的方式(MirrorDevice)实现,但是Android13以下由于代码比较老,没有这部分实现,常见的方法是通过设置usage方式,指定硬件bus来解决。

比如系统MediaPlayer的调用方式:

由于系统mediaplayer对格式的支持不够全面,所以我项目要求使用的都是ijkplayer进行音视频播放。遗憾的是官方的源码并没有以上方法(如果你使用的不是ffmpeg,而是explayer是有的)。所以我通过源码修复了方式加入了音频类型设置功能。

代码修改

1. 文件:android_audiotrack.h

void SDL_Android_AudioTrack_set_default_stream_type(int stream_type);

2. 文件:android_audiotrack.h

//add
static int g_stream_type = STREAM_MUSIC; // 默认值为 STREAM_MUSICvoid SDL_Android_AudioTrack_set_default_stream_type(int stream_type) {g_stream_type = stream_type;
}static void SDL_Android_AudioTrack_get_default_spec(SDL_Android_AudioTrack_Spec *spec)
{assert(spec);
//    spec->stream_type = STREAM_MUSIC;spec->stream_type = g_stream_type;spec->sample_rate_in_hz = 0;spec->channel_config = CHANNEL_OUT_STEREO;spec->audio_format = ENCODING_PCM_16BIT;spec->buffer_size_in_bytes = 0;spec->mode = MODE_STREAM;
}

3. 文件:jjkplayer_jni.c

// add
static void
IjkMediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, jint streamType)
{MPTRACE("%s(%d)\n", __func__, streamType);SDL_Android_AudioTrack_set_default_stream_type(streamType);}
....{ "_setAudioStreamType",    "(I)V",   (void *) jkMediaPlayer_setAudioStreamType} ,

4. 文件:jkMediaPlayer.java

   @Overridepublic void setAudioStreamType(int streamtype) {// do nothing//add_setAudioStreamType(streamtype);}// addprivate  native void _setAudioStreamType(int streamtype);

编译ijkplayer源码

可以参考 ubuntu编译ijkplayer版本k0.8.8(ffmpeg4.0)-CSDN博客

使用

可以看到ijkplayer源码setAudioStreamType方法并没有进行jni实现,我们修改源码实现后,传入自定义类型数字就行,这个数字需要和音频同事确定,不可以随便填写,最终会绑定到音频bus上。这样音频同事就可以根据不同bus,设定发声区域。

其他

jkpalyer 编译后的demo及so文件:

https://download.csdn.net/download/suyuan1990115/91725292https://download.csdn.net/download/suyuan1990115/91725292

http://www.dtcms.com/a/342117.html

相关文章:

  • 如何用 SolveigMM Video Splitter 从视频中提取 AAC 音频
  • CMake3: CMake的嵌套使用与自定义库
  • Spring Event 企业级应用
  • 笔试——Day45
  • Prompt魔法:提示词工程与ChatGPT行业应用读书笔记:提示词设计全能指南
  • 第四章:大模型(LLM)】07.Prompt工程-(7)角色提示
  • Flink基础
  • 解锁工业级Prompt设计,打造高准确率AI应用
  • Web自动化测试:测试用例流程设计
  • Java设计模式-解释器模式
  • 策略模式 vs 适配器模式
  • 基于STM32设计的大棚育苗管理系统(4G+华为云IOT)_265
  • 移动应用抓包与调试实战 Charles工具在iOS和Android中的应用
  • 数据结构初阶:详解二叉树(三):链式二叉树
  • system\core\init\init.cpp----LoadBootScripts()解析init.rc(1)
  • STM32之串口详解
  • 学习Linux嵌入式(正点原子imx课程)开发到底是在学什么
  • Spring Cloud Netflix学习笔记06-Zuul
  • Kafka消息持久化机制全解析:存储原理与实战场景
  • Kafka集成Flume
  • 人工智能 -- 循环神经网络day1 -- 自然语言基础、NLP基础概率、NLP基本流程、NLP特征工程、NLP特征输入
  • 算法 之 拓 扑 排 序
  • LeetCode 回文链表
  • 桥梁设计模式
  • RabbitMQ事务消息原理是什么
  • RabbitMQ:延时消息(死信交换机、延迟消息插件)
  • 领域专用AI模型训练指南:医疗、法律、金融三大垂直领域微调效果对比
  • 28、工业网络资产漏洞扫描与风险评估 (模拟) - /安全与维护组件/industrial-network-scanner
  • 深度解析Atlassian 团队协作套件(Jira、Confluence、Loom、Rovo)如何赋能全球分布式团队协作
  • Whisk for Mac 网页编辑器 PHP开发