Articles of camera

如何使用OpenGLES 2.0实时在libgdx中在背景上渲染Android的YUV-NV21相机图像?

与Android不同,我对GL / libgdx相对较新。 我需要解决的任务,即将Android相机的YUV-NV21预览图像实时渲染到libgdx内部的屏幕背景是多方面的。 以下是主要关注点: Android相机的预览图像仅保证在YUV-NV21空间中(在类似的YV12空间中,U和V通道不交错但分组)。 假设大多数现代设备提供隐式RGB转换是非常错误的,例如最新的Samsung Note 10.1 2014版本仅提供YUV格式。 由于除非是RGB格式,否则无法在OpenGL中向屏幕绘制任何内容,因此必须以某种方式转换颜色空间。 libgdx文档( 集成libgdx和设备摄像头 )中的示例使用Android表面视图,该视图位于使用GLES 1.1绘制图像的所有内容之下。 自2014年3月初以来,由于过时而且几乎所有设备都支持GLES 2.0,因此从libgdx中删除了OpenGLES 1.x支持。 如果使用GLES 2.0尝试相同的样本,则在图像上绘制的3D对象将是半透明的。 由于后面的表面与GL无关,因此无法真正控制。 禁用BLENDING / TRANSLUCENCY不起作用。 因此,渲染此图像必须完全在GL中完成。 这必须是实时完成的,因此色彩空间转换必须非常快。 使用Android位图的软件转换可能会太慢。 作为侧面function,必须可以从Android代码访问摄像机图像,以执行除在屏幕上绘制之外的其他任务,例如通过JNI将其发送到本机image processing器。 问题是,如何正确地尽快完成这项任务?

使用RTP从Android到PC的相机流媒体

我想编写一个Android应用程序,用于将相机流式传输到PC(H.263,MPEG_4)。 我发现了一些库:sipandroid,jlibrtp。 SIPandroid:RTP数据包是流式传输的(wireshark在PC上很好地捕获它),但是VLC无法播放它。 Jlibrtp:API很阴暗,使用VLC无法正确播放流。 可能是对这些库进行了一些调整(使其适用于相机流),还是有一些其他库具有干净的API和样本? 感谢您的回答。

如何使用JNI在C中获取原始Android相机缓冲区?

我一直在搜索谷歌和StackOverflow,但无法find它。 也许我错过了一些明显的东西。 谢谢! (这是因为预览回调的Java实现[甚至使用缓冲区]效率太低。)

使用由Camera预览填充的SurfaceTexture作为在Jelly Bean中的Renderscriptinput分配

在Jelly Bean中,是否可以从由相机预览填充的SurfaceTexture中创buildRenderscript分配? 我正在从Android源代码树中构build我的应用程序,所以我可以使用@Hide API(如Allocation.setSurfaceTexture())。 不过,我想避免使用RS Graphics弃用的API。 这里的类似问题没有得到充分的回答,也不是JB特有的。 尝试下面的代码时遇到以下问题: 进入Renderscript的数据总是为零 为了让onFrameAvailablecallback被重复调用,我必须updateTexImage(),因为当我调用Allocation.ioReceive()时,它不会在第一次之后被callback,并且在logcat中有一个“无效的EGLDisplay”。 然而,我认为ioReceive()是要走的路 – 它在内部也updateTexImage()。 支持的分配types包括RGBA8888,而不是NV21(这是相机预览格式),RS代码如何能够以这种方式对数据进行格式化? (我知道我正在使用的设备确实支持请求的VGA分辨率)。 public class SampleRSCPCActivity extends Activity implements SurfaceTexture.OnFrameAvailableListener { final static int DO_KERNEL = 0; private static final String TAG="SAMPLERSCP"; private static Camera mCamera; private Camera.Parameters mParams; private int mFrameWidth, mFrameHeight; private static SurfaceTexture mST; private RenderScript mRS; private Allocation mInAllocation; […]

Nexus 10,前置摄像头预览为黑色(无预览)

所以我正在做一个Camera相关的项目,我已经在很多设备上testing过了,除了Nexus 10之外,他们都通过了testing。 我无法弄清楚发生了什么,也没有人在网上讨论这个问题。 我能够在两个不同的Nexus 10(wifi)设备上复制这个问题。 这是我的活动的代码: public class MainActivity extends Activity { private static Camera mCamera; private static boolean mCameraOpen; private static ImageView mPreviewImageView; private SurfaceView mPreviewSurfaceView; private static boolean mPreviewRunning; private static Handler mHandler; private static int TESTS_COUNT = 0; private Camera.Parameters mCameraParameters; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mHandler = new […]

来自Android camera2 API的图像数据在Galaxy S5上翻转和挤压

我正在实施一个应用程序,使用相机的实时图像进行实时image processing。 这是工作,有限制,使用现在弃用的android.hardware.Camera; 改善灵活性和性能我想使用新的android.hardware.camera2 API。 我无法获得原始图像数据进行处理。 这是在三星Galaxy S5上。 (不幸的是,我没有另一个棒棒糖设备,方便在其他硬件上testing)。 我得到了总体框架(从“HdrViewFinder”和“Camera2Basic”样本中获得灵感),实时图像通过SurfaceTexture和GLSurfaceView绘制在屏幕上。 但是,我还需要访问图像数据(至less目前灰度级是很好的)用于定制image processing。 根据StreamConfigurationMap.isOutputSupportedFor(class)的文档,直接获取图像数据的推荐表面是ImageReader (正确的?)。 所以我设置了我的捕获请求: mSurfaceTexture.setDefaultBufferSize(640, 480); mSurface = new Surface(surfaceTexture); … mImageReader = ImageReader.newInstance(640, 480, format, 2); … List<Surface> surfaces = new ArrayList<Surface>(); surfaces.add(mSurface); surfaces.add(mImageReader.getSurface()); … mCameraDevice.createCaptureSession(surfaces, mCameraSessionListener, mCameraHandler); 并在ImageReader的onImageAvailablecallback中,我正在访问数据,如下所示: Image img = reader.acquireLatestImage(); ByteBuffer grayscalePixelsDirectByteBuffer = img.getPlanes()[0].getBuffer(); …但是(如上所述)实时图像预览正在工作,我得到的数据(或我的方式)出现问题。 根据 mCameraInfo.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputFormats(); …应支持以下ImageFormats:NV21,JPEG,YV12,YUV_420_888。 我已经尝试了所有(插入上面的'格式'),都支持根据getOutputSizes(format)的设置分辨率,但没有一个给出了所需的结果: NV21:ImageReader.newInstance抛出java.lang.IllegalArgumentException:不支持NV21格式 […]

手动对焦在camera2,android

我正在寻找在android2中的camera2手动对焦的例子。 我试图得到下面显示的最小焦距和可用焦距,但没有帮助。 如何控制焦距? float minimumLens = characteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE); float[] lensDistances = characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);&nbsp; 我需要用seekbar来控制它。 提前致谢。

