Android的Mediaplayer库问题

问题描述 投票:0回答:1

我有一些漂亮的标准代码来运行MP3,但是播放它大约需要2秒钟。这个程序很简单。这个应用程式应播放1-2秒的声音。另外,有没有办法在应用程序加载时将mp3缓冲到RAM或其他东西中,以便它可以快速播放(没有延迟)?请帮助!

import android.content.Context;
import android.media.MediaPlayer;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;


public class MainActivity1 extends ActionBarActivity {

    MediaPlayer mediaPlayer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity1);
    }


    public void playSound(View v)throws Exception{
        mediaPlayer = MediaPlayer.create(this, R.raw.john_cena);
        mediaPlayer.setLooping(false);
        mediaPlayer.start();
        Thread.sleep(1500);
        //mediaPlayer.stop();
        mediaPlayer.reset();
        mediaPlayer.release();
        Log.d("1234FIND", "STOP RELEASE RESET");

    }
}
java android android-mediaplayer
1个回答
0
投票

如果要避免在加载媒体文件时稍有延迟,则应提前准备媒体播放器实例。加载媒体文件并准备播放时会有延迟。您有几种选择:

  • 继续使用MediaPlayer.create(),但请在准备好致电playSound()之前尽快使用。在您提供的简单示例中,尝试在MediaPlayer.create()方法中调用onCreate()
  • 您还可以使用prepareAsync()setOnPreparedListener()方法在后台准备媒体文件,并在就绪时设置通知。这比较复杂,但是可以为您提供更多控制和更好的用户体验。如果需要加载大文件,这是使其工作的最佳方法。小型音频文件可能没什么大不了的。
  • 如果要一遍又一遍地播放相同的媒体文件,则无需立即释放MediaPlayer。如果不重置或释放,该媒体仍将保留在内存中,并且可以立即再次播放。但是一定要在确定完成后以及在生命周期事件(例如release()onPause())中调用onStop()

See the documentation for details

要使其播放几秒钟然后停止,请使用Android的CountDownTimer:

// Will call onFinish() after 2 seconds. Second parameter is 
// for onTick() which we don't need and can ignore.
new CountDownTimer(2000, 2000) {

     public void onTick(long millisUntilFinished) {
         // Do nothing...
     }

     public void onFinish() {
         mediaPlayer.stop();  
         // Decide here if you need to prepare a new clip
         // or release the media player
     }

}.start();

这里是一个完整的例子:

package com.example.matthew.somediaplayer;

import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "TEST";
    private MediaPlayer mediaPlayer;
    private boolean isMediaPlayerPrepared = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button);
        button.setEnabled(false);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer.isPlaying() == false) {
                    playSound();
                }
            }
        });

    }

    @Override
    public void onResume(){
        super.onResume();
        Log.d(TAG, "In onResume()");
        createAndPrepareMediaPlayer();
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d(TAG, "In onStop()");
        mediaPlayer.release();
        isMediaPlayerPrepared = false;
    }

    @Override
    public void onPause(){
        Log.d(TAG, "In onPause()");
        super.onPause();
    }

    public void createAndPrepareMediaPlayer() {
        Log.d(TAG, "In createAndPrepareMediaPlayer()");
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

        if(isMediaPlayerPrepared == false) {
            try {
                AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.test);
                mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        Log.d(TAG, "Media player is prepared.");
                        isMediaPlayerPrepared = true;
                        Button button = (Button) findViewById(R.id.button);
                        button.setEnabled(true);
                    }
                });
                Log.d(TAG, "Beginning to prepare media player.");
                mediaPlayer.prepareAsync();

            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

    public void playSound() {

        Log.d(TAG, "In playSound()");
        if( isMediaPlayerPrepared ) {
            // Will call onFinish() after 2 seconds. Second parameter is
            // for onTick() which we don't need and can ignore.
            new CountDownTimer(2000, 2000) {

                public void onTick(long millisUntilFinished) {
                    // Do nothing...
                }

                public void onFinish() {
                    Log.d(TAG, "In onFinish()");
                    // We can't call a method like pause on an unprepared MediaPlayer instance.
                    if( isMediaPlayerPrepared ) {
                        mediaPlayer.pause();
                    } else {
                        Log.d(TAG, "Media player isn't prepared, and isn't allowed to pause.");
                    }
                }

            }.start();

            mediaPlayer.setLooping(false);
            mediaPlayer.seekTo(0); // set to beginning of track (if not already)
            mediaPlayer.start();
            Log.d(TAG, "Starting to play a sound.");
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.