MediaPlayer lit l'audio et la vidéo
Introduction à cette section :
Cette section présente MediaPlayer dans le multimédia Android. Nous pouvons lire de l'audio et de la vidéo via cette API. Cette classe est un composant important du framework multimédia Androd. Grâce à cette classe, nous pouvons obtenir et décoder dans les plus petites étapes. et lire de l'audio et de la vidéo. Il prend en charge trois sources multimédias différentes :
- Ressources locales
- URI interne, par exemple, vous pouvez obtenir
- URL externe (flux) via ContentResolver Pour la liste des formats multimédias pris en charge par Android
Pour la liste des formats multimédias pris en charge par Android, voir : Formats multimédias pris en charge Document
Nous l'utiliserons dans cette section MediaPlayer pour écrire un exemple simple de lecture audio et vidéo !
Documentation officielle de l'API : MediaPlayer
1. Explication détaillée des méthodes associées
1) Obtenir un MediaPlayer exemple :
Vous pouvez direct new ou appeler la méthode create pour créer :
MediaPlayer mp = new MediaPlayer(); MediaPlayer mp = MediaPlayer.create(this, R.raw.test); //无需再调用setDataSource
De plus, create a également cette forme : créer (Contexte contextuel, Uri uri, support SurfaceHolder)Créez un lecteur multimédia via Uri et spécifiez SurfaceHolder [Classe abstraite]
2) Définissez le fichier de lecture :
//①raw下的资源: MediaPlayer.create(this, R.raw.test); //②本地文件路径: mp.setDataSource("/sdcard/test.mp3"); //③网络URL文件: mp.setDataSource("http://www.xxx.com/music/test.mp3");
En plus de la méthode setDataSource(), qui contient un tel type de paramètre : FileDescriptor, lors de l'utilisation de ce Lorsque vous utilisez l'API, vous devez placer le fichier dans le dossier assets au même niveau que le dossier res, puis utiliser le code suivant pour définir la DataSource :
AssetFileDescriptor fileDescriptor = getAssets().openFd("rain.mp3"); m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
3) Autres méthodes
- getCurrentPosition( ): Obtenez la position de lecture actuelle
- getDuration() : Obtenez l'heure du fichier
- getVideoHeight() : Obtenez la hauteur de la vidéo
- getVideoWidth() : Obtenez la largeur de la vidéo
- isLooping() : s'il faut lire en boucle
- isPlaying() : s'il faut lire
- pause () : Pause
- prepare() : Préparer (synchrone)
- prepareAsync() : Préparer (asynchrone)
- release() : Libérez l'objet MediaPlayer
- reset() : Réinitialisez l'objet MediaPlayer
- seekTo( int msec) : Spécifiez la position de lecture (durée en millisecondes)
- setAudioStreamType(int streamtype) : Spécifiez le type de média en streaming
- setDisplay (SurfaceHolder sh) : Définir pour utiliser SurfaceHolder pour afficher le multimédia
- setLooping(bouclage booléen) : Définir s'il faut lire en boucle
- setOnBufferingUpdateListener(MediaPlayer .Écouteur OnBufferingUpdateListener): Écoute du tampon pour les médias en streaming réseau
- setOnCompletionListener (Auditeur MediaPlayer.OnCompletionListener) : Surveillance de fin de lecture multimédia en streaming réseau
- setOnErrorListener(MediaPlayer.OnErrorListener auditeur) : Définir l'écouteur de message d'erreur
- setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener écouteur) : Surveillance de la taille de la vidéo
- setScreenOnWhilePlaying(boolean screenOn) : définissez s'il faut utiliser SurfaceHolder pour afficher
- setVolume(float leftVolume, float rightVolume) : définissez le volume
- start() : Commencer à jouer
- stop() : Arrêter de jouer
2. Utilisez des exemples de code
Exemple 1 : Utilisez MediaPlayer pour lire l'audio :
Exécutez le rendu :
Code clé :
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button btn_play; private Button btn_pause; private Button btn_stop; private MediaPlayer mPlayer = null; private boolean isRelease = true; //判断是否MediaPlayer是否释放的标志 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); } private void bindViews() { btn_play = (Button) findViewById(R.id.btn_play); btn_pause = (Button) findViewById(R.id.btn_pause); btn_stop = (Button) findViewById(R.id.btn_stop); btn_play.setOnClickListener(this); btn_pause.setOnClickListener(this); btn_stop.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_play: if(isRelease){ mPlayer = MediaPlayer.create(this,R.raw.fly); isRelease = false; } mPlayer.start(); //开始播放 btn_play.setEnabled(false); btn_pause.setEnabled(true); btn_stop.setEnabled(true); break; case R.id.btn_pause: mPlayer.pause(); //停止播放 btn_play.setEnabled(true); btn_pause.setEnabled(false); btn_stop.setEnabled(false); break; case R.id.btn_stop: mPlayer.reset(); //重置MediaPlayer mPlayer.release(); //释放MediaPlayer isRelease = true; btn_play.setEnabled(true); btn_pause.setEnabled(false); btn_stop.setEnabled(false); break; } } }
Remarque :
lit le fichier audio dans le répertoire res/raw et crée le Appel MediaPlayer C'est la méthode create, avant de démarrer la lecture pour la première fois Il n'est pas nécessaire d'appeler à nouveau préparer(). S'il est construit à l'aide de la méthode constructeur, vous devez appeler la méthode préparer() une fois ! Des exemples de codes pour la lecture audio des deux autres canaux sont également publiés dans la documentation officielle :
Uri local :
Uri myUri = ....; // initialize Uri here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), myUri); mediaPlayer.prepare(); mediaPlayer.start();
URL externe :
String url = "http://........"; // your URL here MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); // might take long! (for buffering, etc) mediaPlayer.start();
Remarque : Si vous diffusez un fichier audio en ligne via une URL, le fichier doit être lisible Téléchargement progressif
Exemple 2 : Utiliser MediaPlayer pour lire une vidéo
MediaPlayer est principalement utilisé pour lire de l'audio et ne fournit pas d'interface de sortie d'image, nous devons donc utiliser autre Composant pour afficher la sortie d'image jouée par MediaPlayer, nous pouvons utiliser SurfaceView pour l'afficher Ci-dessous, nous utilisons SurfaceView pour écrire un exemple de lecture vidéo :
Exécution de rendus. :
Code d'implémentation :
Fichier de mise en page : activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="5dp"> <SurfaceView android:id="@+id/sfv_show" android:layout_width="match_parent" android:layout_height="300dp" /> <Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" /> <Button android:id="@+id/btn_pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂停 " /> <Button android:id="@+id/btn_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="终止" /> </LinearLayout>
MainActivity.java :
public class MainActivity extends AppCompatActivity implements View.OnClickListener, SurfaceHolder.Callback { private MediaPlayer mPlayer = null; private SurfaceView sfv_show; private SurfaceHolder surfaceHolder; private Button btn_start; private Button btn_pause; private Button btn_stop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); } private void bindViews() { sfv_show = (SurfaceView) findViewById(R.id.sfv_show); btn_start = (Button) findViewById(R.id.btn_start); btn_pause = (Button) findViewById(R.id.btn_pause); btn_stop = (Button) findViewById(R.id.btn_stop); btn_start.setOnClickListener(this); btn_pause.setOnClickListener(this); btn_stop.setOnClickListener(this); //初始化SurfaceHolder类,SurfaceView的控制器 surfaceHolder = sfv_show.getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setFixedSize(320, 220); //显示的分辨率,不设置为视频默认 } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_start: mPlayer.start(); break; case R.id.btn_pause: mPlayer.pause(); break; case R.id.btn_stop: mPlayer.stop(); break; } } @Override public void surfaceCreated(SurfaceHolder holder) { mPlayer = MediaPlayer.create(MainActivity.this, R.raw.lesson); mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mPlayer.setDisplay(surfaceHolder); //设置显示视频显示在SurfaceView上 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} @Override public void surfaceDestroyed(SurfaceHolder holder) {} @Override protected void onDestroy() { super.onDestroy(); if (mPlayer.isPlaying()) { mPlayer.stop(); } mPlayer.release(); } }
Le code est très simple. La mise en page a un SurfaceView, puis appelle getHolder pour obtenir un objet SurfaceHolder. Complétez ici les paramètres liés à SurfaceView, définissez la résolution d'affichage et une interface de rappel. Remplacer les trois méthodes de SurfaceView lors de sa création, lors de sa modification et lors de sa destruction ! Puis le bouton contrôle la lecture Et faites simplement une pause~
Exemple 3 : Utilisez VideoView pour lire des vidéos
En plus d'utiliser MediaPlayer + SurfaceView pour lire des vidéos, nous pouvons également utiliser VideoView pour directement Pour lire une vidéo, on peut réaliser la lecture vidéo en changeant un peu ! L'effet opérationnel est conforme à ce qui précède, je ne le publierai donc pas. Accédez directement au code !
MainActivity.java:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private VideoView videoView; private Button btn_start; private Button btn_pause; private Button btn_stop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); } private void bindViews() { videoView = (VideoView) findViewById(R.id.videoView); btn_start = (Button) findViewById(R.id.btn_start); btn_pause = (Button) findViewById(R.id.btn_pause); btn_stop = (Button) findViewById(R.id.btn_stop); btn_start.setOnClickListener(this); btn_pause.setOnClickListener(this); btn_stop.setOnClickListener(this); //根据文件路径播放 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { videoView.setVideoPath(Environment.getExternalStorageDirectory() + "/lesson.mp4"); } //读取放在raw目录下的文件 //videoView.setVideoURI(Uri.parse("android.resource://com.jay.videoviewdemo/" + R.raw.lesson)); videoView.setMediaController(new MediaController(this)); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_start: videoView.start(); break; case R.id.btn_pause: videoView.pause(); break; case R.id.btn_stop: videoView.stopPlayback(); break; } } }
Le code est très simple et je ne l'expliquerai pas~ Si vous avez des questions, exécutez-le simplement dans la prochaine démo~
3. Téléchargez l'exemple de code dans cette section :
Résumé de cette section :
D'accord, cette section présente brièvement comment utiliser MediaPlayer pour lire de l'audio et combinez-le avec SurfaceView pour lire des vidéos. Enfin, j'ai écrit un exemple d'utilisation de VideoView pour lire des vidéos. Elles sont toutes très simples d'utilisation~. Je pense qu'il est très facile pour tout le monde d'apprendre~ Eh bien, merci~