项目需求是类似于微信的首页,展示一个短视频的列表通过listview 里面每个item由一个textureView作为视频播放控件,开始用的是videoview但是发现不能改变大小,滑动列表的时候会暂停播放。 所以使用textureView做,但是现在的问题是textureView加载的列表很卡,内存占用很大。不知道是不是因为每一个item的textureView使用的资源没有释放还是因为别的什么,例如当A、B、C三个条目,当滑动之后A隐藏了 所以这个时候应该释放掉中的内容, 可是应该怎么释放呢? |
|
#140分 |
用TextureView + MediaPlayer实现,本身性能没有问题,看一下你的代码吧,可能是有的地方没写好
|
#2 |
回复1楼: 我知道是有些地方没写好,但是还没有找到原因啊,第一次接触多媒体类的开发,有点晕啊,请问您做过类似的么? public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub View firstItem = views.get(Integer .valueOf(firstVisibleIndex)); View firstItem1 = views.get(Integer .valueOf(firstVisibleIndex)+1); if (scrollState == SCROLL_STATE_IDLE) { if (firstItem != null) { int[] location = new int[2]; firstItem.getLocationOnScreen(location); int x = location[0]; int y = location[1]; System.out.println("====== x: " + x + " y:" + y); com.weishi.view.VideoPlayTextureView textureView = (VideoPlayTextureView) firstItem.findViewById(R.id.videoview); ProgressBar loading=(ProgressBar) firstItem.findViewById(R.id.loading); ImageView video=(ImageView) firstItem.findViewById(R.id.video_cover_default); ImageView videoPlay=(ImageView) firstItem.findViewById(R.id.play_controller); if (textureView.isAvailable()) { textureView.prepare(list.get(3));//后续处理,标记 loading.setVisibility(View.GONE); Log.e("position2", "______________+++++++"+Integer.valueOf(firstVisibleIndex)); video.setVisibility(View.GONE); if (textureView.getMediaState()==MediaState.PLAY) { }else { textureView.play(); } } |
#3 |
quote]
textureView.setSurfaceTextureListener(new SurfaceTextureListener() { @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { // TODO Auto-generated method stub } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { // TODO Auto-generated method stub } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { // TODO Auto-generated method stub return false; } @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { // TODO Auto-generated method stub textureView.prepare(list.get(3)); textureView.play();; } }); [/code] 这里的回调为什么接收不到呢? |
#4 |
楼主现在开发的怎么样了,我现在一个项目也是类似需求,也用了TextureView放在listView的item里面,但是TextureView好像没有加载,onSurfaceTextureAvailable方法触发不了,楼主找到原因了么。
|
#5 |
回复4楼: 我的大致功能实现了。TextureView要在一定条件下去展示;例如 if (textureView.isAvailable()) { textureView.prepare(getPath(FileName)); loading.setVisibility(View.GONE); video.setVisibility(View.GONE); textureView.getMediaPlayer().setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { Log.e("加入的mediaplayer","位置" + 0 + "mediaplayer"+ textureView.getMediaPlayer()); textureView.play(); videoPlay.setVisibility(View.GONE); } }); |