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