Lire une vidéo dans VideoView dans Android

Je n’arrive pas à comprendre pourquoi je ne peux pas lire la vidéo dans mon VideoView. Tout ce que je reçois pour un message est:

Impossible de lire la vidéo: Désolé, cette vidéo ne peut pas être lue.

J’ai également créé une carte SD pour mon émulateur. Dois-je placer ma carte SD dans un dossier particulier de mon SDK? Commentez s’il vous plaît.

Voici la mise en page:

    

Voici le code:

 package com.examples.videoviewdemo; import android.app.Activity; import android.os.Bundle; import android.widget.MediaController; import android.widget.VideoView; public class VideoViewDemo extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); VideoView videoView = (VideoView)findViewById(R.id.VideoView); //MediaController mediaController = new MediaController(this); // mediaController.setAnchorView(videoView); //videoView.setMediaController(mediaController); videoView.setVideoPath("/sdcard/blonde_secretary.3gp"); videoView.start(); } } 

En attente de la réponse …

Je suppose que votre vidéo est incompatible avec Android. Essayez-le avec une vidéo différente. Celui-ci fonctionne définitivement pour travailler avec Android (mais pas pour les nouveaux appareils, pour une raison quelconque). Si cette vidéo fonctionne et que votre vidéo ne fonctionne pas, votre vidéo n’est pas compatible avec Android.

Comme d’autres l’ont indiqué, veuillez tester ceci sur un appareil. La lecture vidéo sur l’émulateur nécessite trop de puissance.

Exemple de projet

J’ai finalement fait fonctionner un projet de validation de principe, alors je le partagerai ici.

Configurer la mise en page

La disposition est configurée comme ceci, où la zone gris clair est la VideoView .

entrer la description de l'image ici

activity_main.xml

      

Préparer un clip vidéo

Selon la documentation , Android devrait prendre en charge la lecture mp4 H.264 (décodage) pour tous les niveaux d’API. Cependant, il semble y avoir beaucoup de facteurs qui affectent la lecture ou non d’une vidéo. La réponse la plus détaillée que j’ai pu trouver sur l’encodage des vidéos est ici . Il utilise le puissant outil de ligne de commande ffmpeg pour effectuer la conversion vers quelque chose qui devrait être lisible sur tous les appareils Android (espérons-le?). Lisez la réponse à laquelle j’ai lié pour plus d’explications. J’ai utilisé une version légèrement modifiée car je recevais des erreurs avec la version originale.

 ffmpeg -y -i input_file.avi -s 432x320 -b:v 384k -vcodec libx264 -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8 -subq 6 -trellis 0 -refs 5 -bf 0 -coder 0 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -c:a aac -ac 1 -ar 16000 -r 13 -ab 32000 -aspect 3:2 -ssortingct -2 output_file.mp4 

Je voudrais certainement lire beaucoup plus sur chacun de ces parameters pour voir lesquels doivent être ajustés en fonction de la qualité vidéo et audio.

Ensuite, renommez output_file.mp4 en test.mp4 et placez-le dans /res/raw dossier /res/raw votre projet Android. Créez le dossier s’il n’existe pas déjà.

Code

Il n’y a pas grand chose au code. La vidéo est lue lorsque le bouton “Lecture” est cliqué. Merci à cette réponse pour l’aide.

MainActivity.java

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onButtonClick(View v) { VideoView videoview = (VideoView) findViewById(R.id.videoview); Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.test); videoview.setVideoURI(uri); videoview.start(); } } 

Fini

C’est tout. Vous devriez pouvoir jouer votre clip vidéo sur le simulateur ou un appareil réel maintenant.

Ajouter android.permission.READ_EXTERNAL_STORAGE dans manifest, travaillé pour moi

Faites de videoView une variable membre de votre classe d’activité au lieu de la garder locale pour la fonction onCreate :

 VideoView videoView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); videoView = (VideoView)findViewById(R.id.VideoView); videoView.setVideoPath("/sdcard/blonde_secretary.3gp"); videoView.start(); } 

