【问题标题】:Muting a video in a VideoView在 VideoView 中静音视频
【发布时间】:2012-11-15 09:46:25
【问题描述】:

我正在使用 VideoView 播放视频(来自 youtube),如下所示:

VideoView video = (ViewView) this.findViewById(R.id.youtube_video);
MediaController controllers = new MediaController(this);
controllers.setAnchorView(video);
video.setMediaController(controllers);

video.setVideoURI(videoUri);
video.start()

我希望能够将视频静音,但到目前为止我发现的唯一内容是:

AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
audioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);

这很好,因为视频被静音了,但问题是所有流媒体音乐都被静音了,如果我想播放另一个视频(或音频),它也会被静音。

有没有办法只针对要静音的特定流?
谢谢。

【问题讨论】:

  • 啊,是的,但这表明使用 MediaPlayer 而不是 VideoView,如果可能的话,我想避免这种情况。
  • 目前除了使用 MediaPlayer 或 AudioManager 我认为这是不可能的,VideoView 不提供任何静音选项,这有点奇怪。所以这是您的两个选择,或者您可以尝试创建自定义 VideoView 并添加静音功能!
  • 我设法想出了一个适合我的解决方案,我将其发布为答案。谢谢。

标签: java android video-streaming audio-streaming


【解决方案1】:

在挖掘了我设法找到的所有可能的信息来源后,我想出了以下解决方案,并认为它可能会在未来造福其他人:

public class Player extends VideoView implements OnPreparedListener, OnCompletionListener, OnErrorListener {
    private MediaPlayer mediaPlayer;

    public Player(Context context, AttributeSet attributes) {
        super(context, attributes);

        this.setOnPreparedListener(this);
        this.setOnCompletionListener(this);
        this.setOnErrorListener(this);
    }

    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        this.mediaPlayer = mediaPlayer;
    }

    @Override
    public boolean onError(MediaPlayer mediaPlayer, int what, int extra) { ... }

    @Override
    public void onCompletion(MediaPlayer mediaPlayer) { ... }

    public void mute() {
        this.setVolume(0);
    }

    public void unmute() {
        this.setVolume(100);
    }

    private void setVolume(int amount) {
        final int max = 100;
        final double numerator = max - amount > 0 ? Math.log(max - amount) : 0;
        final float volume = (float) (1 - (numerator / Math.log(max)));

        this.mediaPlayer.setVolume(volume, volume);
    }
}

它似乎对我很有效,就像具有静音/取消静音功能的 VideoView
可以将 setVolume 方法设为 public,以便在类范围之外控制音量,但我只需要公开静音/取消静音。

【讨论】:

  • 嗨,几年后才遇到这个问题。你是如何在你的 XML 布局中使用这个类的?
  • 为我工作。节省我很多时间
  • @Ryan:只需通过其命名空间和派生类的名称来解决它:
【解决方案2】:

将此代码放入 oncreate() 和 onresume() 以更好地处理视频视图...

  VideoView videoview = (VideoView) findViewById(R.id.videoview);
  videoview.setVideoPath(videopath);
  videoview.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mp.setVolume(0f, 0f);
                        mp.setLooping(true);
                    }
                });
 videoview.start();

【讨论】:

    【解决方案3】:

    如果你是在 kotlin 中编码,就使用这行代码

    videoView.setOnPreparedListener { video->
                video.setVolume(0f,0f)
            }
    

    【讨论】:

      【解决方案4】:

      我有一个更简单的方法,这样做你会有一个静音/取消静音按钮(这可以用于音频和视频);

      //set global variable
      //private Button mMuteButton;
      //private static int aux = 0;
      //private AudioManager mAudioManager;
      //set the Mute button on clickListener 
      
        mMuteButton.setOnClickListener(new OnClickListener() {
      
              @Override
              public void onClick(View v) {
                  mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
      
                  if(aux % 2 == 0){
      
                      mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 100, 0);
                      aux++;
      
      
                  } else {
      
                      mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
                      aux++;
      
                  }
      
      
              }
          });
      

      }

      【讨论】:

      • 这不是正确的解决方案。这将使用 STREAM_MUSIC 静音所有内容,而不仅仅是视频。如果您的活动只播放视频,这可能没问题,但我认为 Nitzan 想避免它会产生副作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多