Ijkplayer: 在播放界面切换新的播放地址播放后,画面不更新

Created on 6 Mar 2017  ·  14Comments  ·  Source: bilibili/ijkplayer

使用TextureRenderView,在播放的时候,切换新的播放地址后,画面不更新了,仍是之前的地址的视频画面,用SurfaceRenderView是正常的,这个问题怎么解决呢?
E/BufferQueueProducer: [SurfaceTexture-0-17747-0] connect: already connected (cur=2 req=2)
E/IJKMEDIA: SDL_Android_NativeWindow_display_l: ANativeWindow_lock: failed -22

Most helpful comment

@xsfgdut 建议你认真阅读一下demo

class IjkVideoView

public void setRender(int render) {
        switch (render) {
            case RENDER_NONE:
                setRenderView(null);
                break;
            case RENDER_TEXTURE_VIEW: {
                TextureRenderView renderView = new TextureRenderView(getContext());
                if (mMediaPlayer != null) {
                    renderView.getSurfaceHolder().bindToMediaPlayer(mMediaPlayer);
                    renderView.setVideoSize(mMediaPlayer.getVideoWidth(), mMediaPlayer.getVideoHeight());
                    renderView.setVideoSampleAspectRatio(mMediaPlayer.getVideoSarNum(), mMediaPlayer.getVideoSarDen());
                    renderView.setAspectRatio(mCurrentAspectRatio);
                }
                setRenderView(renderView);
                break;
            }
            case RENDER_SURFACE_VIEW: {
                SurfaceRenderView renderView = new SurfaceRenderView(getContext());
                setRenderView(renderView);
                break;
            }
            default:
                Log.e(TAG, String.format(Locale.getDefault(), "invalid render %d\n", render));
                break;
        }
    }

在合适的情况下重新创建renderView,不要无意义的重复创建

All 14 comments

切换播放地址,需要重新构建播放器

2017-03-06 11:52 GMT+08:00 JoyHong notifications@github.com:

使用TextureRenderView,在播放的时候,切换新的播放地址后,画面不更新了,仍是之前的地址的视频画面,这个问题怎么解决呢?
03-06 03:48:09.582 17747-17984/com.zdy.tv E/BufferQueueProducer:
[SurfaceTexture-0-17747-0] connect: already connected (cur=2 req=2)
03-06 03:48:09.582 17747-17984/com.zdy.tv E/IJKMEDIA:
SDL_Android_NativeWindow_display_l: ANativeWindow_lock: failed -22


You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/Bilibili/ijkplayer/issues/2786, or mute the thread
https://github.com/notifications/unsubscribe-auth/AEOmlhYL9h9iavfaxsrj3ICnt7q4js5Fks5ri4MBgaJpZM4MTsrk
.

我这边每次是
先调用setRenderView(null);
然后调用setRender(RENDER_TEXTURE_VIEW);
最后调用setVideoURI();
只有第一次是成功的,后面都是失败的

我自己解决了,方案如下:
就是动态添加IjkVideoView控件,当切换视频地址时,动态remove该控件,然后再动态添加一个新的控件。
如果有更好的解决方案,望告知,谢谢

有没好更好点的解决办法?每次remove不太好吧

@JoyHong 你是用什么动态添加IjkVideoView的?

@Tipsyume
release (remove old one )and renew it (add to a new view)

@xinzhengzhang 这样切换频繁时有点卡顿 代码如下:
if (videoView != null && videoView.isPlaying()) {
videoView.stopPlayback();
videoView.release(true);
contener.removeView(videoView);
}
videoView = new IjkVideoView(this);
videoView.setMediaCodec(true);

@JoyHong 请问下在播放界面切换新的播放地址播放后,画面不更新这个问题你是如何解决的,不用remove()ijkVideoView的话是如何解决的

@JoyHong @xinzhengzhang @Tipsyume @mouseOf2ch 切换的时候重新创建TextureView即可

private void setVideoURI(Uri uri, Map headers) {
if (mUri == uri) {
return;
}
mUri = uri;
mHeaders = headers;
mSeekWhenPrepared = 0;
setRenderView(createRenderView(mRenderViewType)); //多这一句
openVideo();
requestLayout();
invalidate();
}

this will be ok using mediaCodec

做个总结:
在使用硬解或者是SurfaceView时不会发生,
在使用软解且使用TextureView,重新创建MediaPlayer进行绑定时,TextureView被占用,会提示

already connected
ANativeWindow_lock: failed -22

解决办法:
在相应的情况下重新创建RenderView与对应的MediaPlayer绑定即可

@haohaozaici
already connected
ANativeWindow_lock: failed -22
这个问题最终是什么解决的呢?如何重新创建RenderView?
谢谢!

@xsfgdut 建议你认真阅读一下demo

class IjkVideoView

public void setRender(int render) {
        switch (render) {
            case RENDER_NONE:
                setRenderView(null);
                break;
            case RENDER_TEXTURE_VIEW: {
                TextureRenderView renderView = new TextureRenderView(getContext());
                if (mMediaPlayer != null) {
                    renderView.getSurfaceHolder().bindToMediaPlayer(mMediaPlayer);
                    renderView.setVideoSize(mMediaPlayer.getVideoWidth(), mMediaPlayer.getVideoHeight());
                    renderView.setVideoSampleAspectRatio(mMediaPlayer.getVideoSarNum(), mMediaPlayer.getVideoSarDen());
                    renderView.setAspectRatio(mCurrentAspectRatio);
                }
                setRenderView(renderView);
                break;
            }
            case RENDER_SURFACE_VIEW: {
                SurfaceRenderView renderView = new SurfaceRenderView(getContext());
                setRenderView(renderView);
                break;
            }
            default:
                Log.e(TAG, String.format(Locale.getDefault(), "invalid render %d\n", render));
                break;
        }
    }

在合适的情况下重新创建renderView,不要无意义的重复创建

@haohaozaici 谢谢你的意见,这个问题解决了。
还想请教一下,我采用ijkVideoView进行播放,需要怎么样修改底层去实现录像功能呢?以及在上层需要如何去调用?
谢谢!

Was this page helpful?
0 / 5 - 0 ratings