Android为ijkplayer设置音频发音类型usage
官方文档
多区音频路由 | Android Open Source Project
https://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