用于Camera2 API的Google官方示例之一遇到了与以下BufferQueue has been abandoned问题相同的问题:
具体地,示例应用程序调用closeCamera()从方法onPause()的片段,其中的closeCamera()呼叫close()在CameraCaptureSession,然后close()在CameraDevice,然后close()在ImageReader(用于实际拍照).在close()开启之后,LogCat中出现CameraDevice了几次上述BufferQueue has been abandoned消息,尽管我只在某些Android 5.1硬件(Nexus 4和Nexus 7 2013)上获得了消息,而在其他(Nexus 5和Nexus 6)上却没有.
fadden对此的评论是:
如果在进入onPause()之前关闭了消费者端,则会出现消息.
什么时候TextureView"消费者"将被关闭,为什么呢?
谷歌的示例代码没有主动做任何事情来关闭TextureView我能看到的东西.并且,由于TextureView在暂停时仍然可以看到,我原本预计"消费者方面"不会受到影响onPause(),但可能在之后onStop().
虽然我意识到这条消息(尽管是一个错误)是良性的,但我正在试图弄清楚如何摆脱它,如果没有其他原因,只是为了防止我一次又一次地被问到为什么我的代码记录这个错误.我希望通过更多地了解这个"消费者方面",我可以弄清楚当用户退出使用Camera2的活动或片段并避免此错误时,如何更好地整理.
我正试图在Android上播放视频TextureView.关于视频任务运作良好.但MediaPlayer.prepare();需要一些时间.所以我想在那个时候展示一些占位符.我试图用Glide这样做:
public static final Rect rc = new Rect();
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int w, int h) {
Surface s = new Surface(surfaceTexture);
Glide.with(mTextureView.getContext())
.load(thumbUrl)
.asBitmap()
.dontAnimate()
.centerCrop()
.into(new SimpleTarget<Bitmap>(w, h) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
rc.set(0,0,w,h);
Canvas c = mTextureView.lockCanvas(rc);
if (c == null)
return;
c.drawBitmap(resource, 0, 0, null);
mTextureView.unlockCanvasAndPost(c);
}
});
try {
mMediaPlayer.setDataSource(url);
mMediaPlayer.setSurface(s);
mMediaPlayer.prepareAsync();
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mMediaPlayer.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
mMediaPlayer.setVolume(0,0);
mMediaPlayer.start();
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用简单的SurfaceView使新的Camera2工作,我在实时预览中遇到了一些问题.在某些设备上,图像会按比例拉伸,而在其他设备上看起来很好.
我已经设置了一个SurfaceView,我以编程方式调整以适应预览流大小的大小.
在Nexus 5上,这看起来不错,但一台三星设备就此消失了.此外,三星设备在预览的右侧部分有黑色边框.
是否真的无法使用SurfaceView,或者是时候切换到TextureView了?
每次我暂停我的活动(实际上是碎片)去另一个应用程序,返回onResume我尝试恢复视频播放,但它不播放:我得到一个空白的屏幕.经过调查,我在Logcat中看到以下内容
E/BufferQueueProducer: [unnamed-23827-0] queueBuffer: BufferQueue has been abandoned
E/MediaPlayer: error (1, -38)
E/MediaPlayer: error (1, -38)
E/MediaPlayer: error (1, -38)
E/MediaPlayer: error (1, -38)
E/BufferQueueProducer: [unnamed-23827-0] connect(P): BufferQueue has been abandoned
Run Code Online (Sandbox Code Playgroud)
这是我在简历中调用的代码
player.seekTo(mVideoSeekPosition);
player.start();
Run Code Online (Sandbox Code Playgroud)
仅供参考:我一直试图将这个答案应用到我的案例中,但我不能:当BufferQueue被放弃后我该怎么办?
UPDATE
我挣扎着独自一人,但我仍在崩溃.所以我发布了整个代码以寻求帮助
private void setupVideoPlayingSystem(View root) {
textureView = (TextureView) root.findViewById(R.id.textureView);?
textureView.setSurfaceTextureListener(this);
}? ? ?
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
Log.d(TAG, "onSurfaceTextureAvailable");
if (null == surface) {
Log.d(TAG, "new surface");
surface = new Surface(surfaceTexture);
mediaPlayer = new MediaPlayer();
mediaPlayer.setSurface(surface); …Run Code Online (Sandbox Code Playgroud) 我想在我的应用程序中加入一个相机功能,这将允许视图本身的布局过渡,更改其大小,预览大小和有效处理方向更改.我应该使用TextureView或SurfaceView?
决定决定..
我正在尝试在视频上使用TextureView,并且在尝试使用SurfaceTexture.detachFromGLContext时崩溃了很多.
我没有在Google上找到任何东西,有没有人知道它可能是什么?
谢谢
java.lang.RuntimeException: Error during detachFromGLContext (see logcat for details)
at android.graphics.SurfaceTexture.detachFromGLContext(SurfaceTexture.java:195)
at android.view.TextureView.destroySurface(TextureView.java:243)
at android.view.TextureView.destroyHardwareResources(TextureView.java:355)
at android.view.HardwareRenderer$Gl20Renderer.destroyResources(HardwareRenderer.java:2311)
at android.view.HardwareRenderer$Gl20Renderer.destroyResources(HardwareRenderer.java:2318)
at android.view.HardwareRenderer$Gl20Renderer.destroyResources(HardwareRenderer.java:2318)
at android.view.HardwareRenderer$Gl20Renderer.destroyResources(HardwareRenderer.java:2318)
at android.view.HardwareRenderer$Gl20Renderer.destroyResources(HardwareRenderer.java:2318)
at android.view.HardwareRenderer$Gl20Renderer.destroyResources(HardwareRenderer.java:2318)
at android.view.HardwareRenderer$Gl20Renderer.destroyResources(HardwareRenderer.java:2318)
at android.view.HardwareRenderer$Gl20Renderer.destroyResources(HardwareRenderer.java:2318)
at android.view.HardwareRenderer$Gl20Renderer.destroyResources(HardwareRenderer.java:2318)
at android.view.HardwareRenderer$Gl20Renderer.access$800(HardwareRenderer.java:1895)
at android.view.HardwareRenderer$Gl20Renderer$2.run(HardwareRenderer.java:2303)
at android.view.HardwareRenderer$Gl20Renderer.safelyRun(HardwareRenderer.java:2254)
at android.view.HardwareRenderer$Gl20Renderer.destroyHardwareResources(HardwareRenderer.java:2297)
at android.view.ViewRootImpl.destroyHardwareResources(ViewRootImpl.java:853)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1534)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1249)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6585)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
at android.view.Choreographer.doCallbacks(Choreographer.java:603)
at android.view.Choreographer.doFrame(Choreographer.java:573)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5586)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at dalvik.system.NativeStart.main(NativeStart.java)
Run Code Online (Sandbox Code Playgroud) 我正在尝试(再次)创建实际上正常工作的相机预览逻辑,适用于所有场景:
android.hardware.Camera 和 android.hardware.camera2因为我minSdkVersion15岁,因为我并不特别关心表现,所以我试图用一个TextureView.并且,根据fadden在这里和这里的地方的建议,我试图setTransform()在TextureView适当的情况下使用Matrix它:
TextureView完全填充,以TextureView纵横比与预览帧宽高比不匹配的裁剪为代价在我的情况下,TextureView填充屏幕,减去状态栏和导航栏.
adjustAspectRatio()从GrafikaPlayMovieActivity.java开始,我现在有:
private void adjustAspectRatio(int videoWidth, int videoHeight,
int rotation) {
if (iCanHazPhone) {
int temp=videoWidth;
videoWidth=videoHeight;
videoHeight=temp;
}
int viewWidth=getWidth();
int viewHeight=getHeight();
double aspectRatio=(double)videoHeight/(double)videoWidth;
int newWidth, newHeight;
if (getHeight()>(int)(viewWidth*aspectRatio)) {
newWidth=(int)(viewHeight/aspectRatio);
newHeight=viewHeight;
}
else {
newWidth=viewWidth;
newHeight=(int)(viewWidth*aspectRatio);
}
int xoff=(viewWidth-newWidth)/2;
int yoff=(viewHeight-newHeight)/2;
Matrix …Run Code Online (Sandbox Code Playgroud) 我TextureView在我的代码中设置了一个SurfaceTextureListener.
在Android 6.0上,每当我离开活动并在Android 7.0上返回(分别)时都会调用这些方法onSurfaceTextureDestroyed,onSurfaceTextureAvailable我注意到onSurfaceTextureAvailable在创建Activity之后只调用一次.
每当我离开活动并返回时,表面不会被破坏和重新创建,就像我以前从Android 6.0那样.
经过一些调查后,我注意到API 18,19,24表现一种方式,API 20-23表现为另一种方式.
知道为什么,主要是如何使它在所有Android版本上表现相同?
我正在尝试在Google Glass中显示实时相机预览.
我正在使用所有相机默认设置(并且还尝试使用一些不同的图像格式;理想情况下,我可以使用其中一种YUV格式),但显示屏中显示的图像是乱码,如下所示:

布局很简单:
<?xml version="1.0" encoding="utf-8"?>
<TextureView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scan_preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
Run Code Online (Sandbox Code Playgroud)
这是活动代码:
public class ScanActivity extends Activity {
private static final String kTag = ScanActivity.class.getSimpleName();
private TextureView mVideoCaptureView = null;
private Camera mCamera = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
setTitle(R.string.title_scan);
mVideoCaptureView = (TextureView) findViewById(R.id.scan_preview);
mVideoCaptureView.setKeepScreenOn(true);
mVideoCaptureView.setSurfaceTextureListener(new VideoCaptureTextureListener());
}
@Override
protected void onPause() {
super.onPause();
stopVideo();
}
@Override
protected void onResume() {
super.onResume();
startVideo();
}
private void startVideo() {
if (mCamera != null) {
mCamera.release(); …Run Code Online (Sandbox Code Playgroud) 我已经实现了使用纹理视图和媒体播放器实现的视频播放器的回收器视图。
如果我向下滚动列表,我可以单击该项目并播放视频。但是,对于回收器视图,一旦视图离开屏幕,它就会被回收以供重用。如果我向上滚动,所有视图现在都是空白(黑色)。
我希望添加功能,当用户将视频滚动到屏幕外时,它将暂停并保持对该视频的引用,以便如果他们滚动回该视频,它将从该点开始播放。
我已签这个了,但是我不想下载的视频,我只是想流。我不是在找人为我做这件事,我只是在寻找一些指示,并希望有人可以分享他们的知识......在此先感谢
这是我到目前为止所做的:
视频播放器
public class CustomVideoPlayer implements TextureView.SurfaceTextureListener, VideoControllerView.MediaPlayerControl, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnVideoSizeChangedListener {
private Context mContext;
private String mUrl;
private MediaPlayer mMediaPlayer;
private Surface mSurface;
private VideoControllerView mControllerView;
private TextureView mTextureView;
private CardView mCardView;
private ProgressBar mProgress;
private FrameLayout mView;
private RelativeLayout mLayout;
public CustomVideoPlayer(Context ctx, TextureView view, ProgressBar progressDialog, FrameLayout holderView){
this.mContext = ctx;
mTextureView = view;
mTextureView.setSurfaceTextureListener(this);
mProgress = progressDialog;
mControllerView = new VideoControllerView(ctx);
mView = holderView;
mTextureView.setOnTouchListener(new ControlTouchListener());
}
@Override
public …Run Code Online (Sandbox Code Playgroud) android android-mediaplayer textureview android-textureview android-recyclerview
android ×10
textureview ×10
surfaceview ×3
bitmap ×1
google-gdk ×1
google-glass ×1
opengl-es ×1
video ×1