Silenciar un video en un VideoView
Estoy reproduciendo un video (desde youtube) usando un VideoView, así:
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()
Me gustaría poder silenciar el video, pero hasta ahora lo único que encontré es:
- ¿Puede Android MediaCodec decodificar video stream h264?
- Una biblioteca para compresión / descompresión de vídeo sin pérdidas / bajo nivel de plataforma cruzada (C ++ / Android)
- Video streaming en android por parcelFileDescriptor
- Adición de VideoView a un diseño XML
- Android Dev - 3rd Party Media Player SDK u otras opciones?
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); audioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);
Lo que funciona bien en que el video está silenciado, pero el problema es que toda la música transmitida está silenciada, y si hay otro video (o audio) que quiero reproducir, también se silencia.
¿Hay alguna forma de limitar el flujo específico a ser silenciado?
Gracias.
- Android: Reproductor de video como la aplicación de Dailymotion
- Android Video Streaming - ¿Dispositivo compatible?
- android VideoView aumentar el almacenamiento en búfer
- Transmisión de vídeo de cámara Android
- Múltiples archivos de vídeo que se reproducen simultáneamente en Android
- Tipo de video mime de Android HLS
- Alternativas de comunicación en tiempo real nativas a WebRTC
- Defragment H264 NAL corriente (originalmente 1722 avb paquetes)
Después de cavar en todas las fuentes posibles de información que logré encontrar, me ocurrió la siguiente solución y pensé que podría beneficiar a otros en el futuro:
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); } }
Parece funcionar bien para mí, actuando como un VideoView con mute / unmute funcionalidad.
Es posible hacer que el método setVolume sea público para que el volumen pueda ser controlado fuera del ámbito de la clase, pero solo necesito silenciar / unmute para que se exponga.
Tengo un método más simple, haciendo esto tendrás un botón mute / unmute (esto se puede utilizar para el audio y los videos);
//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++; } } });
}
- Android: ¿cómo obtener una lista drectory ordenada por nombre o por fecha descendente?
- @IntDef anotación y devolver valor de otro código que no se puede anotar o cómo desactivar temporalmente la anotación de afectar el código?