媒体录制器启动错误代码

8

我想录制没有声音的原始h.264视频,并可能使用硬件加速(稍后进行流传输)。因此,我决定使用MediaRecorder(以及套接字hack进行流传输)。

我有以下代码:

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 源代码,并注意到它是一个本地方法,而我不知道在哪里查找。

因此,我有一个重要问题:是否有一些这些错误代码的列表,让我可以找到错误-38的含义?

还请注意,我正在针对API 10(姜饼)进行目标设置,并使用最新的SDK 21进行构建。


很遗憾,这并没有什么实际意义。可能在几层深处存在一些有用的错误代码,但是当它冒到应用程序时,它基本上总是-38。您可以通过回顾日志输出中的其他错误或警告来找到一些有用的信息。 - fadden
2个回答

6

好的,我认为我有一个答案可以告诉你。失败的启动函数定义在名为mediarecorder.cpp的文件中。它位于这里:

frameworks/av/media/libmedia/mediarecorder.cpp

这个start函数返回一个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对应于无效操作。虽然不是非常有用,但我希望至少能指引您朝着正确的方向前进。


#define ENOSYS 38 /* 函数未实现 */ - Bhargav
2
那么这个问题是如何解决的呢?我在这里也遇到了同样的错误。 - Mazolo

1

我在我的录音应用中遇到了这个错误代码。 当您启动媒体记录器时,如果麦克风正在另一个应用程序中使用,例如语音助手(例如:Ok Google等)或另一个通话录音应用程序,则此错误代码将显示在logcat中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接