官方文檔
多區音頻路由 ?|? 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