我想使用OpenGL ES进行Android相机预览并保存捕获的图像.
我喜欢在Android相机中使用OpenGL ES来为Android相机提供一些效果.所以请有人告诉我该怎么做?
我正在尝试检索可用的相机图像尺寸,因此我可以将相机调整为我的首选图像分辨率.
要检索Android相机尺寸,我使用了以下代码:
camera=Camera.open();
Parameters params = camera.getParameters();
List sizes = params.getSupportedPictureSizes();
for (int i=0;i<sizes.size();i++){
Log.i("PictureSize", "Supported Size: " +sizes.get(i));
}
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出,我不知道如何转换为大小.
"Supported size: android.hardware.Camera$Size@65d4c50"
"Supported size: android.hardware.Camera$Size@65d4a70"
"Supported size: android.hardware.Camera$Size@3fe4e00"
"Supported size: android.hardware.Camera$Size@3fe4cd0"
"Supported size: android.hardware.Camera$Size@18f5600"
"Supported size: android.hardware.Camera$Size@13f7860"
Run Code Online (Sandbox Code Playgroud)
如果有人能帮我理解输出,那对我很有帮助,谢谢!
编辑:我通过执行以下操作最终解决了我的问题:
camera=Camera.open();
Parameters params = camera.getParameters();
List sizes = params.getSupportedPictureSizes();
Camera.Size result = null;
for (int i=0;i<sizes.size();i++){
result = (Size) sizes.get(i);
Log.i("PictureSize", "Supported Size. Width: " + result.width + "height : " + result.height);
}
Run Code Online (Sandbox Code Playgroud) 我需要做的很简单,我想使用相机回调手动显示来自相机的预览,我想在真实设备上获得至少15fps.我甚至不需要颜色,我只需要预览灰度图像.来自相机的图像是YUV格式,你必须以某种方式处理它,这是主要的性能问题.我正在使用API 8.
在所有情况下,我都使用camera.setPreviewCallbackWithBuffer(),它比camera.setPreviewCallback()更快.如果我没有显示预览,我似乎无法在这里获得大约24 fps.所以没有问题.
我试过这些解决方案:
1.在SurfaceView上将相机预览显示为位图.它有效,但性能约为6fps.
baos = new ByteOutputStream();
yuvimage=new YuvImage(cameraFrame, ImageFormat.NV21, prevX, prevY, null);
yuvimage.compressToJpeg(new Rect(0, 0, prevX, prevY), 80, baos);
jdata = baos.toByteArray();
bmp = BitmapFactory.decodeByteArray(jdata, 0, jdata.length); // Convert to Bitmap, this is the main issue, it takes a lot of time
canvas.drawBitmap(bmp , 0, 0, paint);
Run Code Online (Sandbox Code Playgroud)
2.在GLSurfaceView上将相机预览显示为纹理.这里我只显示亮度数据(灰度图像),这非常简单,每帧只需要一个arraycopy().我可以得到大约12fps,但我需要在预览中应用一些过滤器,看起来,它无法在OpenGL ES 1中快速完成.所以我不能使用这个解决方案.另一个问题中的一些细节.
3.使用NDK在(GL)SurfaceView上显示相机预览以处理YUV数据.我在这里找到了一个使用一些C函数和NDK 的解决方案.但我没有设法使用它,这里有更多细节.但无论如何,这个解决方案是为了返回ByteBuffer在OpenGL中将其显示为纹理,并且它不会比之前的尝试更快.所以我必须修改它以返回int []数组,可以使用canvas.drawBitmap()绘制,但我不理解C足以执行此操作.
那么,我有没有其他方法可以避免或尝试一些改进?
我想同时使用设备的前后摄像头.在我的应用程序中,屏幕的前半部分将显示后置摄像头的预览,下半部分屏幕将显示前置摄像头预览.
我尝试设置两个不同的相机预览,但是当我打开我的应用程序时,屏幕的前半部分(显示后面的相机预览)不显示预览.屏幕的后半部分(显示前置摄像头)显示背面摄像头(奇怪).
您的应用程序一次只能为一个特定的硬件摄像头激活一个Camera对象 .
这意味着如果两个相机硬件(正面和背面)不同并且可以同时打开.
在我的应用程序中,我使用相同的api.当我打开并同时呼叫Camera.startPreview();两个摄像机时,这不会给出任何异常或错误.但它仍然无法正常工作.我一次只能看到一个摄像头预览.
我在这里缺少什么同时使用两个相机?
我正在为背景录像开发应用程序,这就是为什么我使用WindowManager,但它对我没有用.以下错误:
08-23 15:38:21.021: E/AndroidRuntime(4200): java.lang.RuntimeException: Unable to create service com.example.prankapp.BackgroundVideoRecorder: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@418c0b68 -- permission denied for this window type
08-23 15:38:21.021: E/AndroidRuntime(4200): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2277)
08-23 15:38:21.021: E/AndroidRuntime(4200): at android.app.ActivityThread.access$1600(ActivityThread.java:128)
08-23 15:38:21.021: E/AndroidRuntime(4200): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1215)
08-23 15:38:21.021: E/AndroidRuntime(4200): at android.os.Handler.dispatchMessage(Handler.java:99)
08-23 15:38:21.021: E/AndroidRuntime(4200): at android.os.Looper.loop(Looper.java:137)
08-23 15:38:21.021: E/AndroidRuntime(4200): at android.app.ActivityThread.main(ActivityThread.java:4517)
08-23 15:38:21.021: E/AndroidRuntime(4200): at java.lang.reflect.Method.invokeNative(Native Method)
08-23 15:38:21.021: E/AndroidRuntime(4200): at java.lang.reflect.Method.invoke(Method.java:511)
08-23 15:38:21.021: E/AndroidRuntime(4200): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
08-23 15:38:21.021: E/AndroidRuntime(4200): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
08-23 15:38:21.021: E/AndroidRuntime(4200): at …Run Code Online (Sandbox Code Playgroud) 如果你有一个Uri并且你需要它Bitmap,理论上你可以做到这一点
Bitmap troublinglyLargeBmp =
MediaStore.Images.Media.getBitmap(
State.mainActivity.getContentResolver(), theUri );
Run Code Online (Sandbox Code Playgroud)
但它每次都会崩溃,
所以你这样做.........
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
AssetFileDescriptor fileDescriptor =null;
fileDescriptor =
State.mainActivity.getContentResolver().openAssetFileDescriptor( theUri, "r");
Bitmap actuallyUsableBitmap
= BitmapFactory.decodeFileDescriptor(
fileDescriptor.getFileDescriptor(), null, options);
Utils.Log("'4-sample' method bitmap ... "
+actuallyUsableBitmap.getWidth() +" "
+actuallyUsableBitmap.getHeight() );
Run Code Online (Sandbox Code Playgroud)
这太棒了,是工作的解决方案.
请注意,在当前条件下(2014年),典型的相机尺寸等,"四"因子往往效果很好.但是,最好在Uri上猜测或准确了解图像数据的大小,然后使用它信息,智能地选择那个因素.
简而言之,如何在加载Uri时正确选择该比例因子?
Android专家,这是一个众所周知的问题,有没有解决方案?感谢您的iOS-> Android好友!:)
我正在尝试使用相机api直接拍摄照片,但这是我得到的预览:

