【问题标题】:MediaRecorder start error codesMediaRecorder 启动错误代码
【发布时间】:2015-04-21 00:21:44
【问题描述】:

我想录制没有声音的原始 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 source code,发现它是native 方法,我不知道在哪里可以找到它。

所以我的大问题是:是否有一些错误代码列表,所以我可以找到错误-38 的含义?`

还知道我的目标是 API 10(Gingerbread)并使用最新的 SDK 21 进行构建。

【问题讨论】:

  • 不幸的是,这并不意味着什么。几层之下的某个地方可能有一个有用的错误代码,但当它冒泡到应用程序时,它几乎总是-38。您可以通过查看 logcat 输出中的其他错误或警告来找到一些有用的信息。

标签: android android-mediarecorder


【解决方案1】:

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

根据this source,38对应ENOSYS。所以,如果我们回头看 status_t 枚举,我们可以看到在 android 中,ENOSYS 对应一个无效操作。不是很有帮助,但我希望这至少可以为您指明正确的方向。

【讨论】:

  • #define ENOSYS 38 /* 功能未实现 */
  • 当时是如何解决的?我在这里遇到了同样的错误。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-07-30
    • 2018-09-02
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多