2015-02-19 19 views
7

Chcę nagrać surowy wideo h.264 bez dźwięku i ewentualnie HW przyspieszony (i przesyłać go później). Zdecydowałem się więc użyć MediaRecorder (i hackowania do przesyłania strumieniowego).MediaRecorder start kody błędów

Mam następujący kod:

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

i BAM! To z logcat:

E/MediaRecorder﹕ start failed: -38 

zacząłem googlowania i znaleźli mnóstwo pytań i odpowiedzi, ale nikt o kodzie błędu -38.

Więc spróbowałem spojrzeć na Androida source code i zauważyłem, że jest to metoda native i nie wiem, gdzie tego szukać.

Więc moje pytanie brzmi: jest jakiś wykaz tych kodów błędów, więc udało mi się znaleźć jaki błąd -38 środki `

Znany również tjat jestem kierowania API 10 (Gingerbread) oraz budynek z? ostatnie SDK 21.

+0

To naprawdę nie znaczy nic, niestety. Gdzieś kilka warstw w dół może być przydatny kod błędu, ale do czasu, w którym wypuszcza się do aplikacji, zawsze jest to prawie -38. Możesz znaleźć kilka przydatnych informacji, przeglądając nieco wynik logcat w poszukiwaniu innych błędów lub ostrzeżeń. – fadden

Odpowiedz

4

Dobra, myślę, że mam dla ciebie odpowiedź. Funkcja startu, która uległa awarii, jest zdefiniowana w pliku o nazwie mediarecorder.cpp. Znaleźć tutaj:

frameworks/av/media/libmedia/mediarecorder.cpp 

Ta funkcja startu zwraca zmienną typu status_t i odpowiada do błędu, że widzisz rzucony.

Teraz typ status_t jest zdefiniowana w pliku o nazwie Errors.h które można znaleźć tutaj:

system/core/include/utils/Errors.h 

Określa wyliczenie odpowiadający status_t jak widać tutaj:

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

jak ty można zobaczyć, niektóre z wartości tutaj są pobierane z errno.h, więc musimy tylko sprawdzić, który z nich ma wartość 38.

Zgodnie z this source, 38 odpowiada ENOSYS. Tak więc, jeśli spojrzymy na wyliczenie status_t, widzimy, że w Androidzie, ENOSYS odpowiada niepoprawnej operacji. Niezbyt pomocna, ale mam nadzieję, że to przynajmniej wskaże ci właściwy kierunek.

+0

#define ENOSYS 38/* Funkcja nie zaimplementowana */ – Bhargav

+0

Jak to rozwiązano? Utknąłem z tym samym błędem tutaj. – Mazolo

0

Ten kod błędu został spełniony w aplikacji rejestratora połączeń. ten kod błędu pojawi się w logcat, gdy uruchomisz rejestrator multimedialny, podczas gdy Microphone is in use w innej aplikacji, takiej jak Voice Assistant (na przykład: Ok google, itp.) Lub innej aplikacji nagrywania rozmów.