2

I have a problem when using MediaPlayer to play video from url.

The follow of program : create an activity to play video -> press Home button -> back to app.

The requirement is video play from start, when press Home button video continuos play(only audio), and when back to app, video must play continuous(combine movie and audio).

The first, I created a MediaPlayer variable to play video. When Home button is pressed, MediaPlayer play continuous. But when back to app, video cannot displayed(black screen). So, I created other MediaPlayer variable to solved this issue. But when I using seekTo() function to seek second MediaPlayer to position of first MediaPlayer, this function is working incorrect.

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) {

    }





}
nguoitotkhomaisao
  • 1,247
  • 1
  • 13
  • 24
  • Please see this... I need your help... [MP4ParserMergeAudioVideo][1] [1]: http://stackoverflow.com/questions/30230709/no-audio-in-mp4-file-android – Kalai Arasi May 14 '15 at 07:21

0 Answers0