1
listview의 항목 인 뷰 페이지 내에 비디오 또는 이미지를 표시하려고합니다. 이미지가 올바르게 표시되는 동안 비디오는 비디오없이 소리 만 재생합니다. VideoView와 SurfaceView를 사용해 보았습니다. 나는 이것을 위해 조각을 사용하지 않을 것이다.viewPager 내의 TextureView에 비디오가 없음 (소리 만)
listview에서 테스트 용으로 여러 이미지와 단일 비디오를로드하고 있습니다. 이미지가 잘로드되지만 비디오는 사운드 만 재생합니다.
나는 그것이 surfaceTexture를 올바르게 설정하지 않는 것과 관련이 있다고 생각하지만 그 사실을 이해할 수 없다.
도움이 될 것입니다. 또한
public class MediaSliderPagerAdapter2 extends PagerAdapter {
private int forListItem = -1;
private LayoutInflater inflater;
private MediaPlayer mMediaPlayer;
private SurfaceTexture mVideoSurfaceTexture;
public MediaSliderPagerAdapter2(int forListItem, LayoutInflater inflater) {
super();
this.forListItem = forListItem;
this.inflater = inflater;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
boolean isVideo = false;
String url = "";
try {
isVideo = mMediaUrls.get(forListItem).get(position).isVideo;
url = mMediaUrls.get(forListItem).get(position).url;
}
catch (Exception e) {
Log.e("getUrlType", e.getMessage());
}
if(!url.equals("")){
if(isVideo) {
final View layoutAll = inflater.inflate(R.layout.fragment_pager_video, container, false);
layoutAll.setId(R.id.feedlist_viewpager_layout_id_base + (position+1)*(1000*forListItem+1));
container.addView(layoutAll);
final TextureView layout = (TextureView) layoutAll.findViewById(R.id.videoView_layout);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
layout.setBackgroundResource(android.R.color.transparent);
layoutAll.setBackgroundResource(android.R.color.transparent);
layout.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
Surface s = new Surface(surface);
mVideoSurfaceTexture = surface;
Log.i("height-width:", height+"-"+width);
try {
mMediaPlayer.setSurface(s);
mMediaPlayer.setDataSource("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
mMediaPlayer.prepareAsync();
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
MediaController mediaController = new MediaController(mContext);
mediaController.setAnchorView(layout);
mediaController.setMediaPlayer(new MediaController.MediaPlayerControl() {
@Override
public void start() {
mMediaPlayer.start();
}
@Override
public void pause() {
mMediaPlayer.pause();
}
@Override
public int getDuration() {
return mMediaPlayer.getDuration();
}
@Override
public int getCurrentPosition() {
return mMediaPlayer.getCurrentPosition();
}
@Override
public void seekTo(int pos) {
mMediaPlayer.seekTo(pos);
}
@Override
public boolean isPlaying() {
return mMediaPlayer.isPlaying();
}
@Override
public int getBufferPercentage() {
return 0;
}
@Override
public boolean canPause() {
return true;
}
@Override
public boolean canSeekBackward() {
return true;
}
@Override
public boolean canSeekForward() {
return true;
}
@Override
public int getAudioSessionId() {
return mMediaPlayer.getAudioSessionId();
}
});
mediaController.show(99999);
Log.i("VideoView", "Duration = " + mMediaPlayer.getDuration() + " height-width:" + layout.getHeight() + "-" + layout.getWidth());
mMediaPlayer.start();
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
Log.e("SurfaceSizeChanged", width+"/"+height);
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
boolean isNull = surface==null;
Log.e("onSurfaceTextureUpdated", "isNull: "+ isNull);
}
});
return layoutAll.getId();
}
else {
final ImageView layout = (ImageView) inflater.inflate(R.layout.fragment_pager_image, null);
layout.setId(R.id.feedlist_viewpager_layout_id_base + (position+1)*(1000*forListItem+1));
layout.setImageBitmap(null);
layout.clearAnimation();
Ion.with(mContext)
.load(url)
.withBitmap()
.smartSize(true)
.disableFadeIn()
.animateIn(R.anim.fade_in_)
.error(R.drawable.ic_launcher)
.placeholder(R.drawable.loading)
.animateLoad(R.anim.spin_animation)
.intoImageView(layout);
container.addView(layout);
return layout.getId();
}
}
return null;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
View view = container.findViewById((Integer) object);
if(view instanceof ImageView) {
((ImageView) view).setImageBitmap(null);
view.clearAnimation();
}
else if(view instanceof FrameLayout) {
}
container.removeView(view);
}
@Override
public int getCount() {
int ret = 0;
if(mMediaUrls.get(forListItem)!= null)
ret = mMediaUrls.get(forListItem).size();
return ret;
}
@Override
public boolean isViewFromObject(View view, Object obj) {
boolean isEqual = view.getId() == (Integer) obj;
return isEqual;
}
}
의 XML :
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0000">
<com.camboindustries.picabet.adapters.SquareTextureView
android:id="@+id/videoView_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0000">
</com.camboindustries.picabet.adapters.SquareTextureView>
</FrameLayout>
비디오 재생 코드를 주석 처리하고 캔버스가있는 TextureView에 렌더링하면 아무 것도 보이지 않습니까? 그러면 비디오 렌더링이나 TextureView 디스플레이에 문제가 있는지를 알 수 있습니다. – fadden