当我尝试将它与我的 MediaPlayer 一起使用时,我的 OnBufferingUpdate 从未被调用。我使用保存在 SD 卡上的视频作为媒体源。我认为这是问题的根源,我想知道 OnBufferingUpdate 是否仅适用于互联网流。我正在使用的代码如下。
public class FullImageActivity extends Activity implements SurfaceHolder.Callback, OnPreparedListener, OnInfoListener, OnErrorListener, OnBufferingUpdateListener{
private static final String TAG = "MediaPlayer shit";
MediaPlayer player;
SurfaceView surfaceview;
SurfaceHolder surfaceHolder;
int width;
int height;
DisplayImageOptions options;
ViewPager viewpager;
String path;
long id;
String[] projection = { GridviewData.ROWID, GridviewData.BITMAPPATH, GridviewData.VIDEOFILEPATH};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.full_image);
Intent i = getIntent();
id = i.getExtras().getLong("id");
path = i.getExtras().getString("videopath");
surfaceview = (SurfaceView)findViewById(R.id.surfaceview);
surfaceHolder = surfaceview.getHolder();
surfaceHolder.addCallback(this);
}
public void playVideo(){
player = new MediaPlayer();
try {
player.reset();
player.setOnErrorListener(this);
File file = new File(path);
FileInputStream inputStream = new FileInputStream(file);
player.setDataSource(inputStream.getFD());
inputStream.close();
player.setOnBufferingUpdateListener(this);
player.setOnInfoListener(this);
player.setOnPreparedListener(this);
player.setDisplay(surfaceHolder);
player.prepareAsync();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onPause() {
surfaceview.setVisibility(View.GONE);
if ( player != null )
{
if ( player.isPlaying() )
player.stop();
player.release();
player = null;
}
super.onPause();
}
@Override
protected void onResume() {
surfaceview.setVisibility(View.VISIBLE);
Log.i(TAG, "In onResume");
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int arg1, int arg2, int arg3) {
if ( player != null )
{
try {
Log.i(TAG, "In surface change");
player.setDisplay(surfaceHolder);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i(TAG, "in surface created");
playVideo();
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
Log.i(TAG, "Surface destroyed");
if ( player != null )
{
if ( player.isPlaying() )
player.stop();
player.release();
player = null;
} }
@Override
public void onPrepared(MediaPlayer p) {
player.start();
}
@Override
public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
Log.i(TAG, "THERE WAS AN ERROR");
return false;
}
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
if (percent == 50){
Log.i(TAG, "Within bufferingupdate");
}
}
最佳答案
您已经回答了您自己的问题! :)
onBufferingUpdate()
仅针对通过网络传输的资源调用,因此不会针对本地资源调用。
http://developer.android.com/reference/android/media/MediaPlayer.OnBufferingUpdateListener.html
Interface definition of a callback to be invoked indicating buffering status of a media resource being streamed over the network.
来自source code :
Called to update status in buffering a media stream received through progressive HTTP download. The received buffering percentage indicates how much of the content has been buffered or played. For example a buffering update of 80 percent when half the content has already been played indicates that the next 30 percent of the content to play has been buffered.
关于android - MediaPlayer 中未调用 OnBufferingUpdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17526601/