Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android


 
Herramientas
  #1  
Viejo 14/04/16, 09:32:08
Avatar de lionheart23
lionheart23 lionheart23 no está en línea
Usuario poco activo
Mensajes: 14
 
Fecha de registro: abr 2016
Mensajes: 14
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
Controlar video

Hola a todos, vengo con otra duda.

Me gustaría saber si se puede seleccionar un fragmento de vídeo para que se reproduzca, es decir, yo quiero que de un vídeo que tengo reproducir unos 20 segundos en una determinada posición y me gustaría que al darle a un botón se abriera un reproductor que iniciara el vídeo donde empezaran esos 20 segundos y que al pasar los 20 segundos se parase y volviese a la pantalla anterior.

Se como reproducir un vídeo y también creo saber como hacer que empiece desde el momento que yo quiero pero no se como hacer que se pare en un sitio concreto que no sea el final de vídeo.

Espero respuestas.
Responder Con Cita


  #2  
Viejo 14/04/16, 09:39:49
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Supongo que usas el MediaPlayer, ¿no? Con el método seek lo pones para que empiece a los 20 segundos, que es lo que harás seguramente. Luego tienes que ir comprobando (cada segundo por ejemplo) el getCurrentPosition() del media player que te dice por dónde va. Si ha llegado donde quieres lo paras o haces lo que necesites.

P.D: La comprobación periódica la puedes hacer con un Runnable que haga la comprobación y si no se cumple se programe para otra ejecución dentro de un segundo. Para evitar andar con hilos innecesariamente, puedes hacerlo con un Handler o con el método postDelayed de la vista que tengas a mano.

Última edición por mocelet Día 14/04/16 a las 09:44:45
Responder Con Cita
  #3  
Viejo 14/04/16, 10:12:01
Avatar de lionheart23
lionheart23 lionheart23 no está en línea
Usuario poco activo
Mensajes: 14
 
Fecha de registro: abr 2016
Mensajes: 14
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por mocelet Ver Mensaje
Supongo que usas el MediaPlayer, ¿no? Con el método seek lo pones para que empiece a los 20 segundos, que es lo que harás seguramente. Luego tienes que ir comprobando (cada segundo por ejemplo) el getCurrentPosition() del media player que te dice por dónde va. Si ha llegado donde quieres lo paras o haces lo que necesites.

P.D: La comprobación periódica la puedes hacer con un Runnable que haga la comprobación y si no se cumple se programe para otra ejecución dentro de un segundo. Para evitar andar con hilos innecesariamente, puedes hacerlo con un Handler o con el método postDelayed de la vista que tengas a mano.
El codigo que tengo es el siguiente:

Código:
public class ReproducirVideo extends Activity {

  @override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_reproducir_video);

		VideoView videoView = (VideoView) findViewById(R.id.videoView1);

		Uri path = Uri.parse(Controlador.getInstance().getActual().getURL());
		
		MediaController mc = new MediaController(this);    
		videoView.setMediaController(mc);

		videoView.setVideoURI(path);
		
		videoView.start();

	}

  @override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.reproducir_video, menu);
		return true;
	}

  @override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}
Y no tengo muy claro como hacer lo que me dices, podrias darme un ejemplo con codigo?

pd: En el emulador al reproducir un video solo escucho el sonido y no se ve el video, sabeis por que puede ser?

Última edición por lionheart23 Día 14/04/16 a las 10:15:01
Responder Con Cita
  #4  
Viejo 14/04/16, 10:27:49
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
Te doy las pautas, no esperes copiarlo y que funcione, es solo un esqueleto escrito al vuelo.

Siendo un VideoView, para que empiece en los 20 segundos por ejemplo tienes que llamar al videoView.seekTo(20000). Aunque supongo que te dará error si llamas al método antes de que el vídeo esté preparado para la reproducción (ahí tendrás que usar el OnPreparedListener del videoView)

Para la comprobación, algo así:

