HarmonyOS鸿蒙Next中如何获取沙箱目录下视频的首帧图片?现象:视频录制之后,获取不到首帧图片,视频预览页面黑屏了。

HarmonyOS鸿蒙Next中如何获取沙箱目录下视频的首帧图片?现象:视频录制之后,获取不到首帧图片,视频预览页面黑屏了。 请问如何获取沙箱目录下视频的首帧图片? 现象:视频录制之后,获取不到首帧图片,视频预览页面黑屏了。

3 回复

参考demo

import { media } from '@kit.MediaKit';
import { image } from '@kit.ImageKit';
import { fileIo } from '@kit.CoreFileKit';

const TAG = 'MetadataDemo'

let context = getContext(this)

let filesDir = context.filesDir

let filePath = filesDir + "/" + "test.mp4"

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  
  @State pixelMap: image.PixelMap | undefined = undefined;

  build() {
    Row() {
      Column() {
        Text('保存到沙箱路径').fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {
          context.resourceManager.getRawFile("test.mp4", (err, value) => {
            let file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);
            console.log(`${value.buffer.byteLength}`)
            fileIo.writeSync(file.fd, value.buffer)
            fileIo.closeSync(file.fd)
          })
        })
        
        Button('获取封面')
          .type(ButtonType.Capsule)
          .margin({ top: 20 })
          .backgroundColor('#0D9FFB')
          .width('60%')
          .height('5%')
          .onClick(() => {
            this.testFetchFrame()
          })

        Image(this.pixelMap).width(300).height(300)
          .margin({ top: 20 })
      }
      .width('100%')
    }
    .height('100%')
  }

  async testFetchFrame() {
    let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator()
    
    let file = fileIo.openSync(filePath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);
    let dataSrc: media.AVFileDescriptor = {
      fd: file.fd,
    }
    
    avImageGenerator.fdSrc = dataSrc
    
    let timeUs = 0
    let queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC
    let param: media.PixelMapParams = {
      width: 300,
      height: 300
    }
    
    this.pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, queryOption, param)
    
    avImageGenerator.release()
    
    console.info(TAG, `release success.`)
  }
}

文档链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-media-V5#fetchframebytime12

更多关于HarmonyOS鸿蒙Next中如何获取沙箱目录下视频的首帧图片?现象:视频录制之后,获取不到首帧图片,视频预览页面黑屏了。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,获取沙箱目录下视频的首帧图片可以通过AVMetadataHelper类来实现。首先,使用AVMetadataHelper初始化并设置数据源为沙箱目录下的视频文件路径。然后,调用getFrameAtTime方法获取视频的首帧图片,该方法返回一个PixelMap对象。如果获取失败,检查视频文件路径是否正确,以及视频文件是否损坏。若视频预览页面黑屏,可能是由于获取的首帧图片为空或渲染失败,需确保PixelMap对象正确传递给预览组件。

在HarmonyOS鸿蒙Next中,获取沙箱目录下视频的首帧图片,可以使用MediaMetadataRetriever类。首先,初始化MediaMetadataRetriever并设置视频路径,然后调用getFrameAtTime()方法获取首帧图片。代码示例如下:

MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(videoPath);
Bitmap bitmap = retriever.getFrameAtTime();

确保视频路径正确,并且应用有读取沙箱目录的权限。如果视频预览页面黑屏,检查路径和权限设置是否正确。

回到顶部