HarmonyOS鸿蒙Next ArkUI中如何获取mp4文件的第一帧图片

HarmonyOS鸿蒙Next ArkUI中如何获取mp4文件的第一帧图片 ArkUI中如何获取mp4文件的第一帧图片

4 回复

楼主你好,你可以参考以下代码:

this.#decoder = media.createMediaDecoder();
this.#decoder.on('frameAvailable', (decoderFrame) => { 
    //解码后续帧事件回调类型
    console.info('MediaDecoder[MediaDecoder] frameAvailable is called,'
        + 'size.width is :' + decoderFrame.size.width
        + ',size.height is :' + decoderFrame.size.height
        + ',时间戳:' + decoderFrame.pts
        + ',状态变化数据:' + decoderFrame.buffer
    );
});
this.#decoder.start(uri, mediaType); //uri:视频源,mediaType:0(video)、1(audio)
this.#decoder.seek(timeMs); //跳转到指定帧
this.#decoder.requestFrame(); //开始解码

详情请参考官网: https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-media-0000001103383404

更多关于HarmonyOS鸿蒙Next ArkUI中如何获取mp4文件的第一帧图片的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


欢迎开发小伙伴们进来帮帮楼主

在HarmonyOS鸿蒙Next中,使用ArkUI获取MP4文件的第一帧图片可以通过MediaExtractorImage组件实现。首先,使用MediaExtractor提取MP4文件的视频轨道,然后解码第一帧数据。具体步骤如下:

  1. 初始化MediaExtractor:

    let mediaExtractor = new media.MediaExtractor();
    mediaExtractor.setDataSource('path/to/your.mp4');
  2. 获取视频轨道:

    let trackIndex = -1;
    for (let i = 0; i < mediaExtractor.getTrackCount(); i++) {
        let format = mediaExtractor.getTrackFormat(i);
        if (format.getString(media.MediaFormat.KEY_MIME).startsWith('video/')) {
            trackIndex = i;
            break;
        }
    }
    if (trackIndex === -1) {
        throw new Error('No video track found');
    }
    mediaExtractor.selectTrack(trackIndex);
  3. 解码第一帧:

    let mediaCodec = media.MediaCodec.createDecoderByType('video/avc');
    let format = mediaExtractor.getTrackFormat(trackIndex);
    mediaCodec.configure(format, null, null, 0);
    mediaCodec.start();
    
    let bufferInfo = new media.BufferInfo();
    let inputBufferIndex = mediaCodec.dequeueInputBuffer(10000);
    if (inputBufferIndex >= 0) {
        let inputBuffer = mediaCodec.getInputBuffer(inputBufferIndex);
        let sampleSize = mediaExtractor.readSampleData(inputBuffer, 0);
        if (sampleSize > 0) {
            mediaCodec.queueInputBuffer(inputBufferIndex, 0, sampleSize, mediaExtractor.getSampleTime(), 0);
            mediaExtractor.advance();
        }
    }
    
    let outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 10000);
    if (outputBufferIndex >= 0) {
        let outputBuffer = mediaCodec.getOutputBuffer(outputBufferIndex);
        let image = media.Image.create(outputBuffer, format);
        // 使用Image组件显示或保存第一帧图片
        mediaCodec.releaseOutputBuffer(outputBufferIndex, true);
    }
  4. 释放资源:

    mediaCodec.stop();
    mediaCodec.release();
    mediaExtractor.release();

通过以上步骤,可以在ArkUI中获取并显示MP4文件的第一帧图片。

在HarmonyOS鸿蒙Next的ArkUI中,获取MP4文件的第一帧图片可以通过MediaMetadataRetriever类实现。首先,使用MediaMetadataRetriever加载MP4文件,然后调用getFrameAtTime()方法获取第一帧的Bitmap图像。最后,将Bitmap转换为Image组件可用的资源格式并显示。具体代码示例如下:

import media from '@ohos.multimedia.media';

let mediaMetadataRetriever = new media.MediaMetadataRetriever();
mediaMetadataRetriever.setSource('/path/to/your/video.mp4');
let bitmap = mediaMetadataRetriever.getFrameAtTime(0); // 获取第一帧
// 将bitmap转换为Image组件可用的资源并显示

确保在config.json中声明多媒体权限。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!