我知道这个主题已经多次出现,但是没有一个解决方案实际上似乎有效,从适用于旧相机API的答案(YUV数据来自整齐的byte []数组),通过损坏的图像,到保存JPEG全部采用RenderScript的"绿色比例"(顺便提一下,这是我目前能做的最好的).
Camera2Basic示例的方式是它只是将Type.Builder的格式设置为JPEG.这个问题(如多篇文章中所讨论的)是它减慢了相机管道的速度.YUV_420_888的工作速度要快得多.
那么,有没有人设法执行正确的YUV_420_888 - > JPEG转换?
我可以在 Android Camera2 API 中同时使用相机预览和手电筒吗?
当我尝试使用CameraManager.setTorchMode(String cameraId, boolean enabled)它时,当相机未打开时它工作正常。但是当相机打开时我尝试setTorchMode我收到这个异常:
CameraService: setTorchMode: 相机 0 的手电筒模式不可用,因为相机正在使用中
试图实现点击focus使用camera2api.
CaptureRequest.Builder afBuilder = mPreviewBuilder;
Rect newRect=new Rect(0,0,200,200);
MeteringRectangle meteringRectangle=new MeteringRectangle(newRect,METERING_WEIGHT_DONT_CARE);
MeteringRectangle[] areas = afBuilder.get(CaptureRequest.CONTROL_AF_REGIONS);
mPreviewBuilder.set(CaptureRequest.CONTROL_AF_REGIONS,areas);
mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_AUTO);
mPreviewBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), mCaptureCallback, mBackgroundHandler);
Run Code Online (Sandbox Code Playgroud)
在我的回电中,我不断陷入困境ACTIVE_SCAN并偶尔进入FOCUS_NOT_LOCKED状态.我似乎永远不会进入一个FOCUS_LOCKED状态,预览永远不会集中注意力.
使用三星星系音符3.
我正在尝试开发一款应用程序,允许我在录制视频时在视频上绘图,然后将录制内容和视频保存在一个 mp4 文件中以供以后使用。另外,我想使用camera2库,特别是我需要我的应用程序在高于API 21的设备上运行,并且我总是避免使用已弃用的库。
我尝试了很多方法来做到这一点,包括在 FFmpeg 中放置了 TextureView.getBitmap() (来自相机)的叠加层和从画布中获取的位图。它可以工作,但由于它是一个缓慢的功能,视频无法捕获足够的帧(甚至没有 25 fps),而且运行速度非常快。我希望也包括音频。
我考虑过 MediaProjection 库,但我不确定它是否可以捕获包含相机的布局和仅在其 VirtualDisplay 内的绘图,因为应用程序用户也可以在视频上添加文本,而且我不想要键盘出现。
请帮助,已经进行了一周的研究,但我发现没有什么对我有用的。
PS:如果用户按下“停止录制”按钮后包含一点处理时间,我不会有问题。
编辑:
现在,在 Eddy 的回答之后,我正在使用 Shadercam 应用程序在相机表面上绘图,因为该应用程序执行视频渲染,而要做的解决方法是将我的画布渲染为位图,然后渲染为 GL 纹理,但是我无法成功地做到这一点。我需要你们的帮助,我需要完成应用程序:S
我正在使用shadercam库(https://github.com/googlecreativelab/shadercam),并用以下代码替换了“ExampleRenderer”文件:
public class WriteDrawRenderer extends CameraRenderer
{
private float offsetR = 1f;
private float offsetG = 1f;
private float offsetB = 1f;
private float touchX = 1000000000;
private float touchY = 1000000000;
private Bitmap textBitmap;
private int textureId;
private boolean isFirstTime = true;
//creates a new canvas that will draw into a …Run Code Online (Sandbox Code Playgroud) 我正在使用Android Camera2 API拍摄应用程序的照片,但无法使闪光灯在大多数Samsung Galaxy设备(银河s6 edge,银河s7,银河j7)上正常工作。我相信我已经正确实现了闪光逻辑,因为曾经在Play商店中使用过的Google相机应用程序也表现出相同的行为。另外,银河s8似乎可以很好地与闪光灯配合使用(尽管结果肯定有不一致的照明)
银河j7的问题在于,当我使用闪光灯拍摄照片(锁定闪光灯或在需要闪光灯的场景中使用自动闪光灯)时,闪光灯将保持开启状态很长时间,预览将被锁定,然后在可能需要7秒钟才能拍摄图像,而闪光灯不是图像的一部分。
我有以下处理闪光模式的方法:
private void setAutoFlash(CaptureRequest.Builder requestBuilder)
{
switch (mFlashState)
{
case FLASH_STATE_AUTO:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
//requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
break;
case FLASH_STATE_ON:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
//requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE);
break;
case FLASH_STATE_OFF:
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
//requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
每当需要CaptureRequest.Builder时,都会调用此闪存逻辑
我读过的3条注释行是为帮助Flash对我来说正常工作而建议阅读的其他内容,但它似乎没有任何作用
三星有自己的相机API(http://developer.samsung.com/galaxy/camera),但我读到它只是Camera2的包装,我担心他们的API甚至无法解决我的问题。
附加信息:
任何有关如何完成工作闪光的帮助将不胜感激
我正在创建一个带有自定义相机的Android应用程序,我正在切换到新的camera2 API.我有一个按钮,可以在后置摄像头开启时打开和关闭闪光灯(不停止摄像头,就像任何经典的相机应用程序一样).
当我点击闪存图标时,没有任何反应,这就是logcat返回的内容:
D/ViewRootImpl: ViewPostImeInputStage processPointer 0
D/ViewRootImpl: ViewPostImeInputStage processPointer 1
Run Code Online (Sandbox Code Playgroud)
我不知道为什么它不起作用.这是代码:
我有一个RecordVideoActivity使用RecordVideoFragment.这是片段的XML部分,其中包含flash按钮代码:
<ImageButton
android:id="@+id/button_flash"
android:src="@drawable/ic_flash_off"
android:layout_alignParentLeft="true"
style="@style/actions_icons_camera"
android:onClick="actionFlash"/>
Run Code Online (Sandbox Code Playgroud)
和Java代码:
ImageButton flashButton;
private boolean hasFlash;
private boolean isFlashOn = false;
Run Code Online (Sandbox Code Playgroud)
随着onViewCreated:
@Override
public void onViewCreated(final View view, Bundle savedInstanceState) {
...
[some code]
...
// Flash on/off button
flashButton = (ImageButton) view.findViewById(R.id.button_flash);
// Listener for Flash on/off button
flashButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
actionFlash();
}
});
Run Code Online (Sandbox Code Playgroud)
这是actionFlash()函数定义:
private …Run Code Online (Sandbox Code Playgroud) API级别21引入了camera2,其中包含setRepeatingRequest和setRepeatingBurst.我在这里阅读了doc,但仍然无法理解这两者之间的区别.任何的想法?
我正在尝试创建一个实时处理相机图像并将其显示在屏幕上的应用程序。我正在使用camera2 API。我创建了一个本地库来使用OpenCV处理图像。
到目前为止,我已经设法设置了一个ImageReader来接收类似YUV_420_888格式的图像。
mImageReader = ImageReader.newInstance(
mPreviewSize.getWidth(),
mPreviewSize.getHeight(),
ImageFormat.YUV_420_888,
4);
mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mImageReaderHandler);
Run Code Online (Sandbox Code Playgroud)
从那里,我可以获取图像平面(Y,U和V),获取它们的ByteBuffer对象,并将它们传递给我的本机函数。这发生在mOnImageAvailableListener:
Image image = reader.acquireLatestImage();
Image.Plane[] planes = image.getPlanes();
Image.Plane YPlane = planes[0];
Image.Plane UPlane = planes[1];
Image.Plane VPlane = planes[2];
ByteBuffer YPlaneBuffer = YPlane.getBuffer();
ByteBuffer UPlaneBuffer = UPlane.getBuffer();
ByteBuffer VPlaneBuffer = VPlane.getBuffer();
myNativeMethod(YPlaneBuffer, UPlaneBuffer, VPlaneBuffer, w, h);
image.close();
Run Code Online (Sandbox Code Playgroud)
在本机端,我能够从缓冲区中获取数据指针,cv::Mat从数据中创建a 并执行图像处理。
现在,下一步将是显示经过处理的输出,但是我不确定如何显示经过处理的图像。任何帮助将不胜感激。
我正在尝试在camera2 api中使用面部检测器.我将预览构建器设置为使用面部检测器:
previewBuilder.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE,
CameraMetadata.STATISTICS_FACE_DETECT_MODE_FULL);
CR = previewBuilder.build();
CS = session;
CS.setRepeatingRequest(CR, CScallback, null);
Run Code Online (Sandbox Code Playgroud)
但我不明白代码在检测到面部时会发生什么?它会在CameraCaptureSession.CaptureCallback中返回一个面吗?它在哪里发回有关检测到的面孔的信息?
我正在使用 Camera2 API 构建自定义相机。到目前为止,除了预览有时会失真之外,相机工作得很好。假设我连续打开相机 7 次。所有尝试均成功,但第 8 次相机预览失真。看起来它使用宽度作为高度,反之亦然。
我的代码基于camera2 的Google 示例实现,可以在此处找到。有趣的是,即使是 Google 示例实现有时也会出现这种扭曲的预览。我尝试修改 AutoFitTextureView 但没有成功。我目前正在使用 Google 再次提供的 AutoFitTextureView.java 。
可以在此处找到与此类似的帖子。然而,所提出的修复方案并没有解决问题。
我可以通过更改 setUpCameraOutputs 方法中的以下内容来重现该问题:
mTextureView.setAspectRatio(mPreviewSize.getHeight(), mPreviewSize.getWidth());
Run Code Online (Sandbox Code Playgroud)
到:
mTextureView.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight());
Run Code Online (Sandbox Code Playgroud)
另一个奇怪的事情是,每当预览失真时,您只需按主页按钮,应用程序就会进入 onPause() 并再次打开应用程序,以便调用 onResume() ,每次预览都是完美的。
这里有人遇到过这个问题并找到解决办法吗?
提前致谢
android ×10
camera2 ×10
camera ×2
java ×2
c++ ×1
camera-flash ×1
distortion ×1
drawing ×1
flashlight ×1
galaxy ×1
jpeg ×1
native ×1
opencv ×1
preview ×1
yuv ×1