解决 GSYVideoPlayer 连续切换视频 出现黑屏只有声音没有画面的问题
2024-01-02 11:35:19
问题描述
如果这个播放器用来recycleView中,实现类似抖音的效果,会发现刷了一段时间,会出现只有声音没有画面的情况。这个时候是因为surface没有创建(具体原因未知)。GSYTextureView中的onSurfaceTextureAvailable方法没有回调。
其他人也遇到过
GSYTextureRenderView onSurfaceAvailable 不调用(已添加硬件加速) #1740
解决方案
如果发现surface没有创建成功就手动调用。继承StandardGSYVideoPlayer 重写以下四个方法
public class TRSVideoPlayer extends StandardGSYVideoPlayer {
boolean isSurfaceAvailable;
@Override
protected void setProgressAndTime(int progress, int secProgress, int currentTime, int totalTime, boolean forceChange) {
super.setProgressAndTime(progress, secProgress, currentTime, totalTime, forceChange);
//以下代码要解决的问题是,如果这个播放器用来recycleView中,实现类似抖音的效果
//会发现刷了一段时间,会出现只有声音没有画面的情况。这个时候是因为surface没有创建(具体原因未知)
//通过调用requestLayout可以创建surface。但是只在当前控件上调用requestLayout不起作用
//需要一直往上调用。
if (getCurrentState() == CURRENT_STATE_PLAYING || getCurrentState() == CURRENT_STATE_PLAYING_BUFFERING_START) {
if (!isSurfaceAvailable) {
Debuger.printfLog("VideoView 播放器缓冲中 isAddRenderView " + isSurfaceAvailable + " 当前播放器状态 " + getCurrentState());
try {
requestLayoutLoop(this);
} catch (Exception | OutOfMemoryError e) {
onCompletion();
}
return;
}
}
}
//一直循环向上调用。
private void requestLayoutLoop(Object obj){
if(obj==null){
return;
}
if(!(obj instanceof View)){
return;
}
View view= (View) obj;
view.requestLayout();
requestLayoutLoop(view.getParent());
}
@Override
protected void addTextureView() {
super.addTextureView();
//每次添加TextrueView就重置状态
isSurfaceAvailable = false;
}
@Override
public void onSurfaceAvailable(Surface surface) {
super.onSurfaceAvailable(surface);
isSurfaceAvailable = true;
}
}
文章来源:https://blog.csdn.net/qq_22706515/article/details/135296398
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!