2015-02-19 21 views
7

Voglio registrare video raw h.264 senza audio e possibilmente accelerato in HW (e riprodurlo in un secondo momento). Così ho deciso di utilizzare MediaRecorder (e lo zoccolo per lo streaming).MediaRecorder start codici di errore

Ho il seguente codice:

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(); 

e BAM! Questo in logcat:

E/MediaRecorder﹕ start failed: -38 

ho iniziato googling, e ha trovato un sacco di domande e risposte, ma nessuno del mio codice di errore -38.

Così ho provato a guardare Android source code, e ho notato che è il metodo , e non so dove cercarlo.

Quindi la mia grande domanda è: c'è qualche elenco di tali codici di errore, così ho potuto trovare ciò errore -38 mezzi `

sanno anche Tjat ho scelto come target API 10 (pan di zenzero) e la costruzione con? ultimo SDK 21.

+0

In realtà non significa nulla, sfortunatamente. Da qualche parte diversi livelli laggiù possono essere un utile codice di errore, ma quando bolle verso l'app è praticamente sempre -38. Potresti riuscire a trovare alcune informazioni utili guardando indietro un po 'nell'output del logcat per altri errori o avvisi. – fadden

risposta

4

OK, penso di avere una risposta per te. La funzione di avvio che sta fallendo è definita in un file chiamato mediarecorder.cpp. Trovato qui:

frameworks/av/media/libmedia/mediarecorder.cpp 

Questa funzione di avvio restituisce una variabile di tipo status_t, e corrisponde a l'errore che si sta vedendo gettato.

Ora, il tipo status_t è definito in un file chiamato Errors.h che può essere trovato qui:

system/core/include/utils/Errors.h 

Definisce un'enumerazione che corrisponde a status_t come si vede qui:

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, 
}; 

Come si può vedere, alcuni dei valori qui sono presi da errno.h, quindi abbiamo solo bisogno di vedere quale equivale ad un valore di 38.

Secondo this source, 38 corrisponde a ENOSYS. Quindi, se guardiamo indietro all'enumerazione status_t, possiamo vedere che in Android, ENOSYS corrisponde a un'operazione non valida. Non è molto utile, ma spero che questo almeno ti metta nella giusta direzione.

+0

#define ENOSYS 38/* Funzione non implementata */ – Bhargav

+0

Come è stato risolto? Sono bloccato con lo stesso errore qui. – Mazolo

0

Ho riscontrato questo codice di errore nell'app Registratore di chiamata. questo codice di errore verrà visualizzato in logcat quando si avvia il registratore multimediale mentre lo Microphone is in use in un'altra app come un Assistente vocale (ad esempio: Ok google, ecc.) O un'altra applicazione di registratore di chiamata.