J'ai une question est possible dans Android de charger les données vidéo dans un videoView code> sans qu'il commence instantanément à jouer? Si oui, comment pourrais-je faire ça? P>
7 Réponses :
videoView code> ne démarre pas la lecture automatiquement, au moins si vous avez un
mediacontroller code> ci-joint. Vous devez appeler
start () code> pour qu'il commence à lire la lecture. Par conséquent, si vous ne voulez pas qu'il démarre la lecture, n'appelle pas
start () code>. P>
Le seul problème que j'ai maintenant, c'est que la vidéo ne s'affiche pas du tout dans la vue, ce que je veux dire, c'est que j'aimerais qu'il apparaisse (seulement la première image) et que vous avez des contrôles (jouer / pause, arrêter, avancer et en arrière) juste sous elle ...
MediaController Code> est une chose contextuelle - L'utilisateur doit appuyer sur votre
videoView code> pour qu'il apparaisse. Si vous voulez des contrôles toujours visibles, vous devez probablement le faire vous-même. Voir GITUB.COM/COMMONSGUY/VIDTRY pour un projet utilisant
MediaPlayer Code> et un
Surfaceview code> avec un panneau "Controller" personnalisé. En ce qui concerne la première image, autre que la lecture de départ, vous n'avez aucun moyen de forcer ce cadre à afficher, Afaik.
Comment puis-je savoir quand la vidéo est chargée? Donc, que je peux gérer une autre action ou montrer quelque chose à l'utilisateur.
@XAIF: Je ne sais pas ce que vous considérez "chargé" pour signifier, mais il y a développeur.android.com/reference/android/widget/...
J'ai aussi voulu que ma vidéoView soit dans un état de pause lorsque l'activité a commencé. Je n'ai pas pu trouver un moyen simple d'afficher le premier cadre (non noir) de la vidéo.
En tant que solution de contournement, j'ai créé une vignette bitmap à partir de la ressource vidéo, puis placez cette vignette comme l'arrière-plan sur la vidéosView sur l'activité Démarrer. Ensuite, lorsque la vidéo commence à jouer, vous n'avez besoin que de l'arrière-plan (sinon que votre vidéo de lecture est cachée derrière votre image d'arrière-plan). P>
mPlay.setOnClickListener(new OnClickListener() { public void onClick(View view) { if(!isPlaying){ keepScreenOn(); mPlay.setText("Pause"); // make sure to null the background so you can see your video play mVideoView.setBackgroundDrawable(null); mVideoView.start(); isPlaying = true; } else { mPlay.setText("Play"); mVideoView.pause(); isPlaying = false; } } });
J'utilisais le MediaController pour mon bouton de lecture, donc j'ai utilisé la réponse de la liaison ci-dessous combinée à ce bitmap de fond pour ma solution. P>
événement pour videoView Playback Etat ou MediaController Play / Pause < / a> p>
Je vous suggère pour le code suivant dans lequel je suis exécuté mon application avec succès
Le code est comme suit: p>
fichier XML: p>
<manifest> ... <uses-sdk... /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_VIDEO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-feature android:name="android.hardware.camera" android:required="false" /> <application>...</application> </manifest>
Je pensais aussi à montrer un thunbnail comme Sharael indiqué. Mais je pense que cela pourrait entraîner une performance réduite.
Alors, ce que je fais maintenant, c'est juste appeler p> pour transmettre la vidéo sur la première milliseconde. Cela fonctionne bien pour moi et est rapide à mettre en œuvre. P> p>
Cela ne fonctionnera pas car la vidéo doit être en état de lecture.
CECKTO (1) CODE> Semble être important pour moi. Sans la recherche de ma vidéo affichera une image aléatoire, généralement le cadre 1 sec ultérieure, au tout début lorsque j'ai appelé
start () code>
Je l'ai trouvé possible en démarrant la vidéo en attendant 1 milliseconde et en pause:
J'ai trouvé que juste faire Si tout ce que vous devez faire est de montrer le premier Cadre, mais ne jouez pas la vidéo, vous pouvez simplement faire cela, ce qui est utile pour rendre la vignette de la vidéo: p> Cependant, pour montrer de manière fiable la première image dans les cas où Vous souhaitez lire la vidéo à un moment donné après le rendu, par exemple à partir d'une interaction utilisateur, ma solution consiste à enregistrer un Voici comment cela regarderait: P> videoview.seekto (n) code> n'est pas suffisant sur tous les périphériques pour afficher la première image de la vidéo.
onpreparedlistener code>, puis appelez
start () code>. J'inscrit également un
Oninfolistener code> afin que je puisse être averti lorsque le rendu commence. Je vérifie ensuite si l'info est en effet un événement "Start de rendu", et je vérifie si c'est la première fois que le
videoView code> a commencé à rendu. Si oui, i
pause () code> puis
chercheto (0) code>. P>
private void showFirstFrame(final VideoView videoView, Uri uri) {
videoView.setVideoURI(uri);
final AtomicBoolean showedFirstFrame = new AtomicBoolean(false);
videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
// If this is our first time starting video rendering, pause and show first frame
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START
&& showedFirstFrame.compareAndSet(false, true)) {
videoView.pause();
videoView.seekTo(0);
}
return false;
}
});
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
videoView.start();
}
});
}