Нет видео (только звук) на 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 с той же модификацией, и теперь все в порядке...

Я не уверен, почему это произошло (если кто-то знает ответ, не стесняйтесь комментировать, чтобы мы могли чему-то научиться из этого), но я просто рад, что это сработало:)

Другие вопросы по тегам