Android viewpager TextureView inside viewPager上无视频(仅声音)

Android viewpager TextureView inside viewPager上无视频(仅声音),android-viewpager,textureview,Android Viewpager,Textureview,我试图在viewpager中显示视频或图像,它是listview的一项。 当图像正确显示时,视频只播放声音,没有视频。 我尝试过使用VideoView和SurfaceView,但没有成功。 我不想用碎片来做这个 在listview中,出于测试原因,我加载了一组图像和一个视频。 图像加载良好,但视频仅播放声音 我认为这与它没有正确设置其表面结构有关,但我无法理解 任何帮助都将不胜感激 这是我的密码: public class MediaSliderPagerAdapter2 extends Pag

我试图在viewpager中显示视频或图像,它是listview的一项。 当图像正确显示时,视频只播放声音,没有视频。 我尝试过使用VideoView和SurfaceView,但没有成功。 我不想用碎片来做这个

在listview中,出于测试原因,我加载了一组图像和一个视频。 图像加载良好,但视频仅播放声音

我认为这与它没有正确设置其表面结构有关,但我无法理解

任何帮助都将不胜感激

这是我的密码:

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>

@fadden:谢谢您的帮助,但我的SquareTextureView自定义视图出现了问题:

我已将onMeasure函数更改为:

@Override
protected void onMeasure(int width, int height) {
    super.onMeasure(width, height);
    int measuredWidth = getMeasuredWidth();
    setMeasuredDimension(measuredWidth, measuredWidth);
}
我认为这是问题的根源

我用同样的修改创建了一个SquareFrameLayout自定义视图,现在可以了


我不知道为什么会发生这种情况(如果有人知道答案,请随意评论,这样我们可以从中学习一些东西),但我很高兴它起了作用:)

如果您对视频播放代码进行评论,然后用画布渲染到TextureView上,您看到了什么吗?这将告诉您问题是与视频渲染有关还是与TextureView的显示有关。