2012-01-09 20 views
26

Tengo algunos archivos de video .MP4 que deben leerse en una VideoView en una actividad de Android. Estos videos incluyen varias pistas de audio, cada una de las cuales corresponde a un idioma de usuario (por ejemplo: inglés, francés, japonés ...).
Tengo problemas inesperados para encontrar ayuda o documentación para proporcionar dicha función. Actualmente puedo cargar el video y reproducirlo en una VideoView con un MediaController, pero no para cambiar las pistas de audio.

No estoy seguro de que el SDK de Android proporcione una forma sencilla de hacerlo, lo que me deja bastante desorientado sobre cómo resolver mi problema. Estaba pensando en extraer cada pista de audio, cargar el audio que quiero en un MediaPlayer dependiendo del idioma, luego hacer que el audio y el video se reproduzcan juntos. Pero me temo que podrían surgir algunos problemas de sincronización y evitar que lo haga.

Si tiene alguna pista, algún consejo para ayudarme a comenzar con este problema, es más que bienvenido.Android: múltiples pistas de audio en VideoView?

+0

¿Algún progreso en esto? – runor49

+0

parecía haber avanzado según el comentario de la solución seleccionada. ¿Puedes compartir cómo cumpliste esa tarea? – LostPuppy

+0

Esta es una vieja pregunta, pero hay una solución simple a este problema. Ver mi respuesta –

Respuesta

3

No he probado todavía, pero parece que la biblioteca Vitamio tiene soporte para múltiples pistas de audio (entre otras características interesantes). Es API compatible con la clase VideoView de Android.

Probablemente tendría que usar VitamioVideoView.setAudioTrack() para establecer la pista de audio (por ejemplo, según la configuración regional). Vea Vitamio API docs para más detalles.

+0

Al final hice exactamente lo que sugerí. Separé los datos de audio y video, cargando el audio en el MediaPlayer dependiendo del idioma del usuario, y luego sincronizando ambas transmisiones. Fue una solución bastante sucia, pero aceptable en el tiempo que tuve que hacer el trabajo. No he probado su solución, pero la aceptaré, ya que parece hacer exactamente lo que necesitaba en ese momento. Gracias de todos modos ! – Vahron

-1

La clase VideoView no puede admitir su require.U debe analizar para obtener datos de transmisión de audio (desea) para jugar con la clase AudioTrack en la capa java.

+0

no es cierto. Ver mi respuesta –

3

Ninguna biblioteca 3 ª parte requerida:

mVideoView.setVideoURI(Uri.parse("")); // set video source  

mVideoView.setOnInfoListener(new MediaPlayer.OnInfoListener() { 
    @Override 
    public boolean onInfo(MediaPlayer mp, int what, int extra) { 
     MediaPlayer.TrackInfo[] trackInfoArray = mp.getTrackInfo(); 
     for (int i = 0; i < trackInfoArray.length; i++) { 
      // you can switch out the language comparison logic to whatever works for you 
      if (trackInfoArray[i].getTrackType() == MediaPlayer.TrackInfo.MEDIA_TRACK_TYPE_AUDIO 
       && trackInfoArray[i].getLanguage().equals(Locale.getDefault().getISO3Language()) { 
       mp.selectTrack(i); 
       break; 
      } 
     } 
     return true; 
    } 
}); 

Por lo que yo puedo decir - pistas de audio deben ser codificados en el 3 letras ISO 639-2 con el fin de ser reconocidos correctamente.

+0

me puede indicar cómo codificar esas pistas de audio –

+0

ffmpeg es un buen lugar para comenzar –

+0

escribió que la pista de audio debe estar codificada en la 3 carta iso 639-2. ¿Puedes explicar de qué se trata? –