Как настроить MediaRecorder для получения эффекта наилучшего качества видео?

#java #android #encoding #camera

#java #Android #кодирование #камера

Вопрос:

Ребята, кто-нибудь может мне сказать, как я должен установить параметры в MediaRecorder , чтобы получить наилучший эффект записи видео, возможный с помощью кодирования, без учета физических ограничений телефона? Или есть какой-либо эффект небольшого искажения вида, вызванный моим кодированием MediaRecorder ?

Если кто-то из вас может догадываться о неясных параметрах, я на самом деле устанавливаю некоторые параметры с помощью настроек. Каких параметров мне не хватает, которые могли бы помочь улучшить процесс кодирования видео, например: частоты кадров

Комментарии:

1. Вы говорите о качестве? Это зависит от устройства к устройству в зависимости от базовых кодеков и камеры, но попробуйте сменить видеокодер на H264 и увеличить разрешение, посмотрим, поможет ли это..

2. @Ravi привет, просто чтобы убедиться, какая часть моего кода действительно обрабатывает кодировку и разрешение?

3. Вам нужно будет установить разрешение, используя void setVideoSize(int width, int height) и кодировку public void setVideoEncoder (int video_encoder) , в экземпляре класса MediaRecorder. Проверьте документацию MediaRecorder здесь

Ответ №1:

В зависимости от уровня API вы можете захотеть использовать существующие профили или нет.

Без профилей:

 recorder.setVideoSize(640, 480);
recorder.setVideoFrameRate(16); //might be auto-determined due to lighting
recorder.setVideoEncodingBitRate(3000000);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);// MPEG_4_SP
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  

Или если вы хотите использовать существующие профили

 CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(cpHigh);
  

Пожалуйста, обратите внимание, что вы не можете использовать оба варианта вместе, так как вы получите ошибки или ваш prepare не будет работать

Поскольку не все Android API и / или устройства поддерживают одинаковые значения, вам придется либо запрашивать максимальные значения для каждого устройства, либо найти что-то, что работает везде.

Комментарии:

1. Примечание: Вы должны удалить setOutputFormat() , setVideoEncodingBitRate() , setAudioEncodingBitRate() setVideoEncoder() , setAudioEncoder() setAudioSamplingRate() ,,,,,,,,,,,,,, setVideoFrameRate()

2. встроен ли CamcorderProfile в somehwre? не определено в Chrome Windows 7 (почти) последней версии

Ответ №2:

Хотя вопрос довольно старый, я хотел бы указать на комбинацию, которую я использовал для записи видео высокого качества.

Используйте приведенную ниже комбинацию кода для достижения видео высокого качества.

 CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);                    
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);                        
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);                        
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mMediaRecorder.setVideoSize(DISPLAY_WIDTH, DISPLAY_HEIGHT);                    
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);                    
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);                    
mMediaRecorder.setVideoEncodingBitRate(cpHigh.videoBitRate);                    
mMediaRecorder.setVideoFrameRate(cpHigh.videoFrameRate);
int rotation = mWindowManager.getDefaultDisplay().getRotation();
int orientation = ORIENTATIONS.get(rotation   90);
mMediaRecorder.setOrientationHint(orientation);
  

Используйте приведенный ниже код, чтобы получить DISPLAY_HEIGHT,DISPLAY_WIDTH

 DisplayMetrics metrics = new DisplayMetrics();      
mWindowManager.getDefaultDisplay().getMetrics(metrics);          
DISPLAY_WIDTH = metrics.widthPixels;
DISPLAY_HEIGHT = metrics.heightPixels;
  

Определите ОРИЕНТАЦИИ, как показано ниже

 public static final SparseIntArray ORIENTATIONS = new SparseIntArray();
static {
    ORIENTATIONS.append(Surface.ROTATION_0, 90);
    ORIENTATIONS.append(Surface.ROTATION_90, 0);
    ORIENTATIONS.append(Surface.ROTATION_180, 270);
    ORIENTATIONS.append(Surface.ROTATION_270, 180);
}
  

Надеюсь, это поможет.

Комментарии:

1. что такое переменная ORIENTATIONS?

2. @Vodet пожалуйста, проверьте обновленный код .. извините за задержку ответа

3. Проблема в том, что вы не знаете, поддерживает ли устройство размер видео, указанный @ CamcorderProfile.QUALITY_HIGH .

4. Как насчет высококачественного звука?

5. @mickecast качество не имеет видимой разницы.