MediaRecorder启动错误代码

我想录制没有声音的原始h.264视频,并且可能硬件加速(并在稍后流式传输)。 所以我决定使用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

我开始使用Google,并发现了很多问题和答案,但没有一个关于我的错误代码-38

所以我试着看Android的源代码,并注意到它是native方法,我不知道在哪里寻找。

所以我最大的问题是: 是否有这些错误代码的列表,所以我可以找到什么错误-38意味着?

也知道tjat我瞄准API 10(姜饼)和建设与最新的SDK 21。


好的,我想我有一个答案给你。 失败的开始函数在名为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。

根据这个来源,38对应于ENOSYS 。 所以,如果我们回顾一下status_t枚举,我们可以看到在android中, ENOSYS对应于一个无效的操作。 不是非常有帮助,但我希望这至少可以让你朝正确的方向发展。


我在通话记录器应用程序中遇到了这个错误代码。 此错误代码将在logcat中显示,当您在其他应用程序(如语音助手)(如:谷歌等)或其他通话记录器应用程序Microphone is in use时启动媒体录制器。

链接地址: http://www.djcxy.com/p/83745.html

上一篇: MediaRecorder start error codes

下一篇: Disable callout (context menu) on mobile IE