延迟准备Android上的媒体记录器

时间:2014-08-22 04:43:46

标签: video android-mediarecorder

我将在10秒内录制多个小视频。在创建任何视频之前,我需要一次又一次地准备和启动媒体录制器。因此,每个视频中存在一到两秒的时间滞后。 有没有办法避免像Instagram这样的媒体录音机的这种时间延迟?

public boolean startRecording() {

    startCamera();
    camera.unlock();

    int rotation = 0;
    cameraInfo = new CameraInfo();
    Camera.getCameraInfo(cameraId, cameraInfo);
    if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
        rotation = 270;
    } else {
        rotation = 90;
    }

    mMediaRecorder = new MediaRecorder();
    mMediaRecorder.setOrientationHint(rotation);
    mMediaRecorder.setCamera(camera);
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setVideoFrameRate(30); 
    mMediaRecorder.setVideoEncodingBitRate(1500000);
    mMediaRecorder.setVideoSize(640, 480);
    File f = new File(cVideoFilePath);
            int countNames = 1;
    String[] fileNameList = null;
    fileNameList = f.list();
    for (int i = 0; i < fileNameList.length; i++) {

        if (fileNameList[i].contains("TapVid")) {
            countNames++;
        }

    }

    updatedFileNumber = countNames;
    prRecordedFile = new File(cVideoFilePath + "Vid" + updatedFileNumber
            + ".mp4");
    mMediaRecorder.setOutputFile(prRecordedFile.getPath());

    mMediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());

    try {
        mMediaRecorder.prepare();

        mMediaRecorder.start();
    } catch (Exception e) {
        e.printStackTrace();
        releaseMediaRecorder();
        return false;
    }


    return true;
}

1 个答案:

答案 0 :(得分:4)

所以Instagram也遭受了MediaRecorder的延迟。你可以告诉你什么时候快速点击。进度条重置。只有当你持有记录按钮的时间超过一秒时,它才真正捕获任何东西。

这只是MediaRecorder的一个固有缺陷。解决这个问题的唯一方法是使用setPreviewCallbackWithBuffer API。在使用此API时,您可以为摄像机提供缓冲区以显示预览,并使用它在预览曲面上显示的YUV帧回调给您。然后,您可以将此缓冲区传递给MediaCodec以对视频进行编码。

理想情况下,OEM已实施MediaCodec以了解从相机传递的缓冲区,但我们在4.3之前的许多设备上看到了不稳定的性能。例如,期望与相机不同的对齐和YUV格式的随机MediaCodec实现。您还必须自己捕获音频并保持AV同步。

或者你可以将缓冲区传递给ffmpeg进行编码 - 只需要注意你构建到ffmpeg中的编解码器。 VP8 + vorbis是我们见过的性能最佳的免版税编解码器。