我想同时播放两个不同的文件。
我尝试找到播放器并尝试扩展默认播放器来实现这一点,但都没有成功。请告诉我最好的方法是什么,可以同时播放音频和视频?
之所以选择分开的文件,是为了节省空间,因为该应用程序将进行本地化,对于每种语言有多个音频文件而不是多个视频可以节省空间。这很重要,因为Android不允许下载超过50MB
的应用程序大小。
任何关于此的帮助都将非常有用。如果提供给我此方面的代码,那将是极大的帮助。
谢谢您的提前帮助。
我想同时播放两个不同的文件。
我尝试找到播放器并尝试扩展默认播放器来实现这一点,但都没有成功。请告诉我最好的方法是什么,可以同时播放音频和视频?
之所以选择分开的文件,是为了节省空间,因为该应用程序将进行本地化,对于每种语言有多个音频文件而不是多个视频可以节省空间。这很重要,因为Android不允许下载超过50MB
的应用程序大小。
任何关于此的帮助都将非常有用。如果提供给我此方面的代码,那将是极大的帮助。
谢谢您的提前帮助。
requestAudioFocus()
时,必须提供一个AudioFocusRequest
参数。要释放音频焦点,请调用abandonAudioFocusRequest()
方法,该方法也接受一个AudioFocusRequest
作为其参数。请求和放弃焦点时应使用相同的AudioFocusRequest
实例。AudioFocusRequest
,使用一个 AudioFocusRequest.Builder
。由于焦点请求必须始终指定请求的类型,因此该类型包含在构造器中。使用构建器的方法设置请求的其他字段。AudioFocusRequest.Builder
构建 AudioFocusRequest
并请求和放弃音频焦点:audioManager = (AudioManager) Context.getSystemService(Context.AUDIO_SERVICE);
playbackAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(playbackAttributes)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(afChangeListener, handler)
.build();
mediaPlayer = new MediaPlayer();
final Object focusLock = new Object();
boolean playbackDelayed = false;
boolean playbackNowAuthorized = false;
// ...
int res = audioManager.requestAudioFocus(focusRequest);
synchronized(focusLock) {
if (res == AudioManager.AUDIOFOCUS_REQUEST_FAILED) {
playbackNowAuthorized = false;
} else if (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
playbackNowAuthorized = true;
playbackNow();
} else if (res == AudioManager.AUDIOFOCUS_REQUEST_DELAYED) {
playbackDelayed = true;
playbackNowAuthorized = false;
}
}
// ...
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
if (playbackDelayed || resumeOnFocusGain) {
synchronized(focusLock) {
playbackDelayed = false;
resumeOnFocusGain = false;
}
playbackNow();
}
break;
case AudioManager.AUDIOFOCUS_LOSS:
synchronized(focusLock) {
resumeOnFocusGain = false;
playbackDelayed = false;
}
pausePlayback();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
synchronized(focusLock) {
resumeOnFocusGain = true;
playbackDelayed = false;
}
pausePlayback();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
// ... pausing or ducking depends on your app
break;
}
}
}
MediaPlayer
中的getTrackInfo
和selectTrack
来在运行时选择正确的音频流。 - Dave