HarmonyOS鸿蒙Next中相机开发如何录制连续的图片帧序列并记录各帧时间戳,且能设置录制帧率?

HarmonyOS鸿蒙Next中相机开发如何录制连续的图片帧序列并记录各帧时间戳,且能设置录制帧率? 在 Java 相机开发中,参照官方文档完成相机录制功能,成功录制 MP4 视频文件,但无法获取各个图像帧对应的时间戳,而且录制频率的设置并不成功,在 Recorder 对象属性构造时,设置 fps 和录制频率为 20,如下所示:

VideoProperty.Builder videoPropertyBuilder = new VideoProperty.Builder();
videoPropertyBuilder.setRecorderBitRate(10000000);
videoPropertyBuilder.setRecorderDegrees(90);
videoPropertyBuilder.setRecorderFps(20);
videoPropertyBuilder.setRecorderHeight(Math.min(SCREEN_HEIGHT, SCREEN_WIDTH));
videoPropertyBuilder.setRecorderWidth(Math.max(SCREEN_HEIGHT, SCREEN_WIDTH));
videoPropertyBuilder.setRecorderVideoEncoder(Recorder.VideoEncoder.H264);
videoPropertyBuilder.setRecorderRate(20);

可当使用 opencv (c++)解析录制的视频文件,显示视频帧率 fps 为 30,而且通过解析视频文件获取的图像帧时间戳是相对于第一帧的间隔时间,并且每一帧的间隔时间相同,似乎不是真正的图片帧时间戳。

请问,如果需要录制连续时间的图片帧序列,记录各个图片帧时间戳,并且实现帧率设置,应该怎么做呢?


更多关于HarmonyOS鸿蒙Next中相机开发如何录制连续的图片帧序列并记录各帧时间戳,且能设置录制帧率?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

在相机配置中关联帧回调对象,同时对 previewSurface (预览)和 recorderSurface (录制),采用 RECORDER 类型的 FrameConfig.Builder 模型,建立两个 FrameConfig 对象,并使用 triggerLoopingGroupCatpute 方法循环捕获;

在帧回调对象函数 onFrameStarted 中利用回调参数 frameConfig.getCoordinateSurface() == recorderSurface 判断该帧属于 recorderSurface 回调,记录时间即可。

当然在使用 triggerLoopingGroupCatpute 中,录制帧率设置为 30 fps,实际的录制的 mp4 帧率为 15 fps,似乎受到 previewSurface 影响,当相机配置中仅有 recorderSurface 时,则 mp4 帧率符合设置帧率 (30 fps)。

更多关于HarmonyOS鸿蒙Next中相机开发如何录制连续的图片帧序列并记录各帧时间戳,且能设置录制帧率?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,相机开发可以通过CameraKit来实现录制连续的图片帧序列并记录各帧时间戳。首先,使用CameraKit初始化相机实例,并通过CameraConfig设置相机参数,包括帧率。然后,通过FrameReceiver接口监听每一帧的图像数据,并在回调中获取时间戳。你可以使用Frame对象的getTimestamp()方法获取当前帧的时间戳。最后,将图像数据和时间戳保存到指定位置。具体代码实现如下:

import camera from '@ohos.camera';
import image from '@ohos.multimedia.image';

let cameraKit = camera.getCameraKit();
let cameraConfig = {
    frameRate: 30 // 设置帧率为30fps
};
let cameraInstance = cameraKit.createCamera(cameraConfig);

let frameReceiver = {
    onFrameReceived: (frame) => {
        let timestamp = frame.getTimestamp();
        let imageBuffer = frame.getImageBuffer();
        // 保存图像数据和时间戳
        saveImageAndTimestamp(imageBuffer, timestamp);
    }
};

cameraInstance.setFrameReceiver(frameReceiver);
cameraInstance.start();

function saveImageAndTimestamp(imageBuffer, timestamp) {
    // 保存图像数据和时间戳的逻辑
}

在HarmonyOS鸿蒙Next中,使用CameraKit进行相机开发时,可以通过Frame类获取连续的图片帧序列。首先,配置CameraConfig设置帧率,然后通过FrameReceiver监听帧数据,在onFrameReceived回调中获取每一帧的Frame对象,并记录时间戳。示例代码如下:

CameraConfig config = new CameraConfig.Builder()
    .setFrameRate(30) // 设置帧率
    .build();

FrameReceiver receiver = new FrameReceiver() {
    @Override
    public void onFrameReceived(Frame frame) {
        long timestamp = frame.getTimestamp(); // 获取时间戳
        // 处理帧数据
    }
};

CameraKit.getInstance().setCameraConfig(config);
CameraKit.getInstance().addFrameReceiver(receiver);

通过这种方式,可以实现连续帧序列的录制与时间戳记录。

回到顶部