Android 安卓可以';t使用前置摄像头录制视频,MediaRecorder启动失败:-19
我有两个不同的代码库,都有相同的问题 第一个是直接从developer.android.com这里复制的代码: 第二个是这个代码: 这两款相机都可以与普通的后置摄像头配合使用,但当我尝试使用前向摄像头时,我发现了错误 这在以下设备上发生:Android 安卓可以';t使用前置摄像头录制视频,MediaRecorder启动失败:-19,android,video,camera,android-camera,mediarecorder,Android,Video,Camera,Android Camera,Mediarecorder,我有两个不同的代码库,都有相同的问题 第一个是直接从developer.android.com这里复制的代码: 第二个是这个代码: 这两款相机都可以与普通的后置摄像头配合使用,但当我尝试使用前向摄像头时,我发现了错误 这在以下设备上发生: Nexus S 4.1.2 Galaxy Nexus 4.1.2 Nexus 7 4.2.1(它只有前置摄像头) 我也尝试过类似于2.2纪元的摄像头参数,一些人声称三星和HTC的一些设备需要使用该参数,尽管有多篇不同的文章引用了不同的字符串键: c =
- Nexus S 4.1.2
- Galaxy Nexus 4.1.2
- Nexus 7 4.2.1(它只有前置摄像头)
c = Camera.open(frontFacingCameraID); // attempt to get a Camera instance
Camera.Parameters params = c.getParameters();
params.set("cam-mode", 1);
params.set("cam_mode", 1);
params.set("camera-id", 1);
c.setParameters(params);
没有这些工作,也请注意,我检测到正确的正面摄像头ID,在Nexus 7上当然是:0。但在所有设备上的结果都是一样的
我尝试过使用低质量配置文件,我尝试过以多种方式手动设置视频分辨率、编码器、输出格式、比特率、帧速率和视频大小,但都没有成功
让我觉得大部分代码都没有问题的是,普通摄像头工作正常。因此,我猜这与设置媒体记录器的prepareVideoRecorder()/prepareMediaRecorder()方法有关
可能是媒体记录器手动编码设置,已知可在前置摄像头上工作
我不得不说,Android摄像头和MediaRecorder API太差劲了。与iOS相比,它有点混乱,更不用说一些看起来可怕的param不兼容问题,以及分散的设备环境中的不同解决方案
假设我可以让它在我的JB设备上工作,根据经验,有人知道这些问题中的大多数是通过API 15 IC解决的吗
我认为如果不支持API 10的姜饼,如果它太难支撑了。 < P>你应该看看这里。
这里列出的命令的顺序非常重要
我在这里使用了第二个代码示例
并修改了启动录制功能
protected void startRecording() throws IOException
{
mrec = new MediaRecorder(); // Works well
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
mCamera.unlock();
mrec.setCamera(mCamera);
mrec.setPreviewDisplay(surfaceHolder.getSurface());
mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mrec.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mrec.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
mrec.setOutputFile("/sdcard/zzzz.3gp");
mrec.setPreviewDisplay(surfaceHolder.getSurface());
mrec.prepare();
mrec.start();
}
好吧,我终于让它正常工作了。 这个问题似乎肯定与
配置文件设置
有关,尤其是帧速率
在我的主要测试设备Nexus S上,如果我探测相机,我会收到以下参数:
对于后置摄像头:15帧到30帧,足够了 对于前置摄像头:
7.5到30帧,好的 然后我检查我尝试使用的配置文件:
CamcorderProfile.QUALITY\u HIGH
CamcorderProfile.质量低
质量低:
音频比特率:12200音频频道:1
音频编解码器:AMR_NB 音频采样器:8000
持续时间:30
文件格式:三个GPP
质量:0
视频比特率:256000
视频编解码器:H264
视频帧率:30
视频帧宽度:176
视频帧高度:144 质量高: 音频比特率:24000
音频频道:1
音频编解码器:AAC
音频采样器:16000
持续时间:60
文件格式:MPEG_4
质量:1
视频比特率:3000000
视频编解码器:H264
视频帧率:30
视频帧宽度:720
视频帧高度:480 很明显,高质量的外形是为后摄像头设计的,因为前面板只有640x480。但他们都说每秒30帧 现在。。。。奇怪的是: 如果我为后向摄像头设置了任何帧速率,无论是哪种配置,它都会与可怕的: -19错误 这没什么大不了的,因为我不在乎后置摄像头,但考虑到配置文件默认为30,而
Params
表示接受15-30,这很奇怪。但我尝试过的int值都不起作用。如果省略setVideoFrameRate
就可以了
无论如何,移动到前向摄像头。
因此,如果我使用QUALITY\u LOW
配置文件并将帧速率设置为15或更低,它会神奇地工作
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mediaRecorder.setVideoFrameRate(15);
事实上,任何价值,1-15工程。这看起来很奇怪
所以这里有一个难题,我可能可以探索分辨率,并为大多数相机选择合适的分辨率,尽管我也相当自信几乎所有前置相机的最低VGA 640x480
但是,帧速率呢?
在NexusS的例子中,我看不出有任何方法可以不用猜测就确定15或更低的值?
我应该始终使用相机返回的最低帧速率吗
我看了一下Galaxy Nexus,它有3个帧速率范围,第一个是15-15,第二个是15-30。它的低质量轮廓是相似的,尽管分辨率更高。如果我在Galaxy Nexus上使用低调,似乎效果不错
有了Nexus7,我无法探测摄像机的配置文件,我总是得到空指针,这很奇怪。
它说它支持4 FPS-60 FPS。
如果我选择你认为它应该工作的QUALITY\u LOW
,它就会崩溃,而且我找不到它可以工作的帧速率。
虽然错误与setProfile
有关,但我认为问题在于内置的概要文件。
安卓API的重点当然是它的一致性,这是一个旗舰设备,FF摄像头用于视频会议,不是吗
因此,虽然我让它在两个设备上使用手动自定义设置,但我看不到通过代码使它在多个设备上工作的明确方法
Nexus S似乎没有按照其Camera.getParameters().getSupportedPreviewFpsRange()
我很高兴能使用自动FP
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW));
mediaRecorder.setVideoFrameRate(15);
<uses-feature android:name="android.hardware.camera.front" />
<uses-feature android:name="android.hardware.microphone"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
Camera cam = Camera.open(frontCamID);
cam.unlock();
recorder.setCamera(cam);