HarmonyOS鸿蒙Next中avplayer只能播放网络和沙箱路径下的音频文件吗?

HarmonyOS鸿蒙Next中avplayer只能播放网络和沙箱路径下的音频文件吗? avplayer只能播放网络和沙箱路径下的音频文件吗?本地的音频文件怎么进行播放?

6 回复

根据华为官方文档使用AVPlayer播放音频(ArkTS)-播放-媒体开发指导(ArkTS)-Media Kit(媒体服务)-媒体 - 华为HarmonyOS开发者,AVPlayer不止支持网络和沙箱路径的音频文件,还可播放系统媒体库、外部存储(如 SD 卡)等本地路径的音频文件,核心是根据文件存储位置匹配合法数据源格式对应权限

此外,如果需要设置音频渲染信息,则只允许在initialized状态下,第一次调用prepare()之前设置,以便音频渲染器信息在之后生效。若媒体源包含视频,则usage默认值为STREAM_USAGE_MOVIE,否则usage默认值为STREAM_USAGE_MUSIC。rendererFlags默认值为0。为了确保音频行为符合使用预期,建议根据具体业务场景和实际需求,主动配置audio.AudioRendererInfo,为音频选择恰当的流类型usage

更多关于HarmonyOS鸿蒙Next中avplayer只能播放网络和沙箱路径下的音频文件吗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


AVPlayer 可以播放本地音频文件,但需通过文件选择器获取用户授权后,将文件转换为文件描述符(fd)再播放。不支持直接使用设备绝对路径。

如果“本地音频文件”指设备存储中非沙箱路径的文件(如用户通过文件管理器保存的音频),需通过以下步骤播放:

步骤一:获取文件访问权限

  • 使用文件选择器(如 AudioViewPicker)让用户选择文件,获取临时 URI。
  • 示例代码:
import { picker } from '@kit.CoreFileKit';
import { common } from '@kit.AbilityKit';

const context = getUIContext().getHostContext() as common.UIAbilityContext;
const audioViewPicker = new picker.AudioViewPicker(context);
audioViewPicker.select(new picker.AudioSelectOptions()).then((uris: string[]) => {
  let fileUri = uris[0]; // 获取选中文件的 URI
  // 后续使用此 URI 播放
});

步骤二:将文件转换为 AVPlayer 可用的格式

  • 方法 1:通过文件描述符(fd)播放(推荐)

    使用 fs.openSync 获取文件描述符,并设置为 AVPlayer 的 fdSrc 属性:

import { fileIo as fs } from '@kit.CoreFileKit';
import { media } from '@kit.MediaKit';

let avPlayer = await media.createAVPlayer();
let file = fs.openSync(fileUri, fs.OpenMode.READ_ONLY); // 通过 URI 打开文件
let avFileDescriptor: media.AVFileDescriptor = {
  fd: file.fd,
  offset: 0,   // 文件起始位置
  length: file.size // 文件大小(需通过 fs.statSync 获取)
};
avPlayer.fdSrc = avFileDescriptor; // 设置 fdSrc
  • 方法 2:通过 fd:// 路径播放

    将文件描述符拼接为 fd:// 路径并设置为 url

let fdPath = `fd://${file.fd}?offset=0&size=${file.size}`;
avPlayer.url = fdPath;

步骤三:正常播放流程

  • 设置监听事件(如 stateChangeerror)。
  • 调用 prepare() 进入准备状态。
  • 调用 play() 开始播放。

【问题背景】:除了播放沙箱或者网络路径下的音频文件,还有什么路径下的音频文件能访问?例如本地?

【解决思路】

  1. 编写本地文件导入功能,筛选具有音频文件格式的文件,支持的音频格式如下表格
媒体格式 封装格式 轨道格式
音频 m4a 音频轨:AAC、Audio Vivid
音频 aac 音频轨:AAC
音频 mp3 音频轨:MPEG(MP3)
音频 ogg 音频轨:Vorbis
音频 flac 音频轨:Flac
音频 wav 音频轨:PCM、G711mu、G711a
音频 amr 音频轨:AMR(amrnb、amrwb)
音频 ape 音频轨:APE
  1. 具体实现示例,可参考下列官方示例
  2. 【官方——本地音频的导入】

Avplayer的参数:媒体URL,只允许在idle状态下设置。

支持的视频格式(mp4、mpeg-ts、mkv)。

支持的音频格式(m4a、aac、mp3、ogg、wav、flac、amr)。

支持路径示例

  1. fd类型播放:fd://xx。

previewableImage

  1. http网络播放: http://xx

  2. https网络播放: https://xx

  3. hls网络播放路径:http://xx或者https://xx

说明

  • 设置网络播放路径,需声明权限ohos.permission.INTERNET,相关错误码: 201

  • 从API version 11开始不支持webm。

  • 将资源句柄(fd)传递给 AVPlayer 实例之后,请不要通过该资源句柄做其他读写操作,包括但不限于将同一个资源句柄传递给多个 AVPlayer / AVMetadataExtractor / AVImageGenerator / AVTranscoder。同一时间通过同一个资源句柄读写文件时存在竞争关系,将导致媒体播放器数据获取异常。

鸿蒙Next的avplayer支持播放网络音频和沙箱路径文件,同时也能访问应用资源目录(resources/rawfile)中的本地音频文件。通过媒体库管理接口,可读取系统公共目录下的音频。播放时需配置相应权限,网络播放要求网络访问授权,本地文件访问需声明存储权限。

在HarmonyOS Next中,avplayer不仅支持播放网络音频(通过URL)和沙箱路径(应用私有目录)下的文件,还可以访问系统公共媒体库中的本地音频文件。需要使用媒体库管理接口(如@ohos.file.picker)选择文件,或通过权限申请访问公共目录(如PhotosDocuments)。获取文件URI后,即可用avplayer加载播放。注意遵循数据安全规范,避免直接硬编码路径。

回到顶部