[PHP]
boolean cancelFlag = false;
final Runnable r = new Runnable(){
public void run(){
if (cancelFlag){
// Por si quieres cancelar la comprobación periódica
return;
}
if (videoView.getCurrentPosition() > 40000){
// Ya hemos llegado al segundo 40 (20 de inicio y 20 de duración que querías)
videoView.stopPlayback();
}else{
// Todavía no, programar siguiente comprobación en un segundo
videoView.postDelayed(this, 1000);
}
}
}
[/PHP]

En algún momento después de iniciar la reproducción del vídeo llamas a esto para iniciar las comprobaciones periódicas: videoView.post(r);
Responder Con Cita
Gracias de parte de:
  #5  
Viejo 14/04/16, 10:31:47
Avatar de lionheart23
lionheart23 lionheart23 no está en línea
Usuario poco activo
Mensajes: 14
 
Fecha de registro: abr 2016
Mensajes: 14
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por mocelet Ver Mensaje
Te doy las pautas, no esperes copiarlo y que funcione, es solo un esqueleto escrito al vuelo.

Siendo un VideoView, para que empiece en los 20 segundos por ejemplo tienes que llamar al videoView.seekTo(20000). Aunque supongo que te dará error si llamas al método antes de que el vídeo esté preparado para la reproducción (ahí tendrás que usar el OnPreparedListener del videoView)

Para la comprobación, algo así:

[PHP]
boolean cancelFlag = false;
final Runnable r = new Runnable(){
public void run(){
if (cancelFlag){
// Por si quieres cancelar la comprobación periódica
return;
}
if (videoView.getCurrentPosition() > 40000){
// Ya hemos llegado al segundo 40 (20 de inicio y 20 de duración que querías)
videoView.stopPlayback();
}else{
// Todavía no, programar siguiente comprobación en un segundo
videoView.postDelayed(this, 1000);
}
}
}
[/PHP]

En algún momento después de iniciar la reproducción del vídeo llamas a esto para iniciar las comprobaciones periódicas: videoView.post(r);
Gracias, tengo otro problema con el codigo de arriba el video se escucha pero no se ve en el emulador de android de eclipse, tienes idea de por que podria ser?
Responder Con Cita
  #6  
Viejo 14/04/16, 11:46:28
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
No uses el emulador para temas de vídeo porque no está preparado para ello, igual los que vienen con Android Studio 2.0 sí, pero vamos, eso mejor probarlo en un dispositivo fisico que tiene los códecs, hardware, etc.
Responder Con Cita
  #7  
Viejo 14/04/16, 12:07:51
Avatar de lionheart23
lionheart23 lionheart23 no está en línea
Usuario poco activo
Mensajes: 14
 
Fecha de registro: abr 2016
Mensajes: 14
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por mocelet Ver Mensaje
No uses el emulador para temas de vídeo porque no está preparado para ello, igual los que vienen con Android Studio 2.0 sí, pero vamos, eso mejor probarlo en un dispositivo fisico que tiene los códecs, hardware, etc.
OK.

Me pusiste que debía ponerlo después de iniciarlo pero al ponerlo tanto después del start como antes no funciona, es decir, el vídeo si empieza en el segundo 20 pero en el 40 no termina.

Dejo el código por si es que estoy cometiendo algun error tonto:

Código:
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_reproducir_video);

		final VideoView videoView = (VideoView) findViewById(R.id.videoView1);

		Uri path = Uri.parse(Controlador.getInstance().getActual().getURL());
		
		MediaController mc = new MediaController(this);    
		videoView.setMediaController(mc);

		videoView.setVideoURI(path);
		videoView.seekTo(24000);
                videoView.start();

		 Log.d("VideoView", "Previa reproduccion");
		Runnable r = new Runnable(){ 
			   public void run(){ 
			     if (videoView.getCurrentPosition() > 40000){ 
			         // Ya hemos llegado al segundo 40 (20 de inicio y 20 de duración que querías) 
			    	 Log.d("VideoView", "Legamos al seg 40");
			        videoView.stopPlayback(); 
			      }else{ 
			        // Todavía no, programar siguiente comprobación en un segundo 
			    	  Log.d("VideoView", "Estamos en antes del 40");
			        videoView.postDelayed(this, 1000); 
			      } 
			  }
			};
			
		videoView.post(r);
		
		

	}
Responder Con Cita
  #8  
Viejo 14/04/16, 12:38:51
Avatar de mocelet
mocelet mocelet no está en línea
Desarrollador
Mensajes: 2,203
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,203
Tu operador: -
Mencionado: 17 comentarios
Tagged: 2 hilos
¿El runnable se llega a ejecutar? Debería salirte alguna de esas trazas que has puesto

Si no igual es mejor hacerlo con un Handler, que es casi igual, sólo que tienes que crear un Handler handler = new Handler () y hacer los post al handler en vez de al videoView (tanto el delayed como el post inicial para que arranque)
Responder Con Cita
  #9  
Viejo 14/04/16, 13:04:41
Avatar de lionheart23
lionheart23 lionheart23 no está en línea
Usuario poco activo
Mensajes: 14
 
Fecha de registro: abr 2016
Mensajes: 14
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
No se ejecuta por que no sale ningún log, probare con eso que dices.

Existe alguna manera de poder cortar el vídeo y hacer trozos es decir, crear un nuevo vídeo que sea un trozo del original(lo k viene siendo que de un vídeo poder crear otro mas pequeño k se pueda manejar) directamente desde el código?
Responder Con Cita
  #10  
Viejo 14/04/16, 13:10:26
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
Cita:
Originalmente Escrito por lionheart23 Ver Mensaje
No se ejecuta por que no sale ningún log, probare con eso que dices.

Existe alguna manera de poder cortar el vídeo y hacer trozos es decir, crear un nuevo vídeo que sea un trozo del original(lo k viene siendo que de un vídeo poder crear otro mas pequeño k se pueda manejar) directamente desde el código?
Si, pero necesitas usar una librería de recompresión de vídeos, que:

1) Son lentas, va a tardar en comprimirlo mucho más que en reproducirlo.

2) La mayoría requieren NDK, o en el mejor de los casos, depender de código NDK. Por lo tanto es posible que en algunos dispositivos no funcione, sobre todo los Intel.

3) Suelen pesar un huevo, puede incrementar en tamaño de tu app en 10 MB o más.

No estoy muy al día de las librerías actualmente, lo que te he dicho es de hace un par de años, lo mismo ahora hay algunas que con el punto 2 y 3 no sean tan salvajes. El punto 1 no te lo va a quitar nadie.
Responder Con Cita
  #11  
Viejo 14/04/16, 13:36:12
Avatar de lionheart23
lionheart23 lionheart23 no está en línea
Usuario poco activo
Mensajes: 14
 
Fecha de registro: abr 2016
Mensajes: 14
Tu operador: Movistar
Mencionado: 0 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por kriogeN Ver Mensaje
Si, pero necesitas usar una librería de recompresión de vídeos, que:

1) Son lentas, va a tardar en comprimirlo mucho más que en reproducirlo.

2) La mayoría requieren NDK, o en el mejor de los casos, depender de código NDK. Por lo tanto es posible que en algunos dispositivos no funcione, sobre todo los Intel.

3) Suelen pesar un huevo, puede incrementar en tamaño de tu app en 10 MB o más.

No estoy muy al día de las librerías actualmente, lo que te he dicho es de hace un par de años, lo mismo ahora hay algunas que con el punto 2 y 3 no sean tan salvajes. El punto 1 no te lo va a quitar nadie.
Sabrias el nombre de alguna de esas librerias para ir viendo como funcionan.
Responder Con Cita
Respuesta

Estás aquí
Regresar   HTCMania > Todo sobre Android > Programación y Desarrollo para Android


Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 14:39:02 (GMT +1)

Cookies settings
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007