在Android中同时播放音频和视频

时间:2013-11-22 12:15:36

标签: android audio video android-mediaplayer

您好我正在尝试同时播放两个不同的文件。

我试图找到玩家并尝试扩展默认播放器达到相同但却无法获得成功。所以,请让我知道什么是同时播放音频文件和视频的最佳方式,请帮助我?

我采用单独文件的原因是为了节省空间,因为应用程序将被本地化,每种语言都有多个音频文件,而不是多个视频节省空间。这很重要,因为Android不允许下载超过50MB的应用程序大小。

任何帮助都会非常有帮助。为我提供代码将是很有帮助的。

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以使用Audio Focus进行处理。两个或多个Android应用程序可以同时将音频播放到同一输出流。系统将所有内容混合在一起。尽管这在技术上给人留下深刻的印象,但对用户而言可能会非常严重。为了避免每个音乐应用程序同时播放,Android引入了音频聚焦的概念。一次只有一个应用程序可以保持音频焦点。

当您的应用需要输出音频时,它应该请求音频焦点。具有焦点时,可以播放声音。但是,获得音频焦点后,您可能无法继续播放直到完成播放。另一个应用程序可以请求焦点,这会抢占音频焦点。如果发生这种情况,您的应用应暂停播放或降低其音量,以使用户更轻松地听到新的音频源。

从Android 8.0(API级别26)开始,调用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;
        }
    }
}

希望这会有所帮助!您也可以查看Android的官方文档。如果这样做没有帮助,则可以check这个站点和这个site以获得更多文档。

答案 1 :(得分:0)

播放音频:Audio Track reference 播放视频:Media Player reference

现在你可以通过在Video View显示你想要的视频来开始主线程,什么时候播放声音你开始播放音轨。棘手的部分是将音频与视频同步