如何确定相机预览帧的默认方向?

我正在尝试(再次)创build适用于所有场景的相机预览逻辑: 任何设备:手机,平板电脑,烤面包机,无论如何 任何相机:前置,后置,侧面,面向狗,不pipe android.hardware.Camera和android.hardware.camera2 肖像和风景设备的方向 由于我的minSdkVersion是15,因为我不是特别关心性能,我正在尝试使用一个TextureView 。 而且,按照fadden的build议在这里和这里这样的地方,我想用一个合适的Matrix在该TextureView上使用setTransform() : 正确定位预览,将设备方向考虑在内 以TextureView纵横比与预览帧长宽比不匹配的代价来完全填充TextureView 不会拉伸图像,以便预览正方形项目(例如,3英寸正方形的便笺本)在预览中显示为正方形 在我的情况下, TextureView填充屏幕,减去状态栏和导航栏。 从Grafika的PlayMovieActivity.java的adjustAspectRatio() PlayMovieActivity.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 […]

将Android camera2 api YUV_420_888转换为RGB

我正在编写一个应用程序,需要摄像头的饲料,将其转换为rgb,以便做一些处理。 它在使用NV21 Yuv格式的旧相机实现方面效果很好。 我遇到的问题是新的Yuv格式,YUV_420_888。 在新的Camera2 Api中,图像不再正确转换为RGB,而是发送YUV_420_888 yuv格式而不是NV21(YUV_420_SP)格式。 有人可以告诉我如何将YUV_420_888转换为RGB? 谢谢

Android camera2捕捉突发太慢

我正在尝试修改android-Camera2Basic代码来捕获一连串的图片。 不过,在我运行L 5.0.1的Nexus 5上,我无法获得比图片之间的延迟快200-300毫秒的延迟。 我尝试了一堆东西,但这是最基本的。 这是我修改的Camera2Basic代码的唯一部分。 我的预览纹理视图只有50x50dp,但没关系,对不对? 值得一提的是,这个代码在我的Nexus 6上只有50-100ms左右的延迟,L 5.1。 private void captureStillPicture() { try { List<CaptureRequest> captureList = new ArrayList<CaptureRequest>(); mPreviewRequestBuilder.addTarget(mImageReader.getSurface()); for (int i=0;i<10;i++) { captureList.add(mPreviewRequestBuilder.build()); } mCaptureSession.stopRepeating(); mCaptureSession.captureBurst(captureList, cameraCaptureCallback, null); mPreviewRequestBuilder.removeTarget(mImageReader.getSurface()); } catch (CameraAccessException e) { e.printStackTrace(); } } CameraCaptureSession.CaptureCallback cameraCaptureCallback = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult […]