Android MediaPlayer seekTo()函数工作不正常

时间:2015-04-26 05:07:14

标签: android media-player android-mediaplayer

使用MediaPlayer从网址播放视频时遇到问题。

以下程序:创建一个播放视频的活动 - >按主页按钮 - >回到app。

要求是视频播放从开始,按主页按钮视频连续播放(仅音频),当回到应用程序时,视频必须连续播放(组合电影和音频)。

首先,我创建了一个MediaPlayer变量来播放视频。按下主页按钮时,MediaPlayer连续播放。但是当回到应用程序时,视频无法显示(黑屏)。所以,我创建了其他MediaPlayer变量来解决这个问题。但是当我使用seekTo()函数寻找第二个MediaPlayer到第一个MediaPlayer的位置时,此函数工作不正确。

import java.io.IOException;
import com.example.videotest.R;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnSeekCompleteListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Toast;

public class PlayVideoActivity extends Activity implements OnClickListener,SurfaceHolder.Callback, FGMediaController.MediaPlayerControl {


    SurfaceView videoSurface,videoSurfaceFullscreen,videoSurfaceSmallsceen;
    MediaPlayer player, backupPlayer;
    FGMediaController controller;
    LinearLayout llControllerBar;
    public boolean isFullscreen = false;
    int videoDuration;
    int videoCurrent;
    SurfaceHolder viewHolder = null;
    boolean isPaused = false;
    String videoUrl = "http://cdn-smatopi.tv-bank.com/movie/867/867-32/867-32-2015042306-D3/hls/hls3/867-32-2015042306-D3-HLS3.m3u8";

    Button btnSeek, btnRelease;

    int currentPos = 30000;

    boolean videoPrepared = false;
    boolean backupPrepared = false;
    boolean mVideoSizeIsSet = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.playvideo);

        btnSeek = (Button) findViewById(R.id.btnSeek);
        btnRelease = (Button) findViewById(R.id.btnRelease);
        videoSurface = (SurfaceView)findViewById(getResources().getIdentifier("vvVideo", "id", getPackageName()));
        SurfaceHolder videoHolder = videoSurface.getHolder();
        videoHolder.addCallback(this);
        player = new MediaPlayer();
        backupPlayer = new MediaPlayer();

        controller = new FGMediaController(this);

        try {
            player.setAudioStreamType(AudioManager.STREAM_MUSIC);
            player.setDataSource(this, Uri.parse(videoUrl));
            player.prepareAsync();
            //backupPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            //backupPlayer.setDataSource(this, Uri.parse(videoUrl));
            //backupPlayer.prepareAsync();
        } catch (Exception e) {
            e.printStackTrace();
        }

        btnSeek.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.e("Huhu",currentPos + "");
                backupPlayer.seekTo(currentPos);
            }
        });

        btnRelease.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                backupPlayer.stop();
                backupPlayer.release();
            }
        });

        player.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
            public void onBufferingUpdate(MediaPlayer mp, int percent) {

            }
        });


        player.setOnPreparedListener(new OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                controller.setMediaPlayer(PlayVideoActivity.this);
                controller.setAnchorView((FrameLayout) findViewById(PlayVideoActivity.this.getResources().getIdentifier("videoSurfaceContainer", "id", PlayVideoActivity.this.getPackageName())));
                player.start();
            }
        });


    }

    @Override
    public void onDestroy(){
        //backupPlayer.release();
        player.release();
        super.onDestroy();

    }

    @Override
    public void onResume(){
        Log.e("Surface Created","OnResume");
        super.onResume();
    }



    // Implement SurfaceHolder.Callback
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Log.e("Surface Created","Surface Created! " + holder);
        if(viewHolder != null){
            viewHolder = holder;    
            backupPlayer = new MediaPlayer();
            try {
                backupPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                backupPlayer.setDataSource(this, Uri.parse(videoUrl));
                backupPlayer.prepareAsync();

                backupPlayer.setDisplay(holder);


                backupPlayer.setOnPreparedListener(new OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        backupPrepared = true;
                        backupPlayer.start();
                    }
                });

                backupPlayer.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() {
                    @Override
                    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
                        // TODO Auto-generated method stub
                        if (width == 0 || height == 0){
                            Toast.makeText(getApplicationContext(),"Width = 0 Height = 0"+ mp.getDuration(), Toast.LENGTH_LONG).show();
                        }else{
                            if(backupPrepared){
                                backupPrepared = false;
                                currentPos = player.getCurrentPosition();
                                player.reset();
                                Toast.makeText(getApplicationContext(),"Seek To  "+ backupPlayer.getCurrentPosition() + " | " + backupPlayer.isPlaying() + "|" + currentPos, Toast.LENGTH_LONG).show();
                                Log.e("Huhu","Seek To  "+ backupPlayer.getCurrentPosition() + " | " + backupPlayer.isPlaying() + "|" + currentPos);
                                backupPlayer.seekTo(currentPos); // If you set currentPos = 20000ms or 30000ms backupPlayer can to seek, but if you set currentPos = 10000ms backupPlayer cannot seek !

                            }
                        }

                    }
                });

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

        }else{
            player.setDisplay(holder);
        }

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.e("Surface Created","surfaceDestroyed! " + player.getCurrentPosition());
        viewHolder = holder;        
    }

    // End MediaPlayer.OnPreparedListener
    // Implement VideoMediaController.MediaPlayerControl
    @Override
    public boolean canPause() {
        return true;
    }
    @Override
    public boolean canSeekBackward() {
        return true;
    }
    @Override
    public boolean canSeekForward() {
        return true;
    }

    @Override
    public int getBufferPercentage() {
        return 0;
    }

    @Override
    public int getCurrentPosition() {
        //Log.printLog(Log.ERROR, "CURRENT :"+player.getCurrentPosition());
        int current = 0;
        try{
            current = player.getCurrentPosition();
        }catch(Exception e){
            e.printStackTrace();
        }
        return current;
    }

    @Override
    public int getDuration() {
        int duration = 0;
        try{
            duration = player.getDuration();
        }catch(Exception e){
            e.printStackTrace();
        }
        return duration;
    }

    @Override
    public boolean isPlaying() {
        boolean isPlaying = false;
        try{
            isPlaying = player.isPlaying();
        }catch(Exception e){
            e.printStackTrace();
        }
        return isPlaying;
    }

    @Override
    public void pause() {
        player.pause();
    }

    @Override
    public void seekTo(int i) {
        player.seekTo(i);
    }
    @Override
    public void start() {
        player.start();
    }
    @Override
    public boolean isFullScreen() {
        return isFullscreen;
    }


    @Override
    public void toggleFullScreen() {
        // TODO Auto-generated method stub

    }


    @Override
    public void doBackPressed() {
        // TODO Auto-generated method stub

    }


    @Override
    public void onClick(View v) {

    }





}

0 个答案:

没有答案