好的,我终于让它正常工作了。
问题似乎与 Profile Settings
有关,特别是与 Frame Rate
相关。
在 Nexus S上,我的主要测试设备上,如果我探测摄像头,会得到以下参数:
对于后置摄像头:
15 FPS 至 30 FPS,很好。
对于前置摄像头:
7.5 FPS 至 30 FPS,不错。
然后我检查我想要使用的资料:
CamcorderProfile.QUALITY_HIGH
CamcorderProfile.QUALITY_LOW
QUALITY_LOW:
audioBitRate: 12200
audioChannels: 1
audioCodec: AMR_NB
audioSampleRate: 8000
duration: 30
fileFormat: THREE_GPP
quality: 0
videoBitRate: 256000
videoCodec: H264
videoFrameRate: 30
videoFrameWidth: 176
videoFrameHeight: 144
QUALITY_HIGH:
audioBitRate: 24000
audioChannels: 1
audioCodec: AAC
audioSampleRate: 16000
duration: 60
fileFormat: MPEG_4
quality: 1
videoBitRate: 3000000
videoCodec: H264
videoFrameRate: 30
videoFrameWidth: 720
videoFrameHeight: 480
显然,高质量的配置文件适用于后置摄像头,因为前置摄像头只有640x480。但它们都指定了30 FPS。
现在.... 这里奇怪的是:
如果我为后置摄像头设置任何帧率,无论使用哪个配置文件,它都会崩溃并出现可怕的错误:
-19 错误
mediaRecorder.setVideoFrameRate(fpsInt)
这不是什么大问题,因为我并不关心后置相机,但它很奇怪,考虑到配置文件默认为30,而Params
说它们接受15-30。但我试过的所有整数值都没用。如果我省略setVideoFrameRate
,那就没问题。
无论如何,我们来谈谈前置摄像头。
所以,如果我使用QUALITY_LOW
配置文件,并将帧速率设置为15或更低,它就能神奇地工作。
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_LOW))
mediaRecorder.setVideoFrameRate(15)
实际上,任何值都可以,从1到15都可以。这似乎很奇怪。
所以问题来了,我可能可以探测分辨率并选择适当的分辨率来适配大多数摄像头,虽然我也相当自信,至少前置摄像头可以支持VGA 640x480。
但是,帧率应该如何处理呢?
在Nexus S的情况下,我没有看到任何可以确定15或更低值的方法,除非只是猜测?
我应该始终使用由相机返回的最低帧率吗?
我查看了Galaxy Nexus,它有3个帧率范围,第一个是15-15,第二个是15-30。虽然它的低质量配置文件类似但分辨率更高。如果我在Galaxy Nexus上使用低配置文件,似乎也能正常工作。
对于Nexus 7,我无法探测CamcorderProfile,一直得到null指针,这很奇怪。
它说它支持4 FPS - 60 FPS。
如果我选择
QUALITY_LOW
,你会认为它应该可以工作,但它会崩溃,我找不到一个可以工作的帧率。
尽管错误与
setProfile
相关,所以我认为问题在内置属性上。
Android API的目的显然是一致的,这是旗舰设备,FF相机是用于视频会议的,不是吗???
因此,尽管我已经成功地在两个设备上使用手动自定义设置,但我无法找到一种清晰明确的方法通过代码实现跨多个设备的工作。
看起来Nexus S并没有按照
Camera.getParameters().getSupportedPreviewFpsRange()
所承诺的那样处理设置FPS的方式。
我愿意让它使用自动FPS设置,但显然它无法在FF相机上使用,那么我该怎么办呢?我必须在Nexus S上明确设置FPS,在这种情况下,可以任意选择1到15 FPS,尽管相机告诉我它支持7.5-30 FPS。
看来2.x中
setProfile
解决所有问题的承诺并不完全正确。
我可以理解,如果你正在为特定的ROM编写相机应用程序,你只需要将其定制为特定的硬件,这可能解释了为什么人们似乎总是在定制的ROM上出现有缺陷的相机应用程序。但是......可下载的录像应用程序如何工作?它们针对每个设备进行定制吗?
这难道就是为什么在Android上还没有Facebook Poke和Twitter Vine吗? :P
谷歌,你的相机API怎么了?
有没有人知道确定所有
API 15+
兼容设备的分辨率和帧率的“最佳实践”?
这是否可能,还是我将在测试每个设备时编写自定义代码,然后在其余设备上随机运行?或者Nexus S和Nexus 7只是偶然事件?