Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果在部分唤醒锁定模式下缓冲时间过长,mediaplayer将在onStop()中释放_Android - Fatal编程技术网

Android 如果在部分唤醒锁定模式下缓冲时间过长,mediaplayer将在onStop()中释放

Android 如果在部分唤醒锁定模式下缓冲时间过长,mediaplayer将在onStop()中释放,android,Android,我正在开发一个流媒体视频应用程序 MediaPlayer在“onStop()”方法中发布 问题是,如果init/buff时间过长,则会进入“部分唤醒锁定”模式,但在显示视频之前会调用“onStop()”。CPU正在运行,但MediaPlayer已释放,视频不会结束缓冲过程,也不会再次启动 如果在输入“onStop()”之前视频缓冲结束且视频开始,则没有问题。(例如,良好的网络连接) 一种解决方案是将节能设置为“完全唤醒锁定”模式。它工作正常,因为在用户退出应用程序之前不会执行“onStop”。但

我正在开发一个流媒体视频应用程序

MediaPlayer在“onStop()”方法中发布

问题是,如果init/buff时间过长,则会进入“部分唤醒锁定”模式,但在显示视频之前会调用“onStop()”。CPU正在运行,但MediaPlayer已释放,视频不会结束缓冲过程,也不会再次启动

如果在输入“onStop()”之前视频缓冲结束且视频开始,则没有问题。(例如,良好的网络连接)

一种解决方案是将节能设置为“完全唤醒锁定”模式。它工作正常,因为在用户退出应用程序之前不会执行“onStop”。但如果用户按下电源按钮,视频将停止,因为MediaPlayer已损坏,不再重新启动

还有其他解决办法吗

有关守则:

public class VideoActivity extends Activity {

(...)

/**
 * Trigger when Activity is created
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.i(TAG,"VideoActivity - onCreate");

    (...)

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "my_wake");


    (...)


    mVideoSurfaceView = (SurfaceView) findViewById(R.id.videoSurface);


    // Inicializa Video
    initSurfaceView();

}

@Override
protected void onStart() {
    super.onStart();
    Log.i(TAG,"VideoActivity - onStart");
    wl.acquire();
    Log.i(TAG,"Adquire WakeLock");
}   

/**
 * Init Video Surface View
 */
private void initSurfaceView() {
    mVideoWidth = 0;
    mVideoHeight = 0;
    mVideoSurfaceViewHolder = mVideoSurfaceView.getHolder();
    mVideoSurfaceViewHolder.addCallback(mSurfaceHolderCallback);
    mVideoSurfaceView.setFocusable(true);
    mVideoSurfaceView.setFocusableInTouchMode(true);
    mVideoSurfaceView.requestFocus();
}


/**
 * Start play video operations
 * @param url Video Streming URL
 */
private void playVideo(String url) {
    doCleanUp();
    try {
        // Create a new media player and set the listeners
        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
        mMediaPlayer.setOnPreparedListener(mOnPreparedListener);
        mMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
        mMediaPlayer.setOnCompletionListener(mOnCompletionListener);
        mMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
        //mMediaPlayer.setDataSource(mVideoPath2);
        mMediaPlayer.setDataSource(url);
        mMediaPlayer.setDisplay(mVideoSurfaceViewHolder);
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mMediaPlayer.setScreenOnWhilePlaying(true);
        mMediaPlayer.prepareAsync();
    } catch (Exception e) {
        Log.e(TAG, "error: " + e.getMessage(), e);
    }
}

/**
 * Vars clean up
 */
private void doCleanUp() {
    mVideoWidth = 0;
    mVideoHeight = 0;
    mIsVideoReadyToBePlayed = false;
    mIsVideoSizeKnown = false;
}

/**
 * Release Media Player
 */
private void releaseMediaPlayer() {
    if (mMediaPlayer != null) {
        mMediaPlayer.release();
        mMediaPlayer = null;
    }

}


MediaPlayer.OnPreparedListener mOnPreparedListener = 
    new OnPreparedListener() {

        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
            Log.d(TAG, "onPrepared called");

            if (mIsVideoReadyToBePlayed) {
                mediaPlayer.start();
            }

        }

};

@Override
protected void onStop() {
    super.onStop();
    Log.i(TAG,"VideoActivity - onStop");
    releaseMediaPlayer();
    doCleanUp();
    wl.release();
}   
/**
 * Activity destroyed
 */
@Override
protected void onDestroy() {
    super.onDestroy();
    Log.i(TAG,"VideoActivity - onDestroy");
    releaseMediaPlayer();
    doCleanUp();
}



}
一种解决方案:(但按下电源按钮可停止视频并再次重新缓冲)

其他解决方案(不好)。工作正常,如果用户按下电源按钮视频不停止播放,只有声音。如果用户按back botton完成视频停止,但MediaPlayer未发布(不是很好的解决方案),则某些编解码器会出现问题(可能某些本机MediaPlayer实例将处于活动状态)


你期待什么?调用“onStop()”时,您正在释放“MediaPlayer”。如果你不想在“onStop()”之后停止准备,你应该在代码中提供它。如果我不在onStop()中释放,工作很好,但不是很好的做法…我想使用“PARTIAL_WAKE_LOCK”,因为在这种模式下:如果用户按下电源按钮,然后,屏幕将关闭,但CPU将保持打开,直到所有部分唤醒锁被释放,视频将正常进行。我想我将使用“完全唤醒锁定”,如果用户按下按钮,MediaPlayer将被释放,我将在onStart方法中创建其他。这样做的缺点是会有延迟、再次缓冲等
public class VideoActivity extends Activity {

    (...)

    /**
    * Trigger when Activity is created
    */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG,"VideoActivity - onCreate");

        (...)

         PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
         wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "my_wake");

         (...)


         mVideoSurfaceView = (SurfaceView) findViewById(R.id.videoSurface);


         // Inicializa Video
        initSurfaceView();

    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG,"VideoActivity - onStart");
        wl.acquire();
        Log.i(TAG,"Adquire WakeLock");
        if (mChannel!=null){
            playVideo(mChannel.getUrl());  //RESTART MEDIAPLAYER AGAIN
        } 
    }   

    /**
    * Init Video Surface View
    */
    private void initSurfaceView() {
        mVideoWidth = 0;
        mVideoHeight = 0;
        mVideoSurfaceViewHolder = mVideoSurfaceView.getHolder();
        mVideoSurfaceViewHolder.addCallback(mSurfaceHolderCallback);
        mVideoSurfaceView.setFocusable(true);
        mVideoSurfaceView.setFocusableInTouchMode(true);
        mVideoSurfaceView.requestFocus();
    }


     /**
     * Start play video operations
     * @param url Video Streming URL
     */
     private void playVideo(String url) {
         doCleanUp();
         try {
             // Create a new media player and set the listeners
             mMediaPlayer = new MediaPlayer();
             mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.FULL_WAKE_LOCK);
             mMediaPlayer.setOnPreparedListener(mOnPreparedListener);
             mMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
             mMediaPlayer.setOnCompletionListener(mOnCompletionListener);
             mMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
             //mMediaPlayer.setDataSource(mVideoPath2);
             mMediaPlayer.setDataSource(url);
             mMediaPlayer.setDisplay(mVideoSurfaceViewHolder);
             mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
             mMediaPlayer.setScreenOnWhilePlaying(true);
             mMediaPlayer.prepareAsync();
         } catch (Exception e) {
             Log.e(TAG, "error: " + e.getMessage(), e);
         }
    }

    /**
    * Vars clean up
    */
    private void doCleanUp() {
        mVideoWidth = 0;
        mVideoHeight = 0;
        mIsVideoReadyToBePlayed = false;
        mIsVideoSizeKnown = false;
    }

    /**
    * Release Media Player
    */
    private void releaseMediaPlayer() {
        if (mMediaPlayer != null) {
              mMediaPlayer.release();
              mMediaPlayer = null;
        }

    }


    MediaPlayer.OnPreparedListener mOnPreparedListener = 
        new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                Log.d(TAG, "onPrepared called");

                     if (mIsVideoReadyToBePlayed) {
                         mediaPlayer.start();
                     }

            }

    };

         @Override
         protected void onStop() {
             super.onStop();
             Log.i(TAG,"VideoActivity - onStop");
             releaseMediaPlayer();
             doCleanUp();
             wl.release();
         }  
     /**
     * Activity destroyed
     */
    @Override
    protected void onDestroy() {
         super.onDestroy();
         Log.i(TAG,"VideoActivity - onDestroy");
         releaseMediaPlayer();
         doCleanUp();
     }



}
public class VideoActivity extends Activity {

    (...)

    /**
    * Trigger when Activity is created
    */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG,"VideoActivity - onCreate");

        (...)

         PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
         wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "my_wake");

         (...)


         mVideoSurfaceView = (SurfaceView) findViewById(R.id.videoSurface);


         // Inicializa Video
        initSurfaceView();

    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG,"VideoActivity - onStart");
        wl.acquire();
        Log.i(TAG,"Adquire WakeLock");

    }   

    /**
    * Init Video Surface View
    */
    private void initSurfaceView() {
        mVideoWidth = 0;
        mVideoHeight = 0;
        mVideoSurfaceViewHolder = mVideoSurfaceView.getHolder();
        mVideoSurfaceViewHolder.addCallback(mSurfaceHolderCallback);
        mVideoSurfaceView.setFocusable(true);
        mVideoSurfaceView.setFocusableInTouchMode(true);
        mVideoSurfaceView.requestFocus();
    }


     /**
     * Start play video operations
     * @param url Video Streming URL
     */
     private void playVideo(String url) {
         doCleanUp();
         try {
             // Create a new media player and set the listeners
             mMediaPlayer = new MediaPlayer();
             mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
             mMediaPlayer.setOnPreparedListener(mOnPreparedListener);
             mMediaPlayer.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener);
             mMediaPlayer.setOnCompletionListener(mOnCompletionListener);
             mMediaPlayer.setOnBufferingUpdateListener(mOnBufferingUpdateListener);
             //mMediaPlayer.setDataSource(mVideoPath2);
             mMediaPlayer.setDataSource(url);
             mMediaPlayer.setDisplay(mVideoSurfaceViewHolder);
             mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
             mMediaPlayer.setScreenOnWhilePlaying(true);
             mMediaPlayer.prepareAsync();
         } catch (Exception e) {
             Log.e(TAG, "error: " + e.getMessage(), e);
         }
    }

    /**
    * Vars clean up
    */
    private void doCleanUp() {
        mVideoWidth = 0;
        mVideoHeight = 0;
        mIsVideoReadyToBePlayed = false;
        mIsVideoSizeKnown = false;
    }

    /**
    * Release Media Player
    */
    private void releaseMediaPlayer() {
        if (mMediaPlayer != null) {
              mMediaPlayer.release();
              mMediaPlayer = null;
        }

    }


    MediaPlayer.OnPreparedListener mOnPreparedListener = 
        new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
                Log.d(TAG, "onPrepared called");

                     if (mIsVideoReadyToBePlayed) {
                         mediaPlayer.start();
                     }

            }

    };

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG,"VideoActivity - onStop");
        wl.release();
    }   

     /**
     * Activity destroyed
     */
    @Override
    protected void onDestroy() {
         super.onDestroy();
         Log.i(TAG,"VideoActivity - onDestroy");
         releaseMediaPlayer();
         doCleanUp();
     }



}