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
可以试一下下面的代码,看看能否获取到相册缩略图,新建工程,无需权限申请:
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录制视频后获取缩略图不能显示,可能是由于以下原因:
-
缩略图生成失败:在录制视频后,CameraKit可能未能正确生成缩略图。这可能是由于视频文件损坏或生成缩略图的过程中出现了错误。
-
缩略图路径错误:获取缩略图时,可能指定了错误的文件路径或URI,导致无法正确加载和显示缩略图。
-
权限问题:应用程序可能没有足够的权限访问生成的缩略图文件,导致无法显示。
-
缓存问题:缩略图可能被缓存,但缓存的数据已过期或损坏,导致无法正确显示。
-
编码格式不兼容:录制的视频文件可能使用了不兼容的编码格式,导致缩略图生成失败。
-
硬件或系统问题:设备的摄像头或系统可能存在硬件或软件问题,影响了缩略图的生成和显示。
这些问题可能会导致在HarmonyOS鸿蒙Next中使用CameraKit录制视频后,无法正确获取和显示缩略图。
在HarmonyOS鸿蒙Next中,使用CameraKit录制视频后获取缩略图无法显示,可能是由于以下原因:
- 缩略图生成失败:确保在录制视频后正确调用了获取缩略图的API,并且路径和参数无误。
- 权限问题:检查是否已获取必要的存储和相机权限。
- 文件路径问题:确认缩略图文件路径是否正确,文件是否存在。
- UI更新问题:检查是否在主线程中更新了UI,确保缩略图能够正确显示在界面上。
建议逐步排查上述问题,确保缩略图生成和显示流程无误。