Le code semble être parfait! Simple et simple.
Donc, ça devrait marcher au téléphone. L’émulateur a du mal à lire des vidéos, cela m’est également arrivé.

Essayez d’augmenter le niveau d’API requirejs au plus tard, cela pourrait aider!

Faites un clic droit sur le projet ouvert, choisissez Propriétés> Android> vérifiez la dernière version à droite …

Igor

Vous pouvez accéder à votre carte SD via le DDMS

Pour confirmer que votre vidéo est dans le bon format (résolution, bitrate, codec, etc.) vérifiez avec la documentation officielle – extrait ci-dessous:

Définition standard (basse qualité)
Codec vidéo – H.264
Résolution vidéo – 176 x 144 px
Fréquence vidéo – 12 images par seconde
Débit vidéo – 56 Kbps
Codec audio – AAC-LC
Canaux audio – (mono)
Débit binary audio – 24 Kbps

Définition standard (haute qualité)
Codec vidéo – H.264
Résolution vidéo – 480 x 360 px
Fréquence vidéo – 30 images par seconde
Débit vidéo – 500 Kbps
Codec audio – AAC-LC
Canaux audio – 2 (stéréo)
Débit binary audio – 128 Kbps

Haute définition 720p (N / A sur tous les appareils)
Codec vidéo – H.264
Résolution vidéo – 1280 x 720 px
Fréquence vidéo – 30 images par seconde
Débit vidéo – 2 Mbps
Codec audio – AAC-LC
Canaux audio – 2 (stéréo)
Débit binary audio – 192 Kbps

 VideoView videoView =(VideoView) findViewById(R.id.videoViewId); Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getAbsolutePath()+"/yourvideo"); videoView.setVideoURI(uri); videoView.start(); 

Au lieu d’utiliser setVideoPath, utilisez setVideoUri. Vous pouvez obtenir le chemin de votre vidéo stockée dans le stockage externe en utilisant (Environment.getExternalStorageDirectory (). getAbsolutePath () + “/ yourvideo”) et l’parsingr dans Uri. Si votre vidéo est stockée dans sdcard / MyVideo / video.mp4, remplacez “/ yourvideo” par le code “/MyVideo/video.mp4”

Cela fonctionne bien pour moi 🙂

VideoView ne peut diffuser que des vidéos 3gp. Je recommande ce code pour diffuser votre vidéo ou essayer une version supérieure d’Android. Essayez le streaming vidéo en ligne.

 public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.main); Ssortingng videourl = "http://something.com/blah.mp4"; Uri uri = Uri.parse(videourl); Intent intent = new Intent(Intent.ACTION_VIEW, uri); intent.setDataAndType(uri, "video/mp4"); startActivity(intent); } 

Ou Cliquez ici pour regarder le didacticiel de streaming vidéo Android .

Bien ! Si vous utilisez une vidéo de compatibilité Android, la seule cause de cette alerte est que vous devez utiliser une taille vidéo supérieure à 300 Mo. Android ne prend pas en charge les grosses vidéos (> 300 Mo). Nous pouvons l’obtenir en utilisant l’optimisation NDK.

J’ai presque le même problème avec VideoView. J’essaie de lire une vidéo (1080 * 1080) avec un Nexus 5 et cela fonctionne bien, mais la même vidéo sur Galaxy ace 2 me donne le message Impossible de lire la vidéo.

Mais je remarque qu’avec une définition inférieure de la vidéo (120×120), cela fonctionne bien.

Donc, peut-être juste une question de “taille” (et en particulier avec la vidéo blonde_secretary.3gp ….)

 //just copy this code to your main activity. if ( ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ){ if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE)){ }else { ActivityCompat.requestPermissions(MainActivity.this,new Ssortingng[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},1); } }else { } 

Le problème pourrait être lié au format Movie. Si c’est codé H264, assurez-vous qu’il est dans le profil de base.