我在使用 CameraX 示例应用程序进行预览时遇到问题。预装相机应用程序的预览质量优于 CameraX 示例的预览,但照片质量还可以。在示例项目中,触摸焦点也被实现,所以我认为这不是问题。我正在使用此代码来设置预览用例。可能出了什么问题?
private fun buildPreviewUseCase(): Preview {
val display = viewFinder.display
val metrics = DisplayMetrics().also { display.getMetrics(it) }
val preview = Preview.Builder()
.setTargetRotation(display.rotation)
.setTargetResolution(Size(metrics.widthPixels, metrics.heightPixels))
.build()
.apply {
previewSurfaceProvider = viewFinder.previewSurfaceProvider
}
preview.previewSurfaceProvider = viewFinder.previewSurfaceProvider
return preview
}
Run Code Online (Sandbox Code Playgroud)
CameraX 示例的预览
预装相机应用程序的预览
我正在尝试探索cameraX beta版本。
我陷入了我的实施之中。 imageCapture.takePicture() imageCapture 为空。
// Bind the CameraProvider to the LifeCycleOwner
val cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
// CameraProvider
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// ImageCapture
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.build()
// Must unbind the use-cases before rebinding them
cameraProvider.unbindAll()
try {
// A variable number of use-cases can be passed here -
// camera provides access to CameraControl & CameraInfo
camera = cameraProvider.bindToLifecycle(
this, cameraSelector, imageCapture)
} catch(exc: Exception) {
Log.e("TAG", "Use case …Run Code Online (Sandbox Code Playgroud) 我\xc2\xb4m 尝试编写我的第一个Android 相机应用程序,但它总是选择变焦相机而不是主相机。(我在华为P30 Pro上测试过)
\n\n该代码基于官方的camerax示例应用程序(https://github.com/android/camera-samples/tree/master/CameraXBasic)
\n\n相关代码:
\n\n/** Declare and bind preview, capture and analysis use cases */\nprivate fun bindCameraUseCases() {\n\n // Get screen metrics used to setup camera for full screen resolution\n val metrics = DisplayMetrics().also { viewFinder.display.getRealMetrics(it) }\n Log.d(TAG, "Screen metrics: ${metrics.widthPixels} x ${metrics.heightPixels}")\n\n val screenAspectRatio = aspectRatio(metrics.widthPixels, metrics.heightPixels)\n Log.d(TAG, "Preview aspect ratio: $screenAspectRatio")\n\n val rotation = viewFinder.display.rotation\n\n // Bind the CameraProvider to the LifeCycleOwner\n\n val cameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()\n\n val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())\n cameraProviderFuture.addListener(Runnable …Run Code Online (Sandbox Code Playgroud) CameraX我想从(预览用例)获取图像并使用 .h.264 视频将它们编码为 h.264 视频MediaCodec。我怎样才能做到这一点?我正在尝试的是,通过使用.in来使用Surface返回的值。我从该设置中继承了一个类,并配置我的编码器和覆盖以从. 这预计会起作用吗?我真的可以共享这样的 Surface 并期望 CameraX 写入此 Surface 并填充我的编码器的输入吗?MediaCodec.createInputSurface()Preview.Builder()Preview.setSurfaceProvider()Preview.SurfaceProvideronSurfaceRequested()SurfacecreateInputSurface()
是否有更有效的方法来对实时 CameraX 源进行编码?
注意:我使用的是 KOTLIN
android kotlin-android-extensions android-mediacodec android-camerax
我有一个 PreviewView 实例,我想使用 Firebase 和图像分析器用例根据对象标识在其上绘制一个矩形。
然而,与 Text/SurfaceView 不同,PreviewView 不允许在其上绘制任何 Canvas。
还有什么选择呢?
进一步编辑:
之前尝试过以下方法:
Canvas objectFrameCanvas = new Canvas();
Paint pen = new Paint();
pen.setColor(Color.RED);
pen.setStrokeWidth(8F);
pen.setStyle(Paint.Style.STROKE);
objectFrameCanvas.drawRect(100,150,200, 250, pen);
TextureView textureView = new TextureView(this);
textureView.draw(objectFrameCanvas);
mPreviewView.addView(textureView);
Run Code Online (Sandbox Code Playgroud)
为视图组创建一个子视图:textureView。创建新的画布对象FrameCanvas,在其上绘制矩形,然后在textureView上绘制画布。然后将其添加到视图组(PreviewView)
仍然没有给我应有的必要结果。
顺便说一句,我在我的 ImageAnanysis 用例中使用了它
imageAnalysis.setAnalyzer(executor, new ImageAnalysis.Analyzer() {....}
Run Code Online (Sandbox Code Playgroud) 我已经使用底部代码了。但是,当我仅使用最新智能手机的 imageproxy 进行位图时,它显示为绿色位图。比如三星s20
底部代码在过去的设备上运行良好谁有问题?
fun Image.toBitmap(): Bitmap {
val yBuffer = planes[0].buffer // Y
val uBuffer = planes[1].buffer // U
val vBuffer = planes[2].buffer // V
val ySize = yBuffer.remaining()
val uSize = uBuffer.remaining()
val vSize = vBuffer.remaining()
val nv21 = ByteArray(ySize + uSize + vSize)
//U and V are swapped
yBuffer.get(nv21, 0, ySize)
vBuffer.get(nv21, ySize, vSize)
uBuffer.get(nv21, ySize + vSize, uSize)
val yuvImage = YuvImage(nv21, ImageFormat.NV21, this.width, this.height, null)
val out = ByteArrayOutputStream()
yuvImage.compressToJpeg(Rect(0, 0, yuvImage.width, yuvImage.height), 50, out) …Run Code Online (Sandbox Code Playgroud) 免责声明:我知道这个问题的存在,但它目前尚未解决,我试图提供额外的信息,而不用无用的答案污染该问题,无论如何都无法解决问题。
我有一个带有默认镜像的前置摄像头的自定义设备,因此我想正常显示预览,并且需要水平翻转PreviewView的内容,但我被卡住了。过去其他人建议使用,PreviewView#setScaleX(-1)但它要么根本不起作用,要么需要在代码中的一个非常特定的点调用它,而我还没有找到。
下面的代码是CameraFragment.kt官方CameraXBasic示例中的简化版本;我已经添加了评论,我已经厌倦了打电话viewFinder.scaleX = -1f但没有成功。老实说,我真的不认为这个地方有什么区别,因为如果我用 1 以外的任何值调用它,它与 和 都可以正常工作scaleX,scaleY但它总是忽略负号,所以它永远不会翻转。
private lateinit var viewFinder: PreviewView
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
...
viewFinder = view.findViewById(R.id.view_finder)
// HERE
viewFinder.post {
// HERE
setupCamera()
}
}
private fun setupCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
cameraProviderFuture.addListener(Runnable {
val cameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_FRONT)
.build()
val preview = Preview.Builder()
.build()
.also {
// HERE
it.setSurfaceProvider(viewFinder.surfaceProvider)
} …Run Code Online (Sandbox Code Playgroud) 我想在没有任何 xml 和 PreviewView 或其他用于显示图片的东西的情况下使用 CameraX 拍照,但我有问题。
在相机 1 中,我们有FaceDetectionListener方法camera.startFaceDetection()。使用这种方式可以更容易地找到面孔。
在相机 2 中,我们可以使用 CameraCaptureSession.CaptureCallback() 方法和此静态变量执行相同操作
Integer mode = result.get(CaptureResult.STATISTICS_FACE_DETECT_MODE);
Face[] faces = result.get(CaptureResult.STATISTICS_FACES);
Run Code Online (Sandbox Code Playgroud)
现在有一个名为 CameraX 的新相机库。它是Camera2的包装,推荐使用。如果是Camera 2的封装,我们可以很容易得到如下的回调结果CameraCaptureSession.CaptureCallback()
但经过三天的尝试,我未能找到解决方案。
谁能给我像camera2一样调用以下方法的解决方案?
在相机2中,
private val mCaptureCallback = object : CameraCaptureSession.CaptureCallback() {
override fun onCaptureProgressed(
session: CameraCaptureSession,
request: CaptureRequest,
partialResult: CaptureResult
) {
}
override fun onCaptureCompleted(
session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult
) {
}
}
mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback,
mBackgroundHandler);
Run Code Online (Sandbox Code Playgroud)
如何使用CameraX获取回调结果?
我仍在练习 Kotlin 和 Android 开发。据我了解,Camera 类已被弃用,Android 邀请使用 Camerax 来代替,因为这个高级类是独立于设备的,并且它们简化了在应用程序上实现相机的过程。
我尝试阅读文档(https://developer.android.com/training/camerax),但它写得太糟糕了,我几乎不明白他们试图解释的内容。所以我去阅读了文档本身给出的整个示例代码(https://github.com/android/camera-samples/tree/main/CameraXBasic)。CameraFragment 代码大约有 500 行长(忽略导入和各种注释)。
我真的需要编写 500 行代码来简单地拍照吗?这怎么能被认为是“比以前简单”呢?
我的意思是,在 Android 编程中,我只需要编写 4 行代码即可要求用户从其存储中选择一个图像并检索它并将其显示在 ImageView 中。有没有一种真正简单的拍照方法,或者我真的需要停下来并失去一整天的工作来编写所有这些代码行?
编辑:获取文档的此页面: https://developer.android.com/training/camerax/architecture#kotlin 它以这段代码开始。
val preview = Preview.Builder().build()
val viewFinder: PreviewView = findViewById(R.id.previewView)
// The use case is bound to an Android Lifecycle with the following code
val camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview)
Run Code Online (Sandbox Code Playgroud)
CameraProvider 不知从何而来。这应该是什么?我发现它是一个 ProcessCameraProvider,但是我应该如何初始化它?它应该是一个 Lateinit var 还是已经在其他地方初始化了?因为如果我尝试写入,val cameraProvider = ProcessCameraProvider()就会出现错误,那么我该怎么办?什么是cameraSelector参数?之前没有定义过。我发现它是前置摄像头或后置摄像头的选择器,但是阅读该文档的那一页我怎么知道它呢?这份文档怎么可能在发布时存在这些缺陷呢?怎样才能让一个人轻松学习呢?
android-camerax ×10
android ×9
kotlin ×3
camera ×2
android-view ×1
androidx ×1
bitmap ×1
callback ×1
image ×1
preview ×1