HarmonyOS读取视频封缩略图问题求助

视频缩略图需求已交,验收时发现一个问题,如何获取视频封面?根据文档可以正常读取resource/rawfile的缩略图但使用picker打开一个视频文件后,根据视频路径,无法读取到缩略图。https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/avimagegenerator-0000001868264077-V5

demo代码如下:

import media from '@ohos.multimedia.media'; 
import image from '@ohos.multimedia.image'; 
import { BusinessError } from '@ohos.base'; 
import picker from '@ohos.file.picker'; 
import fs from '@ohos.file.fs'; 
@Entry 
@Component 
struct PhotoPicker { 
  // pixelMap对象声明,用于图片显示 
  @State pixelMap: image.PixelMap | string | undefined = undefined; 
  build() { 
    Column() { 
      Button() { 
        Text('select').fontSize(20).fontWeight(FontWeight.Bold) 
      } 
      .margin({ top: 20 }) 
      .width(100) 
      .height(40) 
      .onClick(() => { 
        this.showPicker() 
      }) 
      Image(this.pixelMap).width(300).height(300).margin({ top: 20 }) 
    } 
    .width('100%') 
    .height('100%') 
  } 
  showPicker() { 
    let PhotoSelectOptions = new picker.PhotoSelectOptions(); 
    PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.VIDEO_TYPE; 
    PhotoSelectOptions.maxSelectNumber = 1; 
    let photoPicker = new picker.PhotoViewPicker(); 
    photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: picker.PhotoSelectResult) => { 
      this.testFetchFrameByTime(PhotoSelectResult.photoUris[0]) 
    }).catch((err: BusinessError) => { 
      console.error('PhotoViewPicker.select failed with err: ' + JSON.stringify(err)); 
    }); 
  } 
  // 在以下demo中,使用资源管理接口获取打包在HAP内的视频文件,通过设置fdSrc属性, 
  // 获取视频指定时间的缩略图,并通过Image控件显示在屏幕上。 
  async testFetchFrameByTime(filePath?: string) { 
    // 创建AVImageGenerator对象 
    let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator() 
    // 设置fdSrc 
    let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE); 
    avImageGenerator.fdSrc = {fd: file.fd} 
    // 初始化入参 
    let timeUs = 0 
    let queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC 
    let param: media.PixelMapParams = {  width : 300, height : 300 } 
    // 获取缩略图(promise模式) 
    this.pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, queryOption, param) 
    fs.closeSync(file); 
    // 释放资源(promise模式) 
    avImageGenerator.release() 
  } 
}
HarmonyOS
2024-08-14 16:37:21
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

参考代码:

import media from '@ohos.multimedia.media'; 
import image from '@ohos.multimedia.image'; 
import { BusinessError } from '@ohos.base'; 
import picker from '@ohos.file.picker'; 
import fs from '@ohos.file.fs'; 
import photoAccessHelper from '@ohos.file.photoAccessHelper'; 
@Entry 
@Component 
struct Index{ 
  // pixelMap对象声明,用于图片显示 
  @State pixelMap: image.PixelMap | string | undefined = undefined; 
  build() { 
    Column() { 
      Button() { 
        Text('select').fontSize(20).fontWeight(FontWeight.Bold) 
      } 
      .margin({ top: 20 }) 
      .width(100) 
      .height(40) 
      .onClick(() => this.showPicker()) 
      Image(this.pixelMap).width(300).height(300).margin({ top: 20 }) 
    } 
    .width('100%') 
    .height('100%') 
  } 
  showPicker() { 
    // 创建图库选择器对象实例 
    const photoViewPicker = new photoAccessHelper.PhotoViewPicker(); 
    // 图库选项配置,类型与数量 
    let selectOptions = new photoAccessHelper.PhotoSelectOptions(); 
    selectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.VIDEO_TYPE; 
    selectOptions.maxSelectNumber = 1; 
    //调用select()接口拉起图库界面进行文件选择,文件选择成功后,返回PhotoSelectResult结果集 
    photoViewPicker.select(selectOptions).then((photoSelectResult: picker.PhotoSelectResult) => { 
      //用一个全局变量存储返回的uri 
      if (photoSelectResult.photoUris?.[0]) { 
        this.testFetchFrameByTime(photoSelectResult.photoUris[0]) 
      } 
    }).catch((err: BusinessError) => { 
      console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`); 
    }) 
  } 
  // 获取缩略图 
  async testFetchFrameByTime(filePath: string) { 
    // 创建AVImageGenerator对象 
    let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator() 
    let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY); 
    let avFileDescriptor: media.AVFileDescriptor = { fd: file.fd }; 
    avImageGenerator.fdSrc = avFileDescriptor; 
    // 初始化入参 
    let timeUs = 0 
    let queryOption = media.AVImageQueryOptions.AV_IMAGE_QUERY_NEXT_SYNC 
    let param: media.PixelMapParams = { 
      width : 300, 
      height : 400, 
    } 
    // 获取缩略图(promise模式) 
    this.pixelMap = await avImageGenerator.fetchFrameByTime(timeUs, queryOption, param) 
    // 释放资源(promise模式) 
    avImageGenerator.release() 
    console.info(`release success.`) 
    fs.closeSync(file); 
  } 
}
分享
微博
QQ
微信
回复
2024-08-14 23:07:34
相关问题
缩略图,如何获取文件的缩略图
739浏览 • 1回复 待解决
HarmonyOS 根据视频路径生成缩略图
54浏览 • 1回复 待解决
鸿蒙能获取图片指定大小的缩略图
9612浏览 • 1回复 待解决
ArtUI的简单问题求助
6578浏览 • 1回复 待解决
js调用Java,问题求助?
5453浏览 • 1回复 待解决
Harmony 如何读取本地视频文件路径?
14728浏览 • 2回复 待解决
HarmonyOS视频解码问题
701浏览 • 1回复 待解决
HarmonyOS 文件上传 & 资源读取问题
558浏览 • 1回复 待解决
关于鸿蒙APP升级问题求助
6031浏览 • 1回复 待解决
紧急求助 安装DevEco Studio 问题
2159浏览 • 1回复 待解决
@ohos.telephony.call问题求助
2581浏览 • 1回复 待解决