android - MediaPlayer 中未调用 OnBufferingUpdate

标签 android video media-player android-mediaplayer

当我尝试将它与我的 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/

相关文章:

Android Mp3 从 url 播放

Android - EditText 作为搜索框不起作用

android - 是否所有版本的 Android 都支持 MediaPlayer 流?

android - 构建项目后 "R cannot be resolved to a variable"错误消失

html - 获取 HTML5 视频(直播)的时长

ios - MPMoviePlayerController 中断 AirPlay iPod 音频,但它在设备上运行良好

html - 模式关闭时停止在 iframe 中播放视频

java - 如何在 MediaPlayer setDataSource 中包含 http header ?

java - Android 中线程如何与监听器交互?

android - 从 Android 使用 Google Drive SDK