Pit*_*tel 7 android android-mediarecorder
我想录制没有声音的原始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();
Run Code Online (Sandbox Code Playgroud)
和bam!这在logcat中:
E/MediaRecorder? start failed: -38
Run Code Online (Sandbox Code Playgroud)
我开始谷歌搜索,发现了很多问题和答案,但没有关于我的错误代码-38.
所以我试着看看Android 源代码,并注意到它的native方法,我不知道在哪里寻找它.
所以我的一个大问题是:是否有一些错误代码列表,所以我可以找到错误的-38含义?`
也知道tjat我的目标是API 10(Gingerbread)并使用最新的SDK 21构建.
好吧,我想我有一个答案给你。失败的启动函数在名为mediarecorder.cpp. 在这里找到:
frameworks/av/media/libmedia/mediarecorder.cpp
Run Code Online (Sandbox Code Playgroud)
此 start 函数返回一个类型为 的变量status_t,并对应于您看到的抛出的错误。
现在,该类型status_t定义在一个名为的文件中,该文件Errors.h可以在这里找到:
system/core/include/utils/Errors.h
Run Code Online (Sandbox Code Playgroud)
这定义了一个对应于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,
};
Run Code Online (Sandbox Code Playgroud)
如您所见,这里的一些值取自errno.h,所以我们只需要看看哪个值等于 38。
根据该消息来源,38 对应于ENOSYS。所以,如果我们回顾status_t枚举,可以看到在android中,ENOSYS对应的是一个无效的操作。不是很有帮助,但我希望这至少可以为您指明正确的方向。
| 归档时间: |
|
| 查看次数: |
3120 次 |
| 最近记录: |