我想录制没有声音的原始h.264视频,并且可能加速HW(并稍后流式传输)。所以我决定使用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();
和bam!这在logcat:
E/MediaRecorder﹕ start failed: -38
我开始谷歌搜索,发现了很多问题和答案,但没有关于我的错误代码-38
。
所以我试着看看Android source code,并注意到它的native
方法,而且我不知道在哪里寻找它。
所以我的大问题是:是否有一些错误代码列表,所以我可以找到错误-38
的含义?
也知道我正在以API 10(Gingerbread)为目标并使用最新的SDK 21构建。
答案 0 :(得分:4)
好吧,我想我有一个答案。失败的启动函数在名为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
对应一个无效的操作。不是很有帮助,但我希望这至少能指出你正确的方向。
答案 1 :(得分:0)
我在通话记录器应用中遇到了此错误代码。
当您启动媒体录制器时,此错误代码将显示在logcat中,而另一个应用中的 Microphone is in use
(如语音助手)(例如:Ok google等)或其他呼叫记录器应用程序。