Android无法用前置摄像头录制video,MediaRecorder启动失败:-19

我有两个不同的代码库与相同的问题。

第一个是直接从developer.android.com复制的代码: http : //developer.android.com/guide/topics/media/camera.html#custom-camera

第二个是这个代码:

http://android-er.blogspot.com.au/2011/10/simple-exercise-of-video-capture-using.html

这两个正常的后置摄像头工作正常,但只要我尝试使用前置摄像头,我得到的错误。

这发生在以下设备上:

  • Nexus S 4.1.2

  • Galaxy Nexus 4.1.2

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

我已经尝试了什么样的2.2时代相机参数以及一些人声称是一些三星和HTC设备要求,虽然多个不同的文章引用不同的string键:

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

这些工作都没有,请注意,我正在检测Nexus 7上正确的前置摄像头ID:0。但是结果在所有设备上都是一样的。

我曾尝试使用低质量的configuration文件,我曾尝试以多种方式手动设置video分辨率,编码器,输出格式,比特率,帧速率和video大小,但没有一个工作。

这个东西让我觉得大多数代码没有什么问题,就是普通的相机工作正常。 所以我的猜测是它与设置Media Recorder的prepareVideoRecorder()/ prepareMediaRecorder()方法有关。

也许媒体logging器手动编码已知可在前置摄像头上工作的设置?

我不得不说,Android相机和MediaRecorder API的吸引力。 与iOS相比,它有点混乱,更不用说在零散的设备环境中出现一些令人恐惧的参数不兼容问题和不同的解决scheme。

假设我可以在我的JB设备上工作,有没有人从经验中知道这些问题大部分是通过API 15 ICS解决的?

如果它太难支持,我会考虑不支持API 10姜饼。

Related of "Android无法用前置摄像头录制video,MediaRecorder启动失败:-19"

我今天也在这个问题上搏斗了一下。

首先,确保您的权限设置正确。 具体来说,要录制video,您需要:

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

CamcorderProfile.get()的签名默认为后置摄像头的configuration文件:

以给定质量级别返回设备上第一台背面照相机的摄像机configuration文件。 如果设备没有后置摄像头,则返回null。

而是使用http://developer.android.com/reference/android/media/CamcorderProfile.html#get(int,%20int&#xFF09; 。 第一个参数是您打开的相机的ID,特别是前置相机。

好吧,所以我终于有了工作。

这个问题似乎明确涉及到configuration文件设置,特别是帧率。

在Nexus S上,我的主要testing设备,如果我探测Camera.Parameters我得到:

对于后置摄像头:
15 FPS到30 FPS,够公平的。

对于前置摄像头:
7.5 FPS到30 FPS,好的。

然后我检查我正在尝试使用的configuration文件:

CamcorderProfile.QUALITY_HIGH
CamcorderProfile.QUALITY_LOW

QUALITY_LOW:
audioBitRate:12200
audioChannels:1
audioCodec:AMR_NB audioSampleRate:8000
持续时间:30
fileFormat:THREE_GPP
质量:0
videoBitRate:256000
videoCodec:H264
videoFrameRate:30
videoFrameWidth:176
videoFrameHeight:144

QUALITY_HIGH:
audioBitRate:24000
audioChannels:1
audioCodec:AAC
audioSampleRate:16000
持续时间:60
fileFormat:MPEG_4
质量:1
videoBitRate:3000000
videoCodec:H264
videoFrameRate:30
videoFrameWidth:720
videoFrameHeight:480

显然,高品质的configuration文件是专门为后置摄像头,看到前面只是640×480。 但他们都说30 FPS。

现在….

这是怪异的。

如果我为后置摄像头设置任意帧速率,无论哪种configuration文件,都会遇到可怕的-19错误

 mediaRecorder.setVideoFrameRate(fpsInt); 

这不是什么大不了的事,因为我不在乎后置摄像头,但是这很奇怪,考虑到轮廓预设为30,Params说他们接受15-30。 但没有int值四尝试工作。 如果我忽略setVideoFrameRate它的罚款。

无论如何,移动到前置摄像头。

所以,如果我使用QUALITY_LOWconfiguration文件,并将帧速率设置为15或更低,那么它奇迹般地工作。

 mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW)); mediaRecorder.setVideoFrameRate(15); 

事实上任何价值,1 – 15的作品。 这似乎很奇怪。

所以inheritance人的内涵,我可以大概探测分辨率,并为大多数相机select一个合适的水库,虽然我也相当有信心几乎所有前置摄像头在最低VGA 640×480。

但是,帧率呢? 在Nexus S的情况下,我没有看到任何方式,我可以确定15或更低的价值,而不只是猜测? 我是否应该始终使用摄像机返回的最低帧率?

我看了Galaxy Nexus,它有3个帧速率范围,第一个是15-15,第二个是15-30。它的低质量轮廓是相似的更高的分辨率。 如果我在Galaxy Nexus上使用低调,它似乎工作正常。

随着Nexus 7,我不能探测CamcorderProfile的我不断收到空指针,这是奇怪的。 它说它支持4 FPS – 60 FPS。 如果我select你觉得应该工作的QUALITY_LOW,它会崩溃,我不能find它将使用的帧速率。 虽然错误涉及setProfile,所以我认为问题是与内置configuration文件。 当然,Android API的重点在于它的一致性,这是一个旗舰设备和FF相机是有video会议不是吗?

所以,虽然我已经在两个使用手动自定义设置的设备上工作,但是我看不到通过代码使其在多个设备上工作的明确方法。

看起来,Nexus S并没有按照它的Camera.getParameters()设置FPS的方式行事getSupportedPreviewFpsRange()

林都快乐,因为它使用自动FPS设置,但显然它不会与FF相机,所以我该怎么办? 我必须在Nexus S上明确设置FPS,在这种情况下,尽pipe相机告诉我它可以处理7.5 – 30 FPS,但是在1到15 FPS之间。

看起来好像setProfile在2.x中解决所有问题的承诺是完全正确的。

我可以理解,如果你写一个特定的ROM的相机应用程序,你只是定制到特定的硬件,这也许可以解释为什么人们似乎总是在自定义ROM上有错误的相机应用程序。 但…..如何下载的video录制应用程序的工作? 他们定制到每个设备?

这就是为什么没有Facebook的拨号和Twitter藤在Android上呢? :P

屎谷歌,跆拳道与您的相机API?

是否有人知道确定所有API 15+兼容设备的分辨率和帧率的最佳实践方法?

这甚至是可能的,或者我将在每个我testing的设备上写入自定义代码,然后在其他设备上掷骰子?

或者是Nexus S和Nexus 7只是怪胎事故?

请尝试使用QUALITY_LOW,因为Front Camera不支持QUALITY_HIGH。

我一直在努力几个小时-19的错误。 对我来说,答案是Madhava的回应,特别是mCamera.unlock();

即结合有关设置configuration文件的第一个答案,这个代码

  Camera cam = Camera.open(frontCamID); cam.unlock(); recorder.setCamera(cam); 

允许我从前置摄像头进行select和logging。

你应该看看这里http://developer.android.com/guide/topics/media/camera.html#capture-video

列出的命令的顺序非常重要。

我使用从这里的代码的第二个例子我怎样才能在Android上捕捉video录制?

并修改了开始录制function

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

我有同样的问题。 我纠正了什么原因后,我发现只有1个罪魁祸首,720×480分辨率这是默认的相机。 我改变了任何东西,是的,我可以很好地logging下来