Android Camera2 API 将流缓冲区发送到本机函数

格雷格

我试图了解如何处理视频和音频流,将帧数据放入缓冲区。我想在本机 JNI 函数中使用这些缓冲区。此代码正在准备将视频和音频写入 mp4 文件。我应该用什么来写入缓冲区?

...
private void setUpMediaRecorder() throws IOException {
    final Activity activity = getActivity();
    if (null == activity) {
        return;
    }
    mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    if (mNextVideoAbsolutePath == null || mNextVideoAbsolutePath.isEmpty()) {
        mNextVideoAbsolutePath = getVideoFilePath(getActivity());
    }
    mMediaRecorder.setOutputFile(mNextVideoAbsolutePath);
    mMediaRecorder.setVideoEncodingBitRate(10000000);
    mMediaRecorder.setVideoFrameRate(30);
    mMediaRecorder.setVideoSize(mVideoSize.getWidth(), mVideoSize.getHeight());
    mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
    mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
    int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
    switch (mSensorOrientation) {
        case SENSOR_ORIENTATION_DEFAULT_DEGREES:
            mMediaRecorder.setOrientationHint(DEFAULT_ORIENTATIONS.get(rotation));
            break;
        case SENSOR_ORIENTATION_INVERSE_DEGREES:
            mMediaRecorder.setOrientationHint(INVERSE_ORIENTATIONS.get(rotation));
            break;
    }
    mMediaRecorder.prepare();
}
埃迪·塔瓦拉

不太清楚您想要读取什么类型的缓冲区,但很可能您想要一个ImageReader

您可以使用 ImageFormat.YUV_420_888 进行设置,并将 Surface 与 CameraDevice 一起使用。然后它会生成 Image 对象,这些对象有 3 个平面,每个平面都有一个 ByteBuffer。您可以通过 JNI 传递 ByteBuffer 并使用 ByteBuffer JNI 方法在没有副本的情况下访问它。

请务必查看为每个平面记录的行和像素步幅,以便正确访问 ByteBuffer 数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章