Android 安卓可以';t使用前置摄像头录制视频,MediaRecorder启动失败:-19

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 =

我有两个不同的代码库,都有相同的问题

第一个是直接从developer.android.com这里复制的代码:

第二个是这个代码:

这两款相机都可以与普通的后置摄像头配合使用,但当我尝试使用前向摄像头时,我发现了错误

这在以下设备上发生:

  • Nexus S 4.1.2

  • Galaxy Nexus 4.1.2

  • Nexus 7 4.2.1(它只有前置摄像头)

我也尝试过类似于2.2纪元的摄像头参数,一些人声称三星和HTC的一些设备需要使用该参数,尽管有多篇不同的文章引用了不同的字符串键:

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);