这是调用后拍摄的图像,takePicture()它大于预览本身:

(注意:我裁剪了前两张照片的高度,以提高问题的可读性,并保持宽度不变)
我正在使用此实用程序方法在开始相机预览之前选择最佳的最佳预览尺寸:
public static Camera.Size getBestAspectPreviewSize(int displayOrientation,
int width,
int height,
Camera.Parameters parameters) {
double targetRatio = (double) width / height;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
if (displayOrientation == 90 || displayOrientation == 270) {
targetRatio = (double) height / width;
}
List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
Collections.sort(sizes,
Collections.reverseOrder(new SizeComparator()));
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) < minDiff) {
optimalSize = size;
minDiff …Run Code Online (Sandbox Code Playgroud) 我试图让相机框架处于预览模式.我从github运行示例项目https://github.com/googlesamples/android-Camera2Basic
我遇到的问题是在预览模式下获取帧.
这是代码:
private CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback() {
private void process(CaptureResult result) {
switch (mState) {
case STATE_PREVIEW: {
//HERE, HOW CAN I RETRIEVE THE CURRENT FRAME?
break;
}
case STATE_WAITING_LOCK: {
...
break;
}
case STATE_WAITING_PRECAPTURE: {
...
break;
}
case STATE_WAITING_NON_PRECAPTURE: {
...
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试获取框架的另一件事是设置mImageReader.setOnImageAvailableListener.我期望能够获得框架onImageAvailable回调,但是永远不会调用onImageAvailable.onPreviewFrame是我自己的方法,我需要将它传递给当前帧.
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.JPEG, /*maxImages*/2);
mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
mTextureView.onPreviewFrame(reader.acquireNextImage().getPlanes([0].getBuffer().array());
}
};
Run Code Online (Sandbox Code Playgroud)
我做错了什么?谢谢.
我是Android开发的新手,我发现很难在camera2 api上找到好的例子.
我在大多数问题上慢慢地工作,但在这个问题上,我被困住了.在默认相机中,当您触摸屏幕进行对焦时,它会暂时显示焦点区域的矩形.我想做类似的事情(或者在这种情况下,完全相同的事情开始,所以我可以弄明白).
我在某处看到(我认为SDK文档中的TextureView页面),当它被用作相机预览时,你无法在textureview上绘制 - 并且调用lock方法将返回null而不是画布.
我在网上找到了这个:https://github.com/commonsguy/vidtry/ 但我无法让它工作.我或者得到错误说我的主视图不能投射到我的可绘制视图,反之亦然 - 或者我的可绘制视图位于顶部并使屏幕变黑 - 或者它在底部并且不会响应触摸事件(并试图强制从上面的视图中执行点击它会导致崩溃.)
我卡住了!任何人都可以给我一个解释或示例,说明如何在事件位置上绘制矩形几秒钟?
谢谢!
android android-layout android-camera android-canvas textureview
我已经为Google Glass 编写了一个开源摄像头,但是一些使用它的人报告说,录制的视频无法正常保存用于冗长的视频.
我找不到有关Android文档中任何此类限制的信息
因此,在检查出来之后,我发现对于大于26 minutes的视频,视频文件保存在Glass中,其大小已经存在,2.7 GB但其持续时间是0:00.它无法使用任何视频播放器播放.
所以我想知道为什么会这样?为什么视频会被正确录制duration < 26 minutes并被搞砸为更长的视频.
启动视频录制的代码是
/**
* Initialize video recorder to record video
*/
private void initRecorder() {
try {
File dir = new File(Environment.getExternalStorageDirectory()
+ File.separator + Environment.DIRECTORY_PICTURES
+ File.separator + "My Videos");
if (!dir.exists()) {
dir.mkdirs();
}
videofile = new File(dir, "video.mp4");
recorder.setCamera(mCamera);
// Step 2: Set sources
recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a CamcorderProfile (requires API Level 8 or …Run Code Online (Sandbox Code Playgroud) android android-camera android-mediarecorder google-glass google-glass-camera
android ×10
android-camera ×10
camera ×2
google-glass ×1
java ×1
opengl-es ×1
preview ×1
shader ×1
textureview ×1