Ошибка запуска MediaRecorder: -16

Итак, я понимаю, что существует множество решений для ошибок запуска MediaRecorder, однако большинство из них вращаются вокруг «неудачного запуска: -19», который был связан с «NO_INIT» См. комментарии к выбранному ответу здесь. Я не нашел никакого решения или даже объяснения для -16.

Если кто-то знает, где я могу найти названия этих кодов ошибок, или у кого-то есть решение для кода -16, пожалуйста, поместите ответ здесь!! Вот код, который я использую. (HTC Thunderbolt, стоковый)

mr.setVideoSource(MediaRecorder.VideoSource.CAMERA); //mr is my mediaRecorder
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mr.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mr.setOutputFile(ParcelFileDescriptor.fromSocket(soc).getFileDescriptor());  //soc is a java.net.ServerSocket pointing to a port on the device

mr.setVideoSize(480,800);
mr.setVideoFrameRate(5);
mr.prepare();
mr.start(); //Crashes with "start failed: -16"

ЛОГКАТ

07-11 10:14:34.879: V/MediaRecorderJNI(17939): JNIMediaRecorderListener::setCamera
07-11 10:14:34.879: V/MediaRecorderJNI(17939): process_media_recorder_call
07-11 10:14:47.549: V/MediaRecorderJNI(17939): setVideoSource(1)
07-11 10:14:47.549: V/MediaRecorderJNI(17939): getMediaRecorder E
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setAudioSource(1)
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setOutputFormat(0)
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setVideoEncoder(0)
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setAudioEncoder(0)
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setVideoFrameRate(5)
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call
07-11 10:14:47.559: V/MediaRecorderJNI(17939): setOutputFile
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call
07-11 10:14:47.559: V/MediaRecorderJNI(17939): prepare
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E
07-11 10:14:47.559: V/MediaRecorderJNI(17939): process_media_recorder_call
07-11 10:14:47.559: V/MediaRecorderJNI(17939): start
07-11 10:14:47.559: V/MediaRecorderJNI(17939): getMediaRecorder E
07-11 10:14:47.639: E/MediaRecorder(17939): start failed: -16
07-11 10:14:47.639: V/MediaRecorderJNI(17939): process_media_recorder_call
07-11 10:14:59.290: W/dalvikvm(17939): threadid=10: thread exiting with uncaught exception (group=0x4001d5a0)

ОБНОВЛЕНИЕ 11.07.12, 14:21: обнаружил, что код ошибки -16 на самом деле -EBUSY. После расширения LogCat, чтобы включить все, и тщательно прочесать исходный код Android, я обнаружил, что это связано с невозможностью настроить (инициализировать) настройки камеры, я не уверен, что я делаю неправильно, но это начало. Если у вас есть доступ к AOSP, вы можете увидеть, что ошибка возникает из /frameworks/av/media/libstagefright/CameraSource.cpp CameraSource::ConfigureCamera


person vosmith    schedule 11.07.2012    source источник


Ответы (1)


Я столкнулся с этой ошибкой (-16 при запуске) и обнаружил, что она вызвана использованием неподдерживаемого разрешения.

Сначала вы должны получить оптимальный размер из поддерживаемых размеров.

Parameters params = camera.getParameters();
        List<Size> sizes = params.getSupportedPreviewSizes();
        optimalSize = getOptimalPreviewSize(sizes, width, height);
params.setPreviewSize(optimalSize.width, optimalSize.height);

Затем убедитесь, что вы установили одинаковый размер для предварительного просмотра и видео (если бы они были разными, в моем опыте предварительный просмотр завис бы при запуске видеозаписи):

mediaRecorder.setVideoSize(optimalSize.width, optimalSize.height);

(пример кода для getOptimalPreviewSize взят из Android SDK)

private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
    final double ASPECT_TOLERANCE = 0.1;
    double targetRatio = (double) w / h;
    if (sizes == null) return null;

    Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;

    int targetHeight = h;

    // Try to find an size match aspect ratio and size
    for (Size size : sizes) {
        double ratio = (double) size.width / size.height;
        if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
        if (Math.abs(size.height - targetHeight) < minDiff) {
            optimalSize = size;
            minDiff = Math.abs(size.height - targetHeight);
        }
    }

    // Cannot find the one match the aspect ratio, ignore the requirement
    if (optimalSize == null) {
        minDiff = Double.MAX_VALUE;
        for (Size size : sizes) {
            if (Math.abs(size.height - targetHeight) < minDiff) {
                optimalSize = size;
                minDiff = Math.abs(size.height - targetHeight);
            }
        }
    }
    return optimalSize;
}  
person Scott Chamberlin    schedule 17.01.2013
comment
Я все еще получаю сообщение об ошибке. Мой вопрос опубликован stackoverflow.com/questions/15964349/ - person Ahmed Nawaz; 12.04.2013
comment
Убедитесь, что вы установили для предварительного просмотра и видео одинаковый размер (если бы они были разными в моем опыте, предварительный просмотр завис бы при начале записи видео): Это решило мою проблему, спасибо. - person Zain Ali; 16.01.2017