Нет видео (только звук) на TextureView внутри viewPager
Я пытаюсь показать видео или изображение в окне просмотра, которое является элементом списка. Пока изображение отображается правильно, видео воспроизводит только звук без видео. Я пытался использовать VideoView, а также SurfaceView без удачи. Я бы предпочел не использовать фрагменты для этого.
В списке просмотра я загружаю кучу изображений и одно видео по причинам теста. Изображения загружаются нормально, но видео воспроизводит только звук.
Я думаю, что это как-то связано с неправильной настройкой своей 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>
1 ответ
@fadden: спасибо за помощь, но это оказалось проблемой с моим пользовательским представлением SquareTextureView:
Я изменил функцию onMeasure на это:
@Override
protected void onMeasure(int width, int height) {
super.onMeasure(width, height);
int measuredWidth = getMeasuredWidth();
setMeasuredDimension(measuredWidth, measuredWidth);
}
который, я думаю, был корнем проблемы.
Я создал собственное представление SquareFrameLayout с той же модификацией, и теперь все в порядке...
Я не уверен, почему это произошло (если кто-то знает ответ, не стесняйтесь комментировать, чтобы мы могли чему-то научиться из этого), но я просто рад, что это сработало:)