Android: MediaPlayer vide ou sans vis à vis de la vidéo

Je peux lire les vidéos en arrière en implémentant OnCompletionListener pour configurer la source de données dans un fichier différent. Aucun problème là-bas. J'appelle reset () et prepare () très bien.

Ce que je n'ai pas pu comprendre, c'est comment se débarrasser du scintillement de l'écran de 1-2 secondes entre le changement de source de données et le démarrage de la nouvelle vidéo. L'écart montre un écran noir, et je n'ai trouvé aucun moyen de contourner ce problème.

  • Android TextView: définir la couleur d'arrière-plan de manière dynamique ne fonctionne pas
  • Cette mise en œuvre de la politique Google LVL serait-elle raisonnablement sécurisée?
  • Les chevauchements de texte RelativeLayout se chevauchent
  • Comment puis-je utiliser Android aaptOptions?
  • Mise à jour de Android Studio 2.3: Avertissement: Utilisation de plugins incompatibles pour le traitement de l'annotation: android-apt. Cela peut entraîner un comportement inattendu
  • Android Studio ne présente pas les modules dans la structure du projet
  • J'ai essayé de définir l'arrière-plan de la vue parent à une image, mais elle parvient à contourner cela. Même si SurfaceView est transparent (ce qui est par défaut). J'ai également essayé d'avoir les multiples fichiers vidéo joués en même temps et de changer l'affichage du mediaplayer quand on finit et l'autre devrait commencer.

    La dernière chose que j'ai essayée, c'est d'avoir une deuxième vue en arrière-plan que je montre temporairement pendant que la vidéo est "préparée" et la supprime lorsque la vidéo est prête à démarrer. Cela n'a pas été très transparent.

    Existe-t-il un moyen de se débarrasser de cet écart? L'exécution d'une vidéo dans une boucle fonctionne merveilleusement et fait exactement ce que je veux, sauf qu'il regarde la même vidéo au lieu de jouer à une autre que je choisis.

    Main.xml

    <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:background="@drawable/background" android:layout_height="fill_parent"> <SurfaceView android:id="@+id/surface" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center"> </SurfaceView> </FrameLayout> 

    Player.java

     public class Player extends Activity implements OnCompletionListener, MediaPlayer.OnPreparedListener, SurfaceHolder.Callback { private MediaPlayer player; private SurfaceView surface; private SurfaceHolder holder; public void onCreate(Bundle b) { super.onCreate(b); setContentView(R.layout.main); surface = (SurfaceView)findViewById(R.id.surface); holder = surface.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void onCompletion(MediaPlayer arg0) { File clip = new File(Environment.getExternalStorageDirectory(),"file2.mp4"); playVideo(clip.getAbsolutePath()); } public void onPrepared(MediaPlayer mediaplayer) { holder.setFixedSize(player.getVideoWidth(), player.getVideoHeight()); player.start(); } private void playVideo(String url) { try { File clip = new File(Environment.getExternalStorageDirectory(),"file1.mp4"); if (player == null) { player = new MediaPlayer(); player.setScreenOnWhilePlaying(true); } else { player.stop(); player.reset(); } player.setDataSource(url); player.setDisplay(holder); player.setOnPreparedListener(this); player.prepare(); player.setOnCompletionListener(this); } catch (Throwable t) { Log.e("ERROR", "Exception Error", t); } } 

  • Création d'un projet de bibliothèque Android autonome à l'aide d'Android Studio (0.8.14)
  • Android AlarmManager - RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP
  • Emulation Force Stop de ADB / Shell Commands
  • React Native Android s'arrête lors de la tentative de débogage dans Chrome
  • Modifier la couleur du texte en surbrillance dans Android
  • OnAttach (Activity) obsolète: où je peux vérifier si l'activité implémente l'interface de rappel
  • 7 Solutions collect form web for “Android: MediaPlayer vide ou sans vis à vis de la vidéo”

    J'ai aussi le même problème que celui décrit dans le lien ci-dessous

    VideoView disparaît pour une seconde lorsque la vidéo est modifiée

    Mais ce problème ne se produira pas si vous essayez d'utiliser Android 4.0+ (ICS). J'ai commencé à diffuser VideoView.java et MediaPlayer.java de 4,0 à mon application, mais cela semble complexe et pas de chance jusqu'à présent. Fondamentalement, cela semble être un bug dans le code natif des anciennes versions.

    Après trop de temps perdu essayant de comprendre comment jouer des vidéos consécutives sans l'écart, je me penche vers l'impossible. Sauf si vous êtes en mesure de creuser au niveau natif et d'implémenter votre propre joueur, le lecteur multimédia Android ne supporte tout simplement pas la lecture sans interruption à partir du moment.

    Je n'ai pas fait cela avec la lecture vidéo sur un MediaPlayer mais j'ai fait quelque chose de similaire avec les fichiers audio lorsqu'un flux est interrompu car un utilisateur passe de 3G à Wifi.

    Je pense que le retard que vous voyez est que le lecteur multimédia met en mémoire tampon le fichier de saisie. Alors, peut-être que vous pouvez définir les deux joueurs au départ? Vous devez définir la source de données et préparer les deux joueurs, mais seulement commencer l'une d'entre elles.

    Ensuite, dans votre OnCompletionListener, vous pouvez les retourner au lieu de réinitialiser l'existant et de définir une nouvelle source de données.

      player.release(); player = flipPlayer; flipPlayer = null; player.start(); 

    De toute évidence, vous devriez utiliser un autre onPreparedListener pour flipPlayer ou retirer le player.start () de onPrepare. (Étant donné que vous l'appelez de manière synchrone, je n'aurais pas pensé que c'était un problème).

    Je ne pense pas que ce soit possible.

    Raison: Mortplayer était également disponible pour Windows Mobile et l'un de ses points forts était qu'il prenait en charge le jeu sans glissement. Toutefois, il ne figure pas dans la version Android de l'application, et le développeur lui-même écrit que le SDK ne l'autorise pas sur xda: http://forum.xda-developers.com/showpost.php?p=5364530&postcount=5

    HTH, Daniele

    Avez-vous essayé d'être prêt (ouvert / préparé) 2 VideoView, l'un étant visible, l'autre invisible et arrêté, et vous recevrez bientôt le rappel d'OnCompletionListener, le 2ème visible, le démarrage et le cache 1ère. En attendant, lorsque le 2ème joue, vous pouvez appeler ouvrir / préparer sur 1st VideoView pour ouvrir / préparer un autre fichier.

    @ User1263019 – avez-vous pu transférer Android 4.0 MediaPlayer vers votre application? Je suis confronté au même problème et je suis à la recherche d'une bonne solution. Mon cas consiste à avoir une image sur la SurfaceView qui devrait être cachée afin de montrer la lecture vidéo, mais il y a un écart entre le début d'appel () et le début réel de la vidéo. La seule solution jusqu'à présent est de démarrer un thread qui vérifie si getCurrentPosition () est> 0.

    Sur le sujet – je pense qu'il n'est pas possible d'avoir une lecture claire, bien que Winamp prétend avoir de telles capacités. Un hack sale consiste à préparer le second joueur plusieurs secondes avant la fin de la lecture du premier joueur, puis appelle le début () du second joueur 100-200ms avant la fin de la lecture.

    Dans votre mise en œuvre exoplayer (ou lecteur multimédia), utilisez un gestionnaire pour publier à plusieurs reprises, en cours de lecture, le temps de suivi actuel et le transmet à un rappel:

     public interface MediaAction { public void onTrackingChanged(long currentPosition); } public class ExoPlayerImplementation implements Exoplayer { .. private MediaAction mediaActionCallback; public void setMediaActionCallback(MediaAction ma) { mediaActionCallback = ma; } public void releaseMediaAction() { mediaActionCallback = null; } private Handler trackingCallback = new Handler(Looper.getMainLooper()); Runnable trackingTask; private Runnable getTrackingTask() { Runnable r = new Runnable { @Override public void run() { long currentPosition = getCurrentPosition(); if (mediaActionCallback != null) { mediaActionCallback.onTrackingChanged(currentPosition); } // 60hz is 16 ms frame delay... trackingCallback.postDelayed(getTrackingTask(), 15); } }; trackingTask = r; return r; } public void play() { // exoplayer start code trackingCallback.post(getTrackingTask()); } public void pause/stop() { trackingCallback.removeCallbacks(trackingTask); } .. } 

    Et maintenant, vous pouvez suivre lorsque la position actuelle a effectivement changé – si elle a changé, vous pouvez afficher la vue de sortie vidéo / les vues échangées / supprimer l'aperçu (c.-à-d., Utiliser MediaExtractor pour extraire les images initiales, superposer comme aperçu dans un ImageView, puis Cacher une fois que la position actuelle augmente). Vous pouvez rendre ce code plus complet en le combinant avec l'auditeur d'état: vous savez si vous utilisez une mise en mémoire tampon (cochez la position de mise en mémoire tampon par rapport à la position actuelle), vous jouez, faites une pause ou vous arrêtez avec des rappels appropriés (dans MediaAction). Vous pouvez appliquer cette méthode aux classes MediaPlayer et ExoPlayer (car il s'agit simplement d'une interface et d'un gestionnaire).

    J'espère que cela pourra aider!

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.