HarmonyOS 鸿蒙Next media.AVPlayer 无法播放picker选择的视频uri
HarmonyOS 鸿蒙Next media.AVPlayer 无法播放picker选择的视频uri
通过相机录制的视频,使用picker选中后获得该视频的uri,然后使用media.AVPlayer播放报错
关键代码:
// 1.uri转fd
let filePath = “file://media/Photo/13/Vx’x’x’x’x.mp4”;
let fd = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE).fd;
let state = fileIo.statSync(fd)
let avFileDescriptor: media.AVFileDescriptor = { fd:fd, offset: 0, length: state.size };
this.avPlayer.fdSrc = avFileDescriptor;
AVPlayer设置url,有2种来源;
1:如果使用本地资源播放,必须确认资源文件可用,并使用应用沙箱路径访问对应资源,参考获取应用文件路径。应用沙箱的介绍及如何向应用沙箱推送文件,请参考文件管理。---也就是来源于沙箱路径
2:如果使用网络播放路径,需声明权限:ohos.permission.INTERNET。
3:如果使用ResourceManager.getRawFd打开HAP资源文件描述符,使用方法可参考ResourceManager API参考。
关于这块说明可参考官方文档该链接下的设置资源环节:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/using-avplayer-for-playback-V5#开发步骤及注意事项
有个demo可供伙伴参考,同样Video组件如何播放图库内的某一个视频,可以拿到url后直接播放吗?不可以,需要复制到沙箱中;
如下是video组件播放图库视频得demo,可以直接运行,思路就是先拉起视频选择获得url后,将视频资源copy到沙箱中,然后播放</p
import photoAccessHelper from '@ohos.file.photoAccessHelper';
import fs from '@ohos.file.fs';
import { BusinessError } from '@ohos.base';
import common from '@ohos.app.ability.common';
@Entry
@Component
struct Index {
private controller: VideoController | undefined;
@State videoSrc: string = ''
private context = getContext(this) as common.UIAbilityContext;
build() {
Column({ space: 30 }) {
Button('选择视频')
.width(200)
.height(30)
.onClick(() => {
this.PickerVideo()
})
Video({
src: this.videoSrc,
controller: this.controller
})
.width('100%')
.height(300)
}
.width('100%')
.height('100%')
}
PickerVideo() {
let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.VIDEO_TYPE;
PhotoSelectOptions.maxSelectNumber = 5;
let photoPicker = new photoAccessHelper.PhotoViewPicker();
photoPicker.select(PhotoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
const fileUri = photoSelectResult.photoUris[0]
console.info('photoViewPicker.select to file succeed and uris are:' + fileUri);
this.getFileInfo(fileUri)
}).catch((err: BusinessError) => {
console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
})
}
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.videoSrc = realUri
console.log(this.videoSrc)
}
}
针对您提到的HarmonyOS鸿蒙系统中Next media.AVPlayer无法播放通过picker选择的视频URI的问题,这通常可能是由于URI格式不正确、权限设置不足或AVPlayer的使用方式有误所导致。
-
URI格式检查:确保从picker获取的URI是有效的,并且格式符合AVPlayer的要求。有时URI可能包含非法字符或路径错误,需要对其进行适当的编码和格式化。
-
权限验证:检查应用是否已正确申请并获得了读取外部存储的权限。在HarmonyOS中,访问外部存储需要显式声明权限并在运行时请求。
-
AVPlayer使用:确认AVPlayer的初始化及播放逻辑是否正确。包括设置数据源、准备播放、监听播放状态等步骤是否按照官方文档正确执行。
-
系统兼容性:检查您的代码是否兼容当前HarmonyOS的版本,有时系统更新会带来API的变化或限制。
如果上述检查后问题依旧没法解决,请直接联系官网客服,他们将提供更具体的帮助。官网地址是:https://www.itying.com/category-93-b0.html 。这样可以确保您的问题得到专业且及时的解决。