HarmonyOS鸿蒙Next中CameraKit录制视频之后获取其缩略图不能显示

HarmonyOS鸿蒙Next中CameraKit录制视频之后获取其缩略图不能显示 我使用CameraKit录制完视频之后(保持路径为相册),然后从相册获取最后一个拍摄结果,获取视频缩略图, piexlmap,能够获取到piexlmap,但是不能显示。 是否问题是视频录制结束后,并没有立马完成写入相册。我尝试延迟500ms依旧无果

let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates()
let fetchOptions: photoAccessHelper.FetchOptions = {
  fetchColumns: [], //需要额外获取的信息需要在此处标明
  predicates: predicates
}
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context)
let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions)
let lastObject: photoAccessHelper.PhotoAsset = await fetchResult.getLastObject()
if (!lastObject) {
  pixelMap = await lastObject.getThumbnail()
}
fetchResult.close()
return pixelMap

更多关于HarmonyOS鸿蒙Next中CameraKit录制视频之后获取其缩略图不能显示的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

可以试一下下面的代码,看看能否获取到相册缩略图,新建工程,无需权限申请:

import { common } from '@kit.AbilityKit';
import { picker } from '@kit.CoreFileKit';
import fs from '@ohos.file.fs';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { dataSharePredicates } from '@kit.ArkData';
import { image } from '@kit.ImageKit';
import { media } from '@kit.MediaKit';

@Entry
@Component
struct Index {
  @State imagePath: string = ''
  @State pixelMap:image.PixelMap  | undefined = undefined
  private controller:VideoController | undefined
  private context = this.getContext(this) as common.UIAbilityContext;

  build() {
    Row() {
      Column() {
        Video({
          src:this.imagePath,
          controller: this.controller
        }).height(300).width('100%').margin({ bottom: 20 })
        Button("选择视频")
          .onClick(() => {
            this.selectPhoto()
          })
        Image(this.pixelMap).width(300).height(400)
      }.width('100%')
    }.height('100%')
  }

  selectPhoto() {
    const photoSelectOptions = new picker.PhotoSelectOptions();
    const photoViewPicker = new picker.PhotoViewPicker();
    photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.VIDEO_TYPE; // 过滤选择媒体文件类型为IMAGE
    photoSelectOptions.maxSelectNumber = 1; // 选择媒体文件的最大数目
    photoViewPicker.select(photoSelectOptions).then((photoSelectResult: picker.PhotoSelectResult) => {
      const fileUri = photoSelectResult.photoUris[0]

      //this.getFileInfo(fileUri)
      //this.uriGetAssets(fileUri)
      this.testFetchFrameByTime(fileUri)
    })
  }

  async getFileInfo(filePathString: string) {
    let resFile = fs.openSync(filePathString, fs.OpenMode.READ_ONLY)
    const dateStr = (new Date().getTime()).toString()
    // 临时文件目录
    let newPath = this.context.filesDir +'/' + dateStr + resFile.name;
    // 转化路径
    fs.copyFileSync(resFile.fd, newPath);
    // 新的路径
    let realUri = 'file://' + newPath;
    this.imagePath = realUri
    console.log(this.imagePath)
  }

  async  uriGetAssets(videoUri:string) {
    try {
      let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(this.context);
      let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
      // 配置查询条件,使用PhotoViewPicker选择图片返回的uri进行查询
      predicates.equalTo('uri', videoUri);
      let fetchOption: photoAccessHelper.FetchOptions = {
        fetchColumns: [],
        predicates: predicates
      };
      let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOption);
      // 得到uri对应的PhotoAsset对象,读取文件的部分信息
      const asset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
      console.info('asset displayName: ', asset.displayName);
      console.info('asset uri: ', asset.uri);
      console.info('asset photoType: ', asset.photoType);
      console.info('asset width: ', asset.get('width'));

      // 获取缩略图
      asset.getThumbnail((err, pixelMap) => {
        if (err == undefined) {
          this.pixelMap = pixelMap
          console.info('getThumbnail successful ' + JSON.stringify(pixelMap));
        } else {
          console.error('getThumbnail fail', err.code + err.message);
        }
      });
    } catch (error){
      console.error('uriGetAssets failed with err: ' + JSON.stringify(error));
    }
  }

  async testFetchFrameByTime(fileUri:string) {
    // 创建AVImageGenerator对象
    try {
      let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator()
      // 设置fdSrc
      let resFile = fs.openSync(fileUri, fs.OpenMode.READ_ONLY)
      let fileLength = fs.statSync(resFile.fd).size
      avImageGenerator.fdSrc = { fd: resFile.fd, offset: 0, length: fileLength }
      // 初始化入参
      let timeUs = 0
      let queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC
      let param: media.PixelMapParams = {
        width: 300,
        height: 300
      }
      // 获取缩略图(promise模式)
      let pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, queryOption, param)
      this.pixelMap = pixelMap
      // 释放资源(promise模式)
      avImageGenerator.release()
      fs.closeSync(resFile.fd)
    } catch (e) {
      console.info(`testTag fetchFrameByTime catch exception: ${JSON.stringify(e)}`)
    }
  }
}

更多关于HarmonyOS鸿蒙Next中CameraKit录制视频之后获取其缩略图不能显示的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用CameraKit录制视频后获取缩略图不能显示,可能是由于以下原因:

  1. 缩略图生成失败:在录制视频后,CameraKit可能未能正确生成缩略图。这可能是由于视频文件损坏或生成缩略图的过程中出现了错误。

  2. 缩略图路径错误:获取缩略图时,可能指定了错误的文件路径或URI,导致无法正确加载和显示缩略图。

  3. 权限问题:应用程序可能没有足够的权限访问生成的缩略图文件,导致无法显示。

  4. 缓存问题:缩略图可能被缓存,但缓存的数据已过期或损坏,导致无法正确显示。

  5. 编码格式不兼容:录制的视频文件可能使用了不兼容的编码格式,导致缩略图生成失败。

  6. 硬件或系统问题:设备的摄像头或系统可能存在硬件或软件问题,影响了缩略图的生成和显示。

这些问题可能会导致在HarmonyOS鸿蒙Next中使用CameraKit录制视频后,无法正确获取和显示缩略图。

在HarmonyOS鸿蒙Next中,使用CameraKit录制视频后获取缩略图无法显示,可能是由于以下原因:

  1. 缩略图生成失败:确保在录制视频后正确调用了获取缩略图的API,并且路径和参数无误。
  2. 权限问题:检查是否已获取必要的存储和相机权限。
  3. 文件路径问题:确认缩略图文件路径是否正确,文件是否存在。
  4. UI更新问题:检查是否在主线程中更新了UI,确保缩略图能够正确显示在界面上。

建议逐步排查上述问题,确保缩略图生成和显示流程无误。

回到顶部