我可以在webview中打开android摄像头吗?
这是一个常见问题的变体,但我没有看到这种情况,所以我会把它扔出去.
我有一个onPreviewFrame回调设置.这会得到一个包含NV21数据的byte [].我们对它进行h.264编码并将其作为视频流发送出去.另一方面,我们看到视频偏向90度或270度,具体取决于手机.
那么问题是,如何旋转数据,而不仅仅是预览图像?Camera.Parameters.setRotation仅影响拍照,而不影响视频.Camera.setDisplayOrientation明确表示它只影响显示预览,而不影响帧字节:
这不会影响onPreviewFrame(byte [],Camera),JPEG图片或录制视频中传递的字节数组的顺序.
那么在任何API级别都有一种方法可以改变字节数组的方向吗?如果不这样做,你甚至可以旋转这种格式的NV21(YVU)格式,还是首先需要RGB格式?
我有一个应用程序,它采用相机预览,在每一帧上执行一些基本的图像处理功能(例如边缘检测,颜色变化,图像扭曲等),并在"实时"中将修改后的帧显示在屏幕上.类似于Android Market中的"Paper Camera"应用程序.
我的方法摘要:
1:在framelayout中创建两个重叠的视图:
要传递给Camera.setPreviewDisplay()的SurfaceView.(传递null会阻止相机预览在某些设备上启动 - opencv曾经在Android 4.0之前执行此操作吗?).
一个名为"LiveView"的类,它扩展了View并实现了Camera.PreviewCallBack.该视图从相机接收帧,并在修改后显示帧(例如边缘检测).此视图位于SurfaceView之上.
2:我调用Camera.setPreviewCallbackWithBuffer(),以便将帧发送到我的LiveView
3:在LiveView的onPreviewFrame()中,我获取捕获的帧(byte []),从YUV转换为RGB并执行图像处理功能,并调用postInvalidate()(YUV2RGB转换和图像处理在本机代码中完成)
4:在LiveView的OnDraw()方法中,我从修改后的RGB帧(byte [])创建一个位图,并将位图绘制到画布.
这是有效的(在各种设备上5fps和10fps之间),但我想听听别人如何解决这个问题,以及如何改进它.特别是:
非常感谢
我正在尝试使用Android中的手机间隙运行Camera API,我正在运行所有类型的问题.
我刚刚复制了phonegap相机的例子.
我收到以下错误
07-12 18:18:00.706: E/Web Console(17837): Uncaught TypeError: Cannot read property 'SAVEDPHOTOALBUM' of undefined at file:///android_asset/www/index.html:98
07-12 18:17:59.456: E/Web Console(17837): Uncaught ReferenceError: Camera is not defined at file:///android_asset/www/index.html:67
Run Code Online (Sandbox Code Playgroud)
我尝试了所有其他目的地类型.它起作用了
destinationType: destinationType.FILE_URI
destinationType: Camera.DestinationType.FILE_URI
destinationType: destinationType.DATA_URL
Run Code Online (Sandbox Code Playgroud)
我还添加了相机和硬件相机权限的许可.但它仍然失败了
以下是以下内容
<!DOCTYPE html>
<html>
<head>
<title>Capture Photo</title>
<script type="text/javascript" charset="utf-8" src="phonegap-1.0.0.js"></script>
<script type="text/javascript" charset="utf-8">
var pictureSource; // picture source
var destinationType; // sets the format of returned value
// Wait for PhoneGap to connect with the device
//
document.addEventListener("deviceready",onDeviceReady,false);
// PhoneGap is …Run Code Online (Sandbox Code Playgroud) 问题:某些Android设备(在问题的底部列出)在使用setOrientationHint(int degrees)前置摄像头拍摄的视频功能时会出现意外行为.预期的行为是视频顺时针旋转,但这些设备逆时针旋转视频.
我的目标:在摄像机设置或硬件方向内识别变量,使我能够预测何时会发生这种情况.具体来说,我想避免在我的代码中特别包装这些手机!
进一步说明:我正在使用标准MediaRecorder对象录制视频,在准备录制时,我使用了设置视频的方向setOrientationHint().在文档中setOrientationHint(),为degrees参数指定了以下内容:
degrees - 以度为单位顺时针旋转的角度.支持的角度为0°,90°,180°和270°.
该功能旨在添加包含旋转角度的合成矩阵,以便视频播放器可以按预期显示视频.所以,我所做的是使用CameraInfo类获取相机硬件的方向,并将其用作fn中的degrees参数setOrientationHint.(我已尝试使用AOSP作为指南对此代码进行修改,但我的结果完全相同.)
一个真实示例:三星Galaxy S3前置摄像头(事实上大多数其他摄像头)的硬件方向为270,所以我在录制时会使用它,并且生成的视频会正确显示.HTC Vivid同样会为同一台相机返回270的硬件方向,但只有degrees在setOrientationHintfn中使用90作为参数时才能正确显示.如果我像任何其他手机一样使用270硬件方向,则视频将颠倒过来.
注意:该setOrientationHint()功能包括警告:
请注意,某些视频播放器可能会选择在播放期间忽略视频中的合成矩阵.
然而,这不是正在发生的事情,因为如果我伪造它并放入90而不是270,我可以轻松地在这些手机上解决这个问题.
我见过的手机专门展示了这个问题:运行Android 4.0.3的HTC Vivid(PH39100),运行Android 4.0.3的HTC EVO 4G(PG86100),运行Android 2.3.4的HTC Thunderbolt(ADR6400L).请注意,它们都是HTC手机.也许HTC的某个人顺时针错误地逆时针方向错误.
我试着去拍摄Android摄像头生成的预览帧并传递data[]到ffmpeg输入管道来生成一个flv视频.我使用的命令是:
ffmpeg -f image2pipe -i pipe: -f flv -vcodec libx264 out.flv
Run Code Online (Sandbox Code Playgroud)
我也尝试强制输入格式yuv4mpegpipe,rawvideo但没有成功...... android-camera生成的预览帧的默认格式是NV21.invokin'ffmpeg的方式是通过Process API并将预览帧写入data[]进程' stdin...... onPreviewFrame()定义如下:
public void onPreviewFrame(byte[] data, Camera camera)
{
try
{
processIn.write(data);
}
catch(Exception e)
{
Log.e(TAG, FUNCTION + " : " + e.getMessage());
}
camera.addCallbackBuffer(new byte[bufferSize]);
}
Run Code Online (Sandbox Code Playgroud)
processIn与ffmpeg流程相关联,stdin并buffersize根据提供的文档计算addCallbackBuffer().有什么东西在做错了吗?
谢谢...
我对OpenCV的Android相机示例代码感到困惑.他们创建了一个自定义类,它SurfaceHolder.Callback在方法中实现并放入以下行surfaceChanged:
mCamera.setPreviewDisplay(null);
Run Code Online (Sandbox Code Playgroud)
Android文档setPreviewDisplay解释如下:
必须在startPreview()之前调用此方法.一个例外是,如果在调用startPreview()之前未设置预览表面(或设置为null),则可以使用非null参数调用此方法一次以设置预览表面.(这允许相机设置和曲面创建并行发生,节省时间.)预览曲面在预览运行时可能不会改变.
不同寻常的是,OpenCV的代码永远不会setPreviewDisplay使用非null的SurfaceHolder调用.它工作正常,但改变图像的旋转使用setDisplayOrientation不起作用.这条线似乎也没有做任何事情,因为没有它我会得到相同的结果.
如果我setPreviewDisplay使用提供的SurfaceHolder来surfaceChanged代替null,则图像会旋转,但不包括图像处理的结果.我以后也会IllegalArgumentException打电话给我lockCanvas.
这是怎么回事?
以下是其代码中(可能)最相关的部分,略微简化并使用内联方法.这是完整版.
类定义
public abstract class SampleViewBase extends SurfaceView
implements SurfaceHolder.Callback, Runnable {
Run Code Online (Sandbox Code Playgroud)
打开相机时
mCamera.setPreviewCallbackWithBuffer(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera) {
synchronized (SampleViewBase.this) {
System.arraycopy(data, 0, mFrame, 0, data.length);
SampleViewBase.this.notify();
}
camera.addCallbackBuffer(mBuffer);
}
});
Run Code Online (Sandbox Code Playgroud)
当表面发生变化时
/* Now allocate the buffer */
mBuffer = new byte[size];
/* The buffer where …Run Code Online (Sandbox Code Playgroud) 我正在写一些在物理Android设备上运行的黑盒验收测试.被测应用程序(AUT)依赖于相机的预览.具体来说,它使用setOneShotPreviewCallback了android.hardware.Camera类的方法.我正在寻找一种方法来注入假预览图片来测试应用程序的行为.
我以为我可以通过让测试代码调用AUT的PreviewCallback对象来欺骗Camera对象,但不幸的是,实例变量mPreviewCallback对于Camera对象是私有的,因此我的测试代码无法获得对该PreviewCallback对象的引用.
我想到的另一种方法是向Message相机发送一个EventHandler,但该字段mEventHandler是私有的,因此测试代码无法获得对Handler的引用.
我在Galaxy s6边缘设备上有以下例外
java.lang.RuntimeException: Camera is being used after Camera.release() was called
at android.hardware.Camera.setPreviewSurface(Native Method)
at android.hardware.Camera.setPreviewDisplay(Camera.java:702)
at com.forsale.forsale.view.uicomponent.qrcode.CameraPreview.surfaceCreated(CameraPreview.java:59)
at android.view.SurfaceView.updateWindow(SurfaceView.java:712)
at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:316)
at android.view.View.dispatchWindowVisibilityChanged(View.java:10434)
at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1328)
at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1328)
at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1328)
at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1328)
at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1328)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1750)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
at android.view.Choreographer.doCallbacks(Choreographer.java:695)
at android.view.Choreographer.doFrame(Choreographer.java:631)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder mHolder;
private Camera mCamera;
private PreviewCallback …Run Code Online (Sandbox Code Playgroud) 我已经实现了使用Android MediaRecorder在后台录制音频,如果录音正在进行中并且用户打开了原生相机来录制视频,它给出了
相机错误"无法连接到相机"
或者在某些手机上,错误显示为
您的相机正在被其他应用程序使用
如果我停止mediarecorder然后原生相机视频录制工作正常,我搜索事件,以了解相机何时开始视频,然后在我的应用程序中我停止mediarecorder,我发现BroadcastReceiver带过滤器
<receiver android:name=".receiver.CameraReceiver">
<intent-filter android:priority="10000">
<action android:name="android.Medintent.action.CAMERA_BUTTON" />
<action android:name="android.hardware.action.NEW_PICTURE" />
<action android:name="android.hardware.action.NEW_VIDEO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
<data android:mimeType="video/*" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
在捕获图片或视频并将其保存在目录中时触发NEW_VIDEO和NEW_PICTURE事件.任何人都知道如何解决这个问题?我希望在我的应用程序中知道Native/Camera Apps要录制视频时的事件.提前致谢
android ×10
android-camera ×10
camera ×2
cordova ×2
ffmpeg ×1
htc-android ×1
javascript ×1
real-time ×1