【发布时间】:2014-11-22 08:00:27
【问题描述】:
我是 Android 编程的新手,所以我在做研究项目时遇到了与视频相关的问题。在该项目中,我们想构建一个应用程序,该应用程序同时使用内置前置摄像头录制的视频和内置加速度计感应的加速度。
我的问题是这些视频的帧速率通常在 15 fps 到 30 fps 之间波动,即使我在源代码中将相机固定为 30 fps。我尝试关闭加速度计的数据流来测试帧率的一致性。然而,它仍然有波动。我在 Note 3、Galaxy S4 和 S5 中都测试过这个问题。
以下代码是我用来在我的设备中设置前置摄像头的函数
private boolean prepareVideoRecorder(String filename, boolean isFrontCam){
mCamera = Camera.open;
mMediaRecorder = new MediaRecorder();
if(mCamera == null) return false;
Camera.Size size = getBestPreviewSize(1280, 720, mCamera.getParameters());
if(IS_TABLET){
mCamera.setDisplayOrientation(0);
}else{
mCamera.setDisplayOrientation(90);
}
// Step 1: Unlock and set camera to MediaRecorder
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
// Step 2: Set sources
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mMediaRecorder.setOutputFormat(profile.fileFormat);
mMediaRecorder.setVideoEncoder(profile.videoCodec);
mMediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
mMediaRecorder.setVideoFrameRate(profile.videoFrameRate);
mMediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
// Step 4: Set output file
mMediaRecorder.setOutputFile(filename);
// Step 5: Set the preview output
mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());
if(isFrontCam){
if(IS_TABLET){
mMediaRecorder.setOrientationHint(180);
}else{
mMediaRecorder.setOrientationHint(270);
}
}
else{
if(IS_TABLET){
mMediaRecorder.setOrientationHint(0);
}else{
mMediaRecorder.setOrientationHint(90);
}
}
mMediaRecorder.setVideoSize(size.width, size.height);
mMediaRecorder.setVideoFrameRate(30);
// Step 6: Prepare configured MediaRecorder
try {
mMediaRecorder.prepare();
} catch (IllegalStateException e) {
Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
Toast.makeText(getBaseContext(), "IllegalStateException preparing MediaRecorder", Toast.LENGTH_SHORT).show();
releaseMediaRecorder();
return false;
} catch (IOException e) {
Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
Toast.makeText(getBaseContext(), "IOException preparing MediaRecorder", Toast.LENGTH_SHORT).show();
releaseMediaRecorder();
return false;
}
return true;
}
谁能向我解释为什么在编写与相机相关的 Android 应用程序时视频的帧速率会以这种方式波动?您可以建议我解决这个问题吗?我也在其他网站上阅读过这个主题,但不清楚且难以理解。
提前谢谢你。
【问题讨论】:
-
由于我认为我的问题与一般的Android知识有关,所以我没有在这里添加我的代码。我实际上并不寻求调试帮助,只是回答为什么在我融合加速度计的情况下录制时视频的帧速率总是会波动。谢谢。
标签: camera sensors frame-rate