HarmonyOS 鸿蒙Next录制视频后获取封面图和时长
HarmonyOS 鸿蒙Next录制视频后获取封面图和时长
使用系统自带的功能录制视频后,返回的pickerResult里面只包含有录制结果,录制uri和录制类型, 有没有比较便捷的方法能获取到录制的封面图和录制时长?
关键代码:
let pickerResult: cameraPicker.PickerResult = await cameraPicker.pick(getContext(), mediaType, pickerProfile);
return pickerResult.resultUri;
更多关于HarmonyOS 鸿蒙Next录制视频后获取封面图和时长的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
视频时长可在canary4获取
可通过如下demo实现:
import { DataType, PhotoPickerComponent, PickerController, PickerOptions } from '@ohos.file.PhotoPickerComponent';
import dataSharePredicates from '@ohos.data.dataSharePredicates';
import photoAccessHelper from '@ohos.file.photoAccessHelper';
import { image } from '@kit.ImageKit';
@Entry
@Component
struct TestPicker {
@State message: string = 'Hello World';
@State pickerController: PickerController = new PickerController();
@State videoUri: string = '';
pickerOptions: PickerOptions = new PickerOptions();
selectUri: string[] = [];
testUri: string = '';
@State pixel: image.PixelMap | undefined = undefined
private onSelect(uri: string) {
console.log(`zzy select uri is ${uri}`);
}
aboutToAppear(): void {
this.pickerOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE;
this.pickerOptions.maxSelectNumber = 9;
this.pickerOptions.isSearchSupported = false;
this.pickerOptions.backgroundColor = '#AAFF22'
}
build() {
Column() {
PhotoPickerComponent({
pickerOptions: this.pickerOptions,
onSelect: (uri: string) => {
console.log(`zzy select uri is ${uri}`);
this.selectUri.push(uri);
// file://media/Photo/42/VID_1717230235_037/SVID_20240601_162215_1.mp4
},
onDeselect: (uri: string) => console.log(`zzy deselect uri is ${uri}}`),
pickerController: this.pickerController
}).width('100%')
.height(500)
Button('1111')
.onClick(async () => {
this.pixel = await uriGetAssets(this.selectUri);
})
Image(this.pixel)
.backgroundColor(Color.Green)
.width(100)
.height(100)
}
.height('100%')
.width('100%')
}
}
async function uriGetAssets(uri: string[]): Promise<undefined | image.PixelMap> {
try {
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext());
let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
predicates.equalTo('uri', uri[0]);
let fetchOption: photoAccessHelper.FetchOptions = {
fetchColumns: [],
predicates: predicates
};
let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOption);
const asset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
console.info('asset displayName: ', asset.displayName);
console.info('asset uri: ', asset.uri);
const pixel = await new Promise<image.PixelMap>((resolve, reject) => {
asset.getThumbnail((err, pixelMap) => {
if (err == undefined) {
console.info('getThumbnail successful ' + JSON.stringify(pixelMap));
resolve(pixelMap);
} else {
console.error('getThumbnail fail', err);
reject(err);
}
});
});
return pixel;
} catch (error){
console.error('uriGetAssets failed with err: ' + JSON.stringify(error));
return undefined;
}
}
更多关于HarmonyOS 鸿蒙Next录制视频后获取封面图和时长的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next系统中,录制视频后获取封面图和时长可以通过以下方式实现:
获取封面图
-
使用MediaMetadataRetriever类:该类提供从媒体文件中提取元数据的功能。通过
setDataSource
方法加载视频文件,然后使用getFrameAtTime
方法指定时间点来获取封面帧。时间参数通常以微秒为单位,通常选择视频开始的时间点(如0微秒)来获取第一帧作为封面。 -
Bitmap转换:获取到的封面帧通常是
byte[]
数组,需要将其转换为Bitmap
对象以便在UI中显示。
获取视频时长
- MediaMetadataRetriever类:同样使用该类,在加载视频文件后,调用
extractMetadata
方法并传入METADATA_KEY_DURATION
作为键来获取视频时长。返回值是字符串格式,需要转换为长整型(long)以表示毫秒数。
示例代码(伪代码,具体实现需根据实际开发环境调整):
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(videoPath);
Bitmap coverImage = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
String durationStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long duration = Long.parseLong(durationStr);
注意:上述代码为概念性示例,实际开发中需考虑异常处理、资源释放等问题。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html