好的,所以我终于让它工作了。
这个问题似乎肯定与Profile Settings
特别是Frame Rate
.
在我的主要测试设备 Nexus S 上,如果我探测相机,我会收到以下参数:
对于后置摄像头:
15 FPS 到 30 FPS,足够公平。
对于前置摄像头:
7.5 FPS 到 30 FPS,可以。
然后我检查我正在尝试使用的配置文件:
CamcorderProfile.QUALITY_HIGH
CamcorderProfile.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
质量_高:
audioBitRate:24000
audioChannels:1
audioCodec:AAC
audioSampleRate:16000
持续时间:60
fileFormat:MPEG_4
质量:1
videoBitRate:3000000
videoCodec:H264
videoFrameRate:30
videoFrameWidth:720
videoFrameHeight:480
显然,高质量配置文件适用于后置摄像头,因为正面只有 640x480。但他们都说 30 FPS。
现在....这是奇怪的:
如果我为后置摄像头设置任何帧速率,无论什么配置文件,它都会因可怕的崩溃而崩溃:
-19 错误
mediaRecorder.setVideoFrameRate(fpsInt);
这没什么大不了的,因为我不关心后置摄像头,但这很奇怪,考虑到配置文件默认为 30 并且Params
说他们接受 15-30。但是我尝试过的任何 int 值都没有奏效。如果我省略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,我不断收到空指针,这很奇怪。它说它支持 4 FPS - 60 FPS。如果我选择QUALITY_LOW
你认为它应该工作的那个,它就会崩溃,而且我找不到它可以工作的帧速率。虽然错误与setProfile
,所以我认为问题出在内置配置文件上。当然,Android API 的重点在于它是一致的,这是旗舰设备,FF 摄像头是用于视频会议的,不是吗??????
因此,虽然我使用手动自定义设置在其中两个设备上工作,但我看不到通过代码使其在多个设备上工作的明确方法。
似乎 Nexus S 在设置 FPS 方面并没有按照其承诺的方式行事Camera.getParameters().getSupportedPreviewFpsRange()
我很高兴它使用自动 FPS 设置,但显然它不会与 FF 相机一起使用,所以我该怎么办?我必须在 Nexus S 上明确设置 FPS,在这种情况下设置为 1 到 15 FPS,尽管相机告诉我它可以处理 7.5 - 30 FPS。
似乎setProfile
在 2.x 中修复所有问题的承诺并不完全正确。
我可以理解,如果您为特定 ROM 编写相机应用程序,您只是针对该特定硬件对其进行自定义,这可能解释了为什么人们似乎总是在自定义 ROM 上拥有错误的相机应用程序。但是.....可下载的视频录制应用程序如何工作?他们是为每个设备定制的吗?
这就是为什么 Android 上还没有 Facebook Poke 和 Twitter Vine 的原因???:P
谷歌,你的相机 API 是什么?
有谁知道确定所有API 15+
兼容设备的分辨率和帧速率的“最佳实践”?
这甚至可能吗,还是我要在我测试的每台设备上编写自定义代码,然后在其余设备上掷骰子?
或者 Nexus S 和 Nexus 7 只是意外事故?