2015-02-19 16 views
7

Tôi muốn ghi lại video h.264 thô không có âm thanh và có thể HW tăng tốc (và phát trực tuyến sau). Vì vậy, tôi quyết định sử dụng MediaRecorder (và ổ cắm hack để phát trực tuyến).Mã lỗi bắt đầu MediaRecorder

Tôi có đoạn mã sau:

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

Và bam! Điều này trong logcat:

E/MediaRecorder﹕ start failed: -38 

Tôi bắt đầu googling, và tìm thấy rất nhiều câu hỏi và câu trả lời, nhưng không có gì về mã lỗi của tôi -38.

Vì vậy, tôi đã cố gắng xem Android source code và nhận thấy đó là phương pháp native và tôi không biết phải tìm kiếm ở đâu.

Vì vậy, câu hỏi lớn của tôi là: Có một số danh sách những mã lỗi, vì vậy tôi có thể tìm thấy những gì lỗi -38 phương tiện '

Cũng biết tjat Tôi đang nhắm mục tiêu API 10 (Gingerbread) và xây dựng với? SDK mới nhất 21.

+0

Thật không có ý nghĩa gì cả. Một nơi nào đó một số lớp xuống có thể có một mã lỗi hữu ích, nhưng vào thời điểm nó bong bóng theo cách của nó ra các ứng dụng nó khá nhiều luôn luôn -38. Bạn có thể tìm thấy một số thông tin hữu ích bằng cách nhìn lại một chút trong đầu ra logcat cho các lỗi hoặc cảnh báo khác. – fadden

Trả lời

4

Được rồi, tôi nghĩ tôi có câu trả lời cho bạn. Hàm khởi động thất bại được định nghĩa trong một tệp có tên là mediarecorder.cpp. Đã tìm thấy ở đây:

frameworks/av/media/libmedia/mediarecorder.cpp 

Chức năng bắt đầu này trả về biến loại status_t và tương ứng với lỗi bạn đang thấy bị ném.

Bây giờ, loại status_t được định nghĩa trong một tập tin gọi Errors.h có thể tìm thấy ở đây:

system/core/include/utils/Errors.h 

này định nghĩa một đếm tương ứng với status_t như đã thấy ở đây:

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

Như bạn có thể thấy, một số giá trị ở đây được lấy từ errno.h, vì vậy chúng tôi chỉ cần xem giá trị nào tương đương với giá trị là 38.

Theo this source, 38 tương ứng với ENOSYS. Vì vậy, nếu chúng ta nhìn lại điều kiện status_t, chúng ta có thể thấy rằng trong android, ENOSYS tương ứng với một hoạt động không hợp lệ. Không hữu ích khủng khiếp, nhưng tôi hy vọng điều này ít nhất là điểm bạn đi đúng hướng.

+0

#define ENOSYS 38/* Chức năng không được triển khai */ – Bhargav

+0

Giải pháp này được giải quyết như thế nào? Tôi bị mắc kẹt với cùng một lỗi ở đây. – Mazolo

0

Tôi đã gặp mã lỗi này trong ứng dụng trình ghi âm cuộc gọi của mình. mã lỗi này sẽ hiển thị trong logcat khi bạn bắt đầu ghi phương tiện trong khi Microphone is in use trong một ứng dụng khác như Trợ lý thoại (ví dụ: Ok google, v.v.) hoặc ứng dụng trình ghi cuộc gọi khác.

Các vấn đề liên quan