android-NDK是否支持直接摄像头访问?我的NDK文件夹中没有Camera.h.
这可能很容易与另一个问题重复,我只是在努力弄清楚要搜索什么.
我的相机应用程序被锁定在横向模式(在清单中),如下所示:
android:screenOrientation="landscape"
Run Code Online (Sandbox Code Playgroud)
不过,我想还是有的旋转UI元素,当设备旋转为纵向(尽管机器人仍然会想起它的目的在景观,但多数民众赞成).
所以我试过这个来检查方向
int rotation = this.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
Log.d("Rotation", "0");
break;
case Surface.ROTATION_90:
Log.d("Rotation", "90");
break;
case Surface.ROTATION_180:
Log.d("Rotation", "180");
break;
case Surface.ROTATION_270:
Log.d("Rotation", "270");
break;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,无论我如何转动手机,它总会返回90.是否有更强大的方式来获得方向,无论Android"认为"的方向是什么?
我正在尝试将lat-long和其他数据写入我的自定义相机应用程序中的jpeg的Exif标头.通常,android会自动使用光圈,ISO,快门速度等数据填充标题.但是,当我手动添加创建ExifInterface实例时,请设置GPS位置SetAttributes(),然后调用SaveAttributes(); 所有其他相机数据消失.
这应该发生吗?如何在不覆盖其他所有内容的情况下添加标签?
我在其他地方看到了创建两个ExifInterfaces的示例,一个旧的(从图片中)和一个新的,并将每个填充的值从旧的复制到新的以及任何其他数据.然而,这是令人烦恼和冗长的.我想找到一个更好的解决方案.
这是我的代码:
try{
ExifInterface exif = new ExifInterface(pictureFile.getAbsolutePath());
exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, mGpsLocation.getLatDms());
exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, mGpsLocation.getLonDms());
exif.setAttribute(ExifInterface.TAG_GPS_ALTITUDE, mGpsLocation.getAltDms());
exif.saveAttributes();
} catch(IOException e){
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在尝试使用新的相机api.突发捕获速度太慢,因此我在ImageReader中使用YUV_420_888格式并稍后进行JPEG enconding,如以下帖子中所示:
问题是当我尝试使用RenderScript从YUV_420_888编码JPEG时,我得到绿色图像,如下所示:
RenderScript rs = RenderScript.create(mContext);
ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(rs));
Type.Builder yuvType = new Type.Builder(rs, Element.YUV(rs)).setX(width).setY(height).setYuvFormat(ImageFormat.YUV_420_888);
Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);
Type.Builder rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(width).setY(height);
Allocation out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);
in.copyFrom(data);
yuvToRgbIntrinsic.setInput(in);
yuvToRgbIntrinsic.forEach(out);
Bitmap bmpout = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
out.copyTo(bmpout);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmpout.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] jpegBytes = baos.toByteArray();
Run Code Online (Sandbox Code Playgroud)
数据变量(YUV_420_888数据)来自:
ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
Run Code Online (Sandbox Code Playgroud)
我在JPEG编码中做错了什么才能使图像只显示为绿色?
提前致谢
编辑:这是我获得的绿色图像的示例:
https://drive.google.com/file/d/0B1yCC7QDeEjdaXF2dVp6NWV6eWs/view?usp=sharing
我在Samsung S5上使用新的Camera2 API.此设备报告支持的硬件级别LEGACY,这很好.
但是,我似乎无法自动对焦于此设备.触发自动对焦的请求如下所示:
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
state = STATE_PREVIEW;
try {
captureSession.setRepeatingRequest(previewRequestBuilder.build(), captureCallback, backgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
发送请求后,请求的结果始终是CONTROL_AF_STATE_ACTIVE_SCAN偶尔的CONTROL_AF_STATE_NOT_FOCUSED_LOCKED.
奇怪的是,当状态为时CONTROL_AF_STATE_NOT_FOCUSED_LOCKED,自动对焦会返回CONTROL_AF_STATE_ACTIVE_SCAN状态一段时间然后再返回状态CONTROL_AF_STATE_NOT_FOCUSED_LOCKED,从而产生无限焦点循环.根据文件,当状态是CONTROL_AF_STATE_NOT_FOCUSED_LOCKED......
镜头将保持静止,直到AF模式(android.control.afMode)更改或新的AF触发器发送到相机设备(android.control.afTrigger).
我想知道这种差异是否是因为硬件级别的问题LEGACY,我应该回到使用已弃用的Camera API,但这对于像自动对焦这样的流行功能来说似乎很疯狂.
是否有任何建议如何处理报告的设备LEGACY?
我想在我的Nexus 5x上捕捉慢动作视频.这就是我配置媒体记录器的方式:
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH_SPEED_HIGH);
mMediaRecorder = new MediaRecorder();
// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
// Step 2: Set sources
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set the high speed CamcorderProfile
mMediaRecorder.setProfile(profile);
// Step 4: Set output file
// Step 5: Prepare media recorder
// Step 6: Capture video
Run Code Online (Sandbox Code Playgroud)
问题是,捕获的视频不是我的设备支持的120 fps慢动作视频.它们是常规的29 fps视频.
对于下面定义的所有高速配置文件((从QUALITY_HIGH_SPEED_LOW到QUALITY_HIGH_SPEED_2160P),它们与正常录制配置文件类似,只有更高的输出帧速率和比特率.因此,使用setProfile(CamcorderProfile)设置这些配置文件而不指定任何其他编码参数将生成高速视频,而不是具有不同捕获和输出(回放)帧速率的慢动作视频. 要记录慢动作视频,应用程序必须通过setVideoFrameRate(int)和setVideoEncodingBitRate适当地设置视频输出(回放)帧速率和比特率. (int)基于慢动作因子.如果应用程序打算使用MediaCodec编码器进行视频录制,则必须根据此CamcorderProfile类似地设置MediaFormat的每个单独字段.
我没有得到的是,setProfile已经使用从所选CamcorderProfile派生的参数调用了两个方法setVideoFrameRate和setVideoEncodingBitRate.为什么我需要再打电话给他们?我在这里错过了什么?
任何帮助将不胜感激.对于我的生活,我不能让这个工作!
编辑:我试过调用这样的方法,但它仍然捕获正常速度的视频:
mMediaRecorder.setVideoFrameRate(profile.videoFrameRate/4);
mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate/4);
Run Code Online (Sandbox Code Playgroud)
1/4因为由CamcorderProfile.QUALITY_HIGH_SPEED_HIGH通告的帧速率是120,我想拍摄30 fps视频的文件中所述这里 …
我正在使用camera2 api捕获图像并在thumnail中显示.所有设备都正常工作但是在使用Micromax Q382设备时,在thumnail中预览其显示的黑色图像.我在下面的问题
Unable to acquire a lockedBuffer, very likely client tries to lock more than maxImages buffers
Run Code Online (Sandbox Code Playgroud)
我使用下面的代码捕获listerner回调
final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback()
{
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
TotalCaptureResult result)
{
super.onCaptureCompleted(session, request, result);
startPreview();
}
};
mCameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback()
{
@Override
public void onConfigured(CameraCaptureSession session)
{
try {
session.capture(captureBuilder.build(), captureListener, backgroudHandler);
} catch (CameraAccessException e) {
AppLogger.exception(myContext, getClass().getSimpleName(), e);
// e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session)
{
}
}, backgroudHandler); …Run Code Online (Sandbox Code Playgroud) 我正在我的项目中研究人脸检测功能。我的代码在包括我的设备(Honor Play,Android 9.0)在内的许多设备上都可以完美运行,但在某些设备上不起作用,例如。小米红米 Note 5 pro 具有相同版本 (android 9.0) 但我收到错误,如下面的日志所示。
我在 manifest.xml 中添加了以下权限
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
Run Code Online (Sandbox Code Playgroud)
我在日志中收到以下错误
E/libc: Access denied finding property "vendor.camera.aux.packagelist"
W/CamCtrl.V17: type=1400 audit(0.0:363016): avc: denied { read } for name="u:object_r:vendor_default_prop:s0" dev="tmpfs" ino=13687 scontext=u:r:untrusted_app:s0:c101,c260,c512,c768 tcontext=u:object_r:vendor_default_prop:s0 tclass=file permissive=0
Run Code Online (Sandbox Code Playgroud)
如果需要或不允许,我已经在请求相机和存储权限。请让我知道此问题的任何解决方案。
我正在尝试创建一个CameraCaptureSession具有四个输出的 Camera2:
SurfaceView,最高 1080p)ImageReader,最多 8k 照片)MediaRecorder/ MediaCodec,最多 4k 视频)ImageReader最多 4k 视频帧)不幸的是,Camera2 不支持同时连接所有这四个输出(表面),因此我必须做出妥协。
对我来说最合乎逻辑的妥协是将两个视频捕获管道合并为一个,以便帧处理输出(#4,ImageReader)将帧重定向到视频捕获输出(#3,MediaRecorder)。
如何从 ImageReader 写入图像:
val imageReader = ImageReader.newInstance(4000, 2256, ImageFormat.YUV_420_888, 3)
imageReader.setOnImageAvailableListener({ reader ->
val image = reader.acquireNextImage() ?: return@setOnImageAvailableListener
callback.onVideoFrameCaptured(image)
}, queue.handler)
val captureSession = device.createCaptureSession(.., imageReader.surface)
Run Code Online (Sandbox Code Playgroud)
..进入Surface从MediaRecorder?
val surface = MediaCodec.createPersistentInputSurface()
val recorder = MediaRecorder(context)
..
recorder.setInputSurface(surface)
Run Code Online (Sandbox Code Playgroud)
我想我可能需要一个带有直通着色器的 OpenGL 管道 - 但我不知道如何从ImageReader …
android opengl-es surfaceview android-camera android-camera2
android ×10
android-camera ×10
android-ndk ×1
c++ ×1
camera ×1
exif ×1
jpeg ×1
lomo-effect ×1
opengl-es ×1
rgb ×1
slowmotion ×1
surfaceview ×1
yuv ×1