2015-02-19 4 views
7

Я хочу записать необработанное видео h.264 без звука и, возможно, ускорить HW (и передать его позже). Поэтому я решил использовать MediaRecorder (и гнездо взломать для потоковой передачи).Коды ошибок запуска MediaRecorder

У меня есть следующий код:

final MediaRecorder recorder = new MediaRecorder(); 
final Camera camera = Camera.open(); 
camera.unlock(); 
recorder.setCamera(camera); 
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 
final CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW); 
recorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); 
recorder.setVideoFrameRate(profile.videoFrameRate); 
recorder.setVideoEncodingBitRate(profile.videoBitRate); 
recorder.prepare(); 
recorder.start(); 

и БАМ! Это в LogCat:

E/MediaRecorder﹕ start failed: -38 

Я начал прибегая к помощи, и нашел множество вопросов и ответов, но ни один мой код ошибки -38.

Итак, я попытался посмотреть на Android source code и заметил, что это метод native, и я не знаю, где его искать.

Так что мой большой вопрос: Есть ли какой-то список этих кодов ошибок, так что я мог найти то, что ошибка -38 средства `

знает Также tjat я таргетирование API 10 (Gingerbread) и здание с? последний SDK 21.

+0

Это, к сожалению, ничего не значит. Где-то несколько слоев там могут быть полезным кодом ошибки, но к тому моменту, когда он пузырится по пути к приложению, это почти всегда -38. Вы можете найти какую-то полезную информацию, немного оглядясь на вывод logcat для других ошибок или предупреждений. – fadden

ответ

4

Хорошо, я думаю, у меня есть ответ для вас. Функция запуска, которая работает с ошибкой, определяется в файле с именем mediarecorder.cpp. Найдено здесь:

frameworks/av/media/libmedia/mediarecorder.cpp 

Эта функция запуска возвращает переменную типа status_t, и соответствует ошибке, что вы видите, брошенной.

Теперь, тип status_t определен в файле Errors.h, который можно найти здесь:

system/core/include/utils/Errors.h 

Это определяет перечисление, которое соответствует status_t, как показано здесь:

enum { 
    OK    = 0, // Everything's swell. 
    NO_ERROR   = 0, // No errors. 

    UNKNOWN_ERROR  = 0x80000000, 

    NO_MEMORY   = -ENOMEM, 
    INVALID_OPERATION = -ENOSYS, 
    BAD_VALUE   = -EINVAL, 
    BAD_TYPE   = 0x80000001, 
    NAME_NOT_FOUND  = -ENOENT, 
    PERMISSION_DENIED = -EPERM, 
    NO_INIT    = -ENODEV, 
    ALREADY_EXISTS  = -EEXIST, 
    DEAD_OBJECT   = -EPIPE, 
    FAILED_TRANSACTION = 0x80000002, 
    JPARKS_BROKE_IT  = -EPIPE, 
#if !defined(HAVE_MS_C_RUNTIME) 
    BAD_INDEX   = -EOVERFLOW, 
    NOT_ENOUGH_DATA  = -ENODATA, 
    WOULD_BLOCK   = -EWOULDBLOCK, 
    TIMED_OUT   = -ETIMEDOUT, 
    UNKNOWN_TRANSACTION = -EBADMSG, 
#else  
    BAD_INDEX   = -E2BIG, 
    NOT_ENOUGH_DATA  = 0x80000003, 
    WOULD_BLOCK   = 0x80000004, 
    TIMED_OUT   = 0x80000005, 
    UNKNOWN_TRANSACTION = 0x80000006, 
#endif  
    FDS_NOT_ALLOWED  = 0x80000007, 
}; 

Как вам можно увидеть, некоторые из значений здесь взяты из errno.h, поэтому нам просто нужно увидеть, какой из них равен значению 38.

Согласно this source, 38 соответствует ENOSYS. Итак, если мы посмотрим на перечисление status_t, мы увидим, что в android ENOSYS соответствует недействительной операции. Не очень полезно, но я надеюсь, что это, по крайней мере, указывает на вас в правильном направлении.

+0

#define ENOSYS 38/* Функция не реализована */ – Bhargav

+0

Как это было разрешено? Я застрял с той же ошибкой здесь. – Mazolo

0

Я встречаю этот код ошибки в своем приложении для записи вызовов. этот код ошибки будет отображаться в logcat при запуске медиа-рекордера, в то время как Microphone is in use в другом приложении, таком как Voice Assistant (например: Ok google и т. Д.) Или другое приложение для записи вызовов.

Смежные вопросы