2010-02-02 20 views
7

He intentado varios ejemplos diferentes pero no puedo ver ningún video para mostrar. Escucho sonido pero no video Pensé que tal vez solo tenía un formato de video incorrecto, así que descargué un comercial de fiat en formato 3gp y todavía no me gustó. Estoy utilizando el Eclipse Java EE con sdk de Android y mi aplicación se dirige a 1.5 sdk (Nivel 3 de Api) sin la API de Google. ¿Podría alguien publicar un enlace a un video conocido en Android o señalar mi problema con el código? He intentado todo lo que podía pensar .. con/sin preparar .. diseños diferentes, etc.video android, escuchar sonido pero no video

Aquí está mi onCreate en la actividad

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

this.setContentView(R.layout.video_test); 
    SurfaceView v = (SurfaceView) findViewById(R.id.surface_video); 
    SurfaceHolder holder = v.getHolder(); 
// Set the transparency 
    //getWindow().setFormat(PixelFormat.UNKNOWN); 


    // Set a size for the video screen 
    //holder.addCallback(this); 
    holder.setFixedSize(400,300); 


    MediaPlayer mp = MediaPlayer.create(this, R.raw.fiat); 
    mp.setDisplay(holder); 
    //mp.setAudioStreamType(2); 
    try { 
     //mp.prepare(); 
     mp.start(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

ella es la disposición en video_test.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<SurfaceView android:id="@+id/surface_video" 
android:layout_width="250px" 
android:layout_height="250px"> 
</SurfaceView> 
<LinearLayout 
android:orientation="horizontal" 
android:layout_height="wrap_content" 
android:layout_width="fill_parent" 
android:padding="10dip" 
> 
</LinearLayout> 
</LinearLayout> 

> Blockquote

+0

Tuve este problema también con un VideoView, pero si solicito el foco después de que comience el video, entonces funciona bien. – draksia

Respuesta

1

Si está utilizando el emulador, es posible que no funcione. El emulador no tiene la aceleración de hardware disponible en los dispositivos Android. Por ejemplo, en un Core 2 Duo de 2.6 GHz, a veces puedo obtener un video para reproducir, pero no siempre. En máquinas más lentas, la reproducción de video nunca funciona. En un Core 2 Quad de 2,5 GHz, siempre obtengo reproducción de video. Dicho esto, generalmente pruebo la reproducción de video en dispositivos reales.

Tampoco estoy seguro si la reproducción de video funciona desde recursos sin procesar. Le recomiendo encarecidamente que intente primero usar un video de un archivo en la tarjeta SD.

Con respecto a los videos que definitivamente funcionan, sé que "Documentaries and You" y "Music for our Grandchildren" del here funcionan en sus formularios MP4.

+0

Estoy usando un core 2 duo 3.0 ghz. No estoy seguro de por qué, pero encontré otro sameple en este foro que funcionó usando VideoView. Gracias por la respuesta .. No sabía que es dependiente de la CPU aquí está el enlace a lo que funcionó para mí http://stackoverflow.com/questions/2167608/android-not-playing-video-mp4 – slytron

+0

Esta respuesta es simplemente falso. La reproducción de video en su caso no funciona, ya que no está inicializando la devolución de llamada en SurfaceHolder ... no tiene nada que ver con la velocidad del emulador o la computadora. Consulte la respuesta en la parte inferior con el código para la inicialización adecuada de SurfaceHolder. – kape123

0

Me encontré con el mismo problema. Pude solucionarlo cambiando SurfaceView a VideoView en el archivo de diseño XML. Mantenga todo el resto del código igual. Eso funcionó para mí, no sé por qué.

17

Tu clase debe implementar SurfaceHolder.Callback y llamar a los métodos setDisplay, preparar y etc. solo después de entrar en surfaceCreated. También es posible que necesite cambiar el tipo de soporte de superficie a SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS. De esta manera:

import android.view.SurfaceHolder.Callback; 

public class TestActivity extends Activity implements Callback { 

// ... 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // ... 
     mSurfaceView = (SurfaceView)findViewById(R.id.yousurfaceview); 
     holder = mSurfaceView.getHolder(); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     mp.setDisplay(holder); 
     mp.setDataSource(somesource); 
     mp.prepare(); 
     mp.start(); 
     // etc... 
    } catch (IOException e) { 
     } catch (IllegalArgumentException e) { 
     } catch (IllegalStateException e) { 
    } 

} 

// ... 
} 

Si lo intenta en OnCreate que no tiene nada como resultado de ello, porque de superficie no ha sido creada ...

+0

Te quiero mucho. ¡Salvas mi vida! Agregué un poco de edición a su respuesta – Aracem

+1

¡Muchas gracias por 'SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS'! ¡Increíble! Felicitaciones por su insignia dorada, ¡está muy bien merecida! –

+0

Desde el documento oficial: esta constante se desaprobó en API nivel 11. esto se ignora, este valor se establece automáticamente cuando sea necesario. –

0

Este es un viejo problema, pero mi respuesta puede ayudar a alguien.

Apoyar las versiones antiguas de Android es necesario agregar esta línea:

videoHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
0

hecho de que un determinado archivo de vídeo se reproducirá en un reproductor determinado depende de tres factores: formato contenedor

  • El vídeo (Tipo de archivo).
  • El códec del video (y potencialmente audio) transmite la codificación; compatibilidad de su reproductor para esa combinación de formato de contenedor y códec
  • El códec y el reproductor/dispositivo que lo admiten es casi seguramente la causa de los resultados inconsistentes que ha visto. (Un codec, si no lo sabía, es básicamente una fórmula matemática repetible que le dice al sistema cómo convertir los bits y bytes empaquetados en un archivo en imágenes en movimiento (y viceversa, para el caso))