2014-11-22 3 views
1

Я новый ребенок в программировании на Android, так что перед выполнением своего исследовательского проекта перед лицом проблем с видео. В проекте мы хотели бы создать приложение, которое использует как видео, записанное встроенной передней камерой, так и ускорение, воспринимаемое встроенным акселерометром.Почему частота кадров камеры колеблется при слиянии другого датчика?

Моя проблема в том, что частота кадров этих видеороликов обычно колеблется от 15 до 30 кадров в секунду, хотя я установил камеру в 30 кадров в секунду в исходном коде. Я попытался закрыть поток данных акселерометра, чтобы проверить согласованность частоты кадров. Однако он все еще колебался. Я тестировал эту проблему как в Note 3, Galaxy S4, так и в S5.

Следующий код является функцией I используется для настройки передней камеры в моих устройствах

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 связанные с камерой? Есть ли решение для этой проблемы, которое вы можете мне предложить? Я читал эту тему и на других сайтах, но мне непонятно и трудно понять.

Заранее спасибо.

+0

Поскольку я думаю, что мой вопрос связан с общим знанием Android, я не добавил сюда свой код. Я действительно не ищу отладочную помощь, просто ответ на вопрос, почему частота кадров видео всегда колеблется при записи в моем случае слияния акселерометра. Благодарю. –

ответ

0

Я только что исправил эту проблему, используя setAutoExposureLock (true) и setAutoWhiteBalanceLock (true) для Camera.Parameters. После некоторых попыток поиска я обнаружил, что причина, по которой частота кадров колеблется, была связана с состоянием света ... так как управление экспозицией камеры.

Прилагаемый код, который я использую ниже.

Camera.Parameters params = mCamera.getParameters(); 
params.setAutoExposureLock(true); 
params.setAutoWhiteBalanceLock(true); 
mCamera.setParameters(params); 
Смежные вопросы