【问题标题】:Android MediaPlayer with SurfaceView Fails on Prepare() Method带有 SurfaceView 的 Android MediaPlayer 在 Prepare() 方法上失败
【发布时间】:2018-11-08 01:58:50
【问题描述】:

我正在尝试使用表面视图和媒体播放器构建视频播放器。我的数据源是一个在线视频,我在清单中启用了互联网权限。

但是,该视频不付费,但对prepare 方法发出警告,而没有任何提示问题如下:

W/System.err:     at android.media.MediaPlayer._prepare(Native Method)
    at android.media.MediaPlayer.prepare(MediaPlayer.java:1188)
    at in.sashi.androidvideoplayer.MainActivity.surfaceCreated(MainActivity.java:64)

这是我为此目的的代码:

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener, View.OnClickListener {

private static final String TAG = MainActivity.class.getSimpleName();

private SurfaceView surfaceView;
private ImageView playIV, backIV;
private TextView videoNameTV;

private MediaPlayer mediaPlayer;
private SurfaceHolder holder;

//    private static final String VIDEO_URL = "https://www.youtube.com/watch?v=vEVd0QMjCc8";
private static final String VIDEO_URL = "http://mic.duytan.edu.vn:83/FINAL.mp4";
private static final String VIDEO_NAME = "FALL HARDER | BASKETBALL MOTIVATION";

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

    init();

}

private void init() {
    surfaceView = findViewById(R.id.surfsceView);
    playIV = findViewById(R.id.playIV);
    backIV = findViewById(R.id.backIV);
    videoNameTV = findViewById(R.id.videoNameTV);

    videoNameTV.setText(VIDEO_NAME);

    backIV.setOnClickListener(this);
    playIV.setOnClickListener(this);

    holder = surfaceView.getHolder();
    holder.addCallback(this);

    surfaceView.setKeepScreenOn(true);
    mediaPlayer = new MediaPlayer();

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    mediaPlayer.setDisplay(holder);
    try {
        mediaPlayer.setDataSource(VIDEO_URL);
        mediaPlayer.prepare();
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

@Override
public void onPrepared(MediaPlayer mp) {
    mp.start();
}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.backIV:
            onBackPressed();
            break;
        case R.id.playIV:
            if (mediaPlayer.isPlaying()){
                Log.d(TAG, "Pause Clicked");
                mediaPlayer.pause();
                playIV.setImageResource(R.drawable.play);
            } else {
                Log.d(TAG, "Play Clicked");
                mediaPlayer.start();
                playIV.setImageResource(R.drawable.pause);
            }
            break;
    }
}

@Override
protected void onPause() {
    super.onPause();
    collect();
}

private void collect() {
    if (mediaPlayer != null){
        mediaPlayer.release();
        mediaPlayer = null;
    }
}
}

谁能帮我解决这个问题?谢谢。

【问题讨论】:

    标签: android android-mediaplayer surfaceview


    【解决方案1】:

    使用正在全局定义的媒体播放器对象。

     @Override
     public void onPrepared(MediaPlayer mp) {
       mediaPlayer.start();
     }
    

    【讨论】:

      【解决方案2】:

      这个怎么样?

      @Override
      public void surfaceCreated(SurfaceHolder holder) {
          mediaPlayer.setDisplay(holder);
          try {
              mediaPlayer.setDataSource(VIDEO_URL);
              mediaPlayer.setOnPreparedListener(this);
              mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
              mediaPlayer.prepareAsync();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
      

      【讨论】:

      • 警告消失但视频无法播放
      • 您的视频网址拒绝连接。我用“commondatastorage.googleapis.com/gtv-videos-bucket/sample/…”测试了代码,它成功了。
      • 您的网址有效。谢谢。我提供的有什么问题吗?
      • 我觉得你需要url的认证。 This link 可能会对您有所帮助。
      • 不,您不能使用 MediaPlayer 播放 youtube。如果你想播放 youtube 视频,你可以使用 Youtube Player API。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      相关资源
      最近更新 更多