Android MediaRecorder.prepare()做了什么?

时间:2017-05-06 07:55:05

标签: android mediarecorder

official Android documentation for MediaRecorder.prepare()说:

  

准备录像机以开始捕获和编码数据。在设置所需的音频和视频源,编码器,文件格式等之后,但必须在start()之前调用此方法。

完全它做了什么,为什么我们需要在开始捕获媒体数据之前调用它?

2 个答案:

答案 0 :(得分:0)

此函数(prepare())将创建一个随机访问文件流,以从具有指定名称的文件中读取,并可选择写入文件。 这是流处理所必需的。除非使用此功能,否则不会启动流处理。 see this doc.

答案 1 :(得分:0)

您可能需要在此处阅读源代码:enter image description here

代码的一瞥:

/**
 * Prepares the recorder to begin capturing and encoding data. This method
 * must be called after setting up the desired audio and video sources,
 * encoders, file format, etc., but before start().
 *
 * @throws IllegalStateException if it is called after
 * start() or before setOutputFormat().
 * @throws IOException if prepare fails otherwise.
 */
public void prepare() throws IllegalStateException, IOException
{
    if (mPath != null) {
        RandomAccessFile file = new RandomAccessFile(mPath, "rws");
        try {
            _setOutputFile(file.getFD(), 0, 0);
        } finally {
            file.close();
        }
    } else if (mFd != null) {
        _setOutputFile(mFd, 0, 0);
    } else {
        throw new IOException("No valid output file");
    }

    _prepare();
}

此处代码的原生部分:MediaRecorder.java:833

status_t MediaRecorder::prepare()
{
    ALOGV("prepare");
    if (mMediaRecorder == NULL) {
        ALOGE("media recorder is not initialized yet");
        return INVALID_OPERATION;
    }
    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
        ALOGE("prepare called in an invalid state: %d", mCurrentState);
        return INVALID_OPERATION;
    }
    if (mIsAudioSourceSet != mIsAudioEncoderSet) {
        if (mIsAudioSourceSet) {
            ALOGE("audio source is set, but audio encoder is not set");
        } else {  // must not happen, since setAudioEncoder checks this already
            ALOGE("audio encoder is set, but audio source is not set");
        }
        return INVALID_OPERATION;
    }

    if (mIsVideoSourceSet != mIsVideoEncoderSet) {
        if (mIsVideoSourceSet) {
            ALOGE("video source is set, but video encoder is not set");
        } else {  // must not happen, since setVideoEncoder checks this already
            ALOGE("video encoder is set, but video source is not set");
        }
        return INVALID_OPERATION;
    }

    status_t ret = mMediaRecorder->prepare();
    if (OK != ret) {
        ALOGE("prepare failed: %d", ret);
        mCurrentState = MEDIA_RECORDER_ERROR;
        return ret;
    }
    mCurrentState = MEDIA_RECORDER_PREPARED;
    return ret;
}