textureView和mediaplayer 做类似微信首页的视频列表

Android 码拜 6年前 (2015-09-18) 696次浏览

 

项目需求是类似于微信的首页,展示一个短视频的列表通过listview 里面每个item由一个textureView作为视频播放控件,开始用的是videoview但是发现不能改变大小,滑动列表的时候会暂停播放。

所以使用textureView做,但是现在的问题是textureView加载的列表很卡,内存占用很大。不知道是不是因为每一个item的textureView使用的资源没有释放还是因为别的什么,例如当A、B、C三个条目,当滑动之后A隐藏了 所以这个时候应该释放掉中的内容, 可是应该怎么释放呢?

#1

40分

用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);
						}
					});

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明textureView和mediaplayer 做类似微信首页的视频列表
喜欢 (0)
[1034331897@qq.com]
分享 (0)