【问题标题】:Delay in preparing media recorder on android延迟在 android 上准备媒体记录器
【发布时间】:2015-06-10 19:59:25
【问题描述】:

我正在 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;
}

【问题讨论】:

    标签: video android-mediarecorder


    【解决方案1】:

    所以 Instagram 也受到 MediaRecorder 延迟的影响。您可以知道何时进行快速点击。进度条重置。只有当你按住录制按钮超过一秒时,它才会真正捕捉到任何东西。

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

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

    或者,您可以将缓冲区传递给 ffmpeg 进行编码 - 请注意您在 ffmpeg 中构建的编解码器。 VP8 + vorbis 是我们见过的性能最好的免版税编解码器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多