2010-02-02 9 views
7

J'ai essayé plusieurs exemples différents, mais je ne peux pas afficher de vidéo. J'entends du son mais pas de vidéo. Je pensais peut-être que j'avais juste un format vidéo incorrect donc j'ai téléchargé un fiat commercial au format 3gp et toujours pas de joie. J'utilise l'Eclipse Java EE avec android sdk et mon application cible le 1,5 sdk (Api Level 3) sans google api. Quelqu'un pourrait-il s'il vous plaît poster un lien vers une vidéo connue pour jouer dans Android ou signaler mon problème avec le code. Je l'ai essayé tout ce que je pouvais penser .. avec/sans préparer .. différentes mises en page, etc.vidéo android, entendre le son, mais pas de vidéo

Voici mon onCreate l'activité

/** 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(); 
    } 

elle est la mise en page 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

J'ai également eu ce problème en utilisant un VideoView, mais si je demande le focus après le démarrage de la vidéo, cela fonctionne bien. – draksia

Répondre

1

Si vous utilisez l'émulateur, cela peut ne pas fonctionner. L'émulateur ne dispose pas de l'accélération matérielle disponible sur les appareils Android. Par exemple, sur un Core 2 Duo 2,6 GHz, je peux parfois lire une vidéo, mais pas toujours. Sur les machines plus lentes, la lecture vidéo ne fonctionne jamais. Sur un Core 2 Quad de 2,5 GHz, j'ai toujours la lecture vidéo. Cela étant dit, je teste généralement la lecture vidéo sur des appareils réels.

Je suis également incertain si la lecture vidéo fonctionne à partir de ressources brutes. Je vous encourage fortement à essayer d'utiliser une vidéo provenant d'un fichier sur la carte SD en premier. En ce qui concerne les vidéos qui fonctionnent vraiment, je sais que "Documentaires et vous" et "Musique pour nos petits-enfants" de here fonctionnent dans leurs formulaires MP4.

+0

J'utilise un core 2 duo 3.0 ghz. Je ne sais pas pourquoi, mais j'ai trouvé un autre sameple sur ce forum qui a fonctionné en utilisant VideoView. Merci pour la réponse .. Je ne savais pas qu'il est dépendante du processeur voici le lien vers ce qui a fonctionné pour moi http://stackoverflow.com/questions/2167608/android-not-playing-video-mp4 – slytron

+0

Cette réponse est simplement faux. La lecture de la vidéo dans son cas ne fonctionne pas car il n'initialise pas le rappel sur SurfaceHolder ... cela n'a rien à voir avec l'émulateur ou la vitesse de l'ordinateur. Voir la réponse en bas avec le code pour l'initialisation correcte de SurfaceHolder. – kape123

1

Vous pouvez obtenir un exemple complet en regardant l'exemple d'application ApiDemo Android (regardez l'exemple sous la rubrique « Média »): http://developer.android.com/resources/samples/ApiDemos/index.html

Comme pour un film d'échantillon à utiliser avec la démo, j'ai utilisé des liens Le site mobile de YouTube avec succès.

0

J'ai rencontré le même problème. J'ai été capable de le réparer en changeant SurfaceView en VideoView dans le fichier de mise en page XML. Gardez tout le reste du code identique. Cela a fonctionné pour moi, je ne sais pas pourquoi.

17

Votre classe doit implémenter SurfaceHolder.Callback et appeler les méthodes setDisplay, prepare et etc seulement après avoir installé surfaceCreated. Aussi, vous devrez peut-être changer le type de support de surface à SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS. Comme ceci:

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 vous essayez dans OnCreate vous n'a rien comme résultat, parce que la surface n'a pas encore été ...

+0

Je t'aime tellement. Tu me sauves la vie! J'ai ajouté un peu d'édition à votre réponse – Aracem

+1

Merci beaucoup pour 'SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS'! Incroyable! Félicitations pour votre badge d'or - c'est très bien mérité! –

+0

D'après le document officiel: Cette constante était obsolète au niveau de l'API 11. Elle est ignorée, cette valeur est définie automatiquement en cas de besoin. –

0

C'est un vieux problème, mais ma réponse peut aider quelqu'un.

Pour soutenir les anciennes versions d'Android, vous devez ajouter cette ligne:

videoHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
0

Que ce soit un fichier vidéo donné va jouer dans un joueur donné dépend de trois choses:

  • Le format de conteneur vidéo (Type de fichier).
  • Codec le codage des flux vidéo (et potentiellement audio); Le support de votre lecteur pour cette combinaison de format de conteneur et de codec
  • Le codec et le lecteur/périphérique pris en charge sont presque certainement la cause des résultats incohérents que vous avez vus. (Un codec, si vous ne saviez pas, est essentiellement une formule mathématique reproductible qui indique au système comment transformer bits et octets compressé en un fichier en images animées (et à nouveau, pour cette matière))