HarmonyOS 鸿蒙Next 当AVPlayer要播放的媒体资源是通过url设置的在线视频时,应该怎么获取视频元数据?
HarmonyOS 鸿蒙Next 当AVPlayer要播放的媒体资源是通过url设置的在线视频时,应该怎么获取视频元数据? 怎么获取到视频的首帧画面和视频的宽度、高度? AVPlayer加载视频时怎样使其呈现首帧画面而不是一团漆黑?
可以使用AVImageGenerator提取视频指定时间图像:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/avimagegenerator-V5
参考以下示例,设置文件描述符,获取一个视频指定时间的缩略图。
import { media } from '@kit.MediaKit';
import { image } from '@kit.ImageKit';
const TAG = 'MetadataDemo';
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
// pixelMap对象声明,用于图片显示
@State pixelMap: image.PixelMap | undefined = undefined;
build() {
Row() {
Column() {
Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)
Button() {
Text('TestButton')
.fontSize(30)
.fontWeight(FontWeight.Bold)
}
.type(ButtonType.Capsule)
.margin({
top: 20
})
.backgroundColor('#0D9FFB')
.width('60%')
.height('5%')
.onClick(() => {
// 设置fdSrc, 获取视频的缩略图
this.testFetchFrameByTime();
})
Image(this.pixelMap).width(300).height(300)
.margin({
top: 20
})
}
.width('100%')
}
.height('100%')
}
// 在以下demo中,使用资源管理接口获取打包在HAP内的视频文件,通过设置fdSrc属性,
// 获取视频指定时间的缩略图,并通过Image控件显示在屏幕上。
async testFetchFrameByTime() {
// 创建AVImageGenerator对象
let avImageGenerator: media.AVImageGenerator = await media.createAVImageGenerator();
// 设置fdSrc
avImageGenerator.fdSrc = await getContext(this).resourceManager.getRawFd('demo.mp4');
// 初始化入参
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);
// 释放资源(promise模式)
avImageGenerator.release();
console.info(TAG, `release success.`);
}
}
更多关于HarmonyOS 鸿蒙Next 当AVPlayer要播放的媒体资源是通过url设置的在线视频时,应该怎么获取视频元数据?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这个示例读取的是本地视频,如果是网络视频呢?
找HarmonyOS工作还需要会Flutter技术的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17
现阶段好像没有获取网络视频缩略图的方法吧,只能将视频下载到本地,再获取缩略图。
这里有两个方法下载网络视频到本地:
在HarmonyOS鸿蒙系统中,当AVPlayer需要播放通过URL设置的在线视频时,获取视频元数据可以通过AVMetadataLoader类来实现。以下是一个简要的步骤说明:
-
创建AVPlayer实例:首先,你需要创建一个AVPlayer实例,并将要播放的在线视频URL设置给AVPlayer。
-
使用AVMetadataLoader:接着,创建一个AVMetadataLoader实例,并将AVPlayer作为其数据源。AVMetadataLoader负责从媒体流中提取元数据。
-
注册元数据回调:通过AVMetadataLoader的registerMetadataKeys方法注册你感兴趣的元数据键(例如,视频的标题、时长、宽度、高度等)。然后,设置元数据回调,当元数据加载完成时,该回调将被触发。
-
处理元数据:在元数据回调中,你可以获取并处理加载的元数据。
示例代码(伪代码形式,具体实现需根据鸿蒙API文档调整):
AVPlayer* player = new AVPlayer();
player->setSource(url);
AVMetadataLoader* loader = new AVMetadataLoader(player);
loader->registerMetadataKeys({/*感兴趣的元数据键列表*/});
loader->setMetadataLoadedCallback([](const AVMetadata* metadata) {
// 处理元数据
});
// 开始加载元数据(通常AVPlayer开始播放时会自动加载)
player->prepare();
请注意,上述代码为概念性示例,具体实现需参考鸿蒙系统的AVPlayer和AVMetadataLoader的API文档。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,