【问题标题】:How to prevent VideoView/MediaPlayer from stopping other apps' audio?如何防止 VideoView/MediaPlayer 停止其他应用的音频?
【发布时间】:2015-03-26 13:50:02
【问题描述】:

在一个屏幕中,我有一个循环的背景视频(显示正常的 UI 元素),使用 VideoView 实现,如下所示:

String resPath = "android.resource://" + getPackageName() + "/" + R.raw.bg_video;
videoView.setVideoURI(Uri.parse(resPath));

// Hide controls:
MediaController controller = new MediaController(getActivity());
controller.setVisibility(View.GONE);
videoView.setMediaController(controller);

// Use looping:
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});

videoView.start();

视频效果很好。唯一的问题是,当显示此视图时(或者甚至在使用 ViewPager 之前),其他应用程序的音乐播放停止

我正在使用的视频本身没有声音。有没有办法将 VideoView 或它使用的 MediaPlayer 设置为“静音模式”?即,告诉它根本不要播放音频,尤其是不要弄乱其他应用的音频

onPrepared() 中尝试过mp.setVolume(0, 0);,但没有效果。

【问题讨论】:

  • 我没有尝试过,但我相信您的答案将涉及通过AudioManager 并使用流的静音/独奏设置。因为它是您想要继续播放的来自其他应用程序的音乐,所以您需要在调用 prepare() 之前将您的 MediaPlayer 的音频流设置为不同的值。
  • @ab.helly:是的,有时间我会发布答案。
  • @Jonik,你能发布答案吗?
  • @Ana:实际上我最终的结果与Łukasz posted 基本相同。感觉很丑,从 Android 源复制粘贴 VideoView 并注释掉 requestAudioFocus 调用。

标签: android audio android-mediaplayer android-videoview


【解决方案1】:

从 Android 源复制粘贴 VideoView 并注释掉这些行:

AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

例如,您可以将新类命名为 MutedVideoView

这里的要点:https://gist.github.com/vishna/7e9d3466bced8502fcdd

【讨论】:

  • 如何编译复制的 VideoView 类。它抱怨“无法解析符号”:import android.media.Metadata;导入 android.media.SubtitleController;导入 android.media.SubtitleTrack.RenderingWidget;导入android.media.TtmlRenderer;导入 android.media.WebVttRenderer;
  • 我使用的解决方案(早在 2015 年)与此基本相同。 “丑陋但有效。”在从 Android 源代码复制粘贴的 VideoView 中,我还不得不注释掉一些由于某种原因未编译的字幕和元数据相关代码。
  • 有没有办法通过反射来完成这个?
【解决方案2】:

公认的解决方案不能保证所有 Android 版本的兼容性,而且是一个肮脏的 hack,而不是真正的解决方案。我已经尝试了各种形式的 hack 来使其正常工作,但没有一个能让我满意。

不过,我想出了一个更好的解决方案 - 从 VideoView 切换到 TextureView 并使用 MediaPlayer 加载它。从用户的角度来看没有区别,只是没有更多的音频停止。

这是我播放 MP4 循环的用例:

private TextureView _introVideoTextureView;
private MediaPlayer _introMediaPlayer;

...

@Override
public void onCreate(...) {
    _introVideoTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
           try {
               destoryIntroVideo();

               _introMediaPlayer = MediaPlayer.create(SignInActivity.this, R.raw.intro_video);
               _introMediaPlayer.setSurface(new Surface(surfaceTexture));
               _introMediaPlayer.setLooping(true);
               _introMediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
               _introMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mediaPlayer) {
                        mediaPlayer.start();
                    }
                });

            } catch (Exception e) {
                System.err.println("Error playing intro video: " + e.getMessage());
            }
        }

        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) {}

        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
            return false;
        }

        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {}
    });
}

@Override
public void onDestroy() {
    super.onDestroy();

    destoryIntroVideo();
}

private void destoryIntroVideo() {
    if (_introMediaPlayer != null) {
        _introMediaPlayer.stop();
        _introMediaPlayer.release();
        _introMediaPlayer = null;
    }
}

【讨论】:

    【解决方案3】:

    这对我有用:

    videoView.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE);
    

    (在.setVideUri() 通话之前)

    【讨论】:

    • 这在 api 级别 26 及以上可用,操作系统低于该级别的设备怎么样
    • 你有没有找到其他 API 级别低于 26 的答案?
    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多