OnBufferingUpdate不会被调用的MediaPlayer中 [英] OnBufferingUpdate not being called in MediaPlayer
问题描述
我OnBufferingUpdate当我试图用我的MediaPlayer使用它永远不会被调用。我使用保存在SD卡我作为媒体来源的视频。我认为这是问题的根源,我想知道,如果OnBufferingUpdate仅适用于互联网流。在code我现在用的就是以下。
公共类FullImageActivity扩展活动实现SurfaceHolder.Callback,在preparedListener,OnInfoListener,OnErrorListener,OnBufferingUpdateListener {私有静态最后弦乐TAG =MediaPlayer的狗屎;
MediaPlayer的播放器;
SurfaceView surfaceview;
SurfaceHolder surfaceHolder;
INT宽度;
INT高度;
DisplayImageOptions选择;
ViewPager viewpager;
字符串路径;
长ID;
的String [] =投影{GridviewData.ROWID,GridviewData.BITMAPPATH,GridviewData.VIDEOFILEPATH};
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.full_image); 意向I = getIntent(); 。ID = i.getExtras()getLong之(ID);
PATH = i.getExtras()的getString(将videoPath); surfaceview =(SurfaceView)findViewById(R.id.surfaceview);
surfaceHolder = surfaceview.getHolder();
surfaceHolder.addCallback(本);}公共无效的playVideo(){
玩家=新的MediaPlayer();
尝试{
player.reset();
player.setOnErrorListener(本);
档案文件=新的文件(路径);
的FileInputStream的InputStream =新的FileInputStream(文件);
player.setDataSource(inputStream.getFD()); inputStream.close();
player.setOnBufferingUpdateListener(本);
player.setOnInfoListener(本);
player.setOn preparedListener(本);
player.setDisplay(surfaceHolder);
。玩家prepareAsync();
}赶上(抛出:IllegalArgumentException五){
e.printStackTrace();
}赶上(SecurityException异常五){
e.printStackTrace();
}赶上(IllegalStateException异常五){
e.printStackTrace();
}赶上(IOException异常五){
e.printStackTrace();
}}
@覆盖
保护无效的onPause(){
surfaceview.setVisibility(View.GONE);
如果(玩家!= NULL)
{
如果(player.isPlaying())
player.stop();
player.release();
玩家= NULL;
}
super.onPause();
}
@覆盖
保护无效onResume(){
surfaceview.setVisibility(View.VISIBLE);
Log.i(TAG,在onResume);
super.onResume();
}
@覆盖
保护无效的onStop(){
super.onStop();
}
@覆盖
公共无效surfaceChanged(SurfaceHolder架,INT ARG1,ARG2 INT,INT ARG3){
如果(玩家!= NULL)
{
尝试{
Log.i(TAG,在表面的变化);
player.setDisplay(surfaceHolder);
}赶上(例外五){
e.printStackTrace();
}
}
}
@覆盖
公共无效surfaceCreated(SurfaceHolder持有人){
Log.i(TAG,在表面形成);
的playVideo();
}@覆盖
公共无效surfaceDestroyed(SurfaceHolder为arg0){
Log.i(TAG,表面破坏);
如果(玩家!= NULL)
{
如果(player.isPlaying())
player.stop();
player.release();
玩家= NULL;
}}
@覆盖
在prepared(MediaPlayer的P)公共无效{
player.start();}@覆盖
公共布尔的onError(MediaPlayer的为arg0,ARG1 INT,INT ARG2){
Log.i(TAG,出现错误);
返回false;
}
@覆盖
公共无效onBufferingUpdate(MediaPlayer的熔点,诠释百分比){ 如果(百分比== 50){
Log.i(TAG,在bufferingupdate);
}}
您已经回答了你自己的问题! :)
onBufferingUpdate()
只要求资源被流在网络上,因此这将不会被要求对本地资源。
<一个href=\"http://developer.android.com/reference/android/media/MediaPlayer.OnBufferingUpdateListener.html\" rel=\"nofollow\">http://developer.android.com/reference/android/media/MediaPlayer.OnBufferingUpdateListener.html
要调用的回调的接口定义说明被流通过网络媒体资源的缓冲状态。
块引用>从<一个href=\"http://grep$c$c.com/file/repository.grep$c$c.com/java/ext/com.google.android/android/4.2.2_r1/android/media/MediaPlayer.java#MediaPlayer.OnBufferingUpdateListener\"相对=nofollow>来源$ C $ C :
在调用缓存通过渐进式HTTP下载接到媒体流来更新状态。接收到的缓冲百分比表示有多少内容被缓冲或播放。例如,当一半的内容已播放了80%的缓冲更新表示播放内容的下一个30%已经被缓冲。
块引用>My OnBufferingUpdate never gets called when I try to use it with my MediaPlayer. I'm using videos saved on my SDcard as the media source. I think this is the source of the problem and I'm wondering if OnBufferingUpdate only works for internet streams. The code I am using is below.
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"); } }
解决方案You've answered your own question! :)
onBufferingUpdate()
is only called for resources being streamed over a network, so this will not be called for local resources.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.
From the 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.
这篇关于OnBufferingUpdate不会被调用的MediaPlayer中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!