HarmonyOS 应用开发《掌上英语》第99篇:使用AVPlayer设置播放URL(ArkTS)

发布时间:2026/8/6 22:16:46
HarmonyOS 应用开发《掌上英语》第99篇:使用AVPlayer设置播放URL(ArkTS) 使用AVPlayer设置播放URL(ArkTS)本开发指导将介绍如何使用AVPlayer开发播放功能在不同的场景下如何设置URL。当前指导仅介绍播放URL设置方法其他场景及完整示例代码请参考视频播放。当前开发指导将提供以下设置播放URL的方法流媒体播放场景下设置URL本地Raw文件播放场景下设置URL流媒体播放场景下设置URL情况一播放HTTP/HTTPS媒体资源import{media}fromkit.MediaKit;// 类成员定义avPlayer。privateavPlayer:media.AVPlayer|nullnull;// 在业务函数中示例工程函数名为avSetupURL// 创建avPlayer实例对象。this.avPlayerawaitmedia.createAVPlayer();// 设置对应的播放url。leturlhttps://xxx.xxx.xxx.mp4;if(this.avPlayernull){return;}this.avPlayer.urlurl;情况二HLS媒体资源播放点播/直播import{media}fromkit.MediaKit;// 类成员定义avPlayer。privateavPlayer:media.AVPlayer|nullnull;// 在业务函数中示例工程函数名为avSetupURL// 创建avPlayer实例对象。this.avPlayerawaitmedia.createAVPlayer();// 设置对应的播放url。leturlhttps://xxx.xxx.xxx.xxx:xx/xx/index.m3u8;if(this.avPlayernull){return;}this.avPlayer.urlurl;情况三设置HTTP请求头信息播放当服务器需要校验HTTP请求头信息时可通过createMediaSourceWithUrl设置HTTP请求头信息。import{media}fromkit.MediaKit;// 类成员定义avPlayer。privateavPlayer:media.AVPlayer|nullnull;// 在业务函数中示例工程函数名为avSetupURL// 创建avPlayer实例对象。this.avPlayerawaitmedia.createAVPlayer();// 设置对应的播放url。leturlhttps://xxx.xxx.xxx.xxx:xx/xx/index.m3u8;// 创建mediaSource实例对象设置媒体来源定制HTTP请求如需要可以键值对的形式设置User-Agent、Cookie、Referer等字段。letmediaSource:media.MediaSourcemedia.createMediaSourceWithUrl(url,{User-Agent:User-Agent-Value,Cookie:Cookie-Value,Referer:Referer-Value});// 设置播放策略设置缓冲区数据量为3s。letplaybackStrategy:media.PlaybackStrategy{preferredWidth:1,preferredHeight:2,preferredBufferDuration:3,preferredHdr:false};// 为avPlayer设置媒体来源和播放策略。this.avPlayer.setMediaSource(mediaSource,playbackStrategy);情况四通过本地Raw文件中的m3u8文件播放在线流媒体资源当应用需要通过解析本地Raw文件中的m3u8文件播放在线流媒体资源时可以通过resourceManager.getRawFd获取文件描述符将其拼接成fdUrl并通过setMimeType设置MIME类型为APPLICATION_M3U8。import{media}fromkit.MediaKit;import{common}fromkit.AbilityKit;// 类成员定义avPlayer和context。privateavPlayer:media.AVPlayer|nullnull;privatecontext:common.UIAbilityContext|undefinedundefined;// 在业务函数中示例工程函数名为avSetupURL// 创建avPlayer实例对象。this.avPlayerawaitmedia.createAVPlayer();this.contextthis.getUIContext().getHostContext()ascommon.UIAbilityContext;// 通过本地m3u8文件名获取文件描述符。letfileDescriptorawaitthis.context.resourceManager.getRawFd(xxx.m3u8);// 用文件描述符构造本地m3u8的URL。letfdUrl:stringfd://fileDescriptor.fd?offsetfileDescriptor.offsetsizefileDescriptor.length;// 按需设置HTTP请求头。letheaders:Recordstring,string{User-Agent:User-Agent-Value,Cookie:Cookie-Value};// 通过本地m3u8的URL和HTTP请求头构造mediaSource媒体来源。letmediaSource:media.MediaSourcemedia.createMediaSourceWithUrl(fdUrl,headers);// 设置媒体MIME类型为APPLICATION_M3U8。letmimeType:media.AVMimeTypesmedia.AVMimeTypes.APPLICATION_M3U8;mediaSource?.setMimeType(mimeType);// 设置播放策略设置缓冲区数据量为20s。letplaybackStrategy:media.PlaybackStrategy{preferredBufferDuration:20};// 为avPlayer设置媒体来源和播放策略。this.avPlayer.setMediaSource(mediaSource,playbackStrategy);情况五通过应用沙箱中的m3u8文件播放在线流媒体资源当应用需要通过解析应用沙箱中的m3u8文件播放在线流媒体资源时可以通过fileIo.openSync获取文件句柄将其拼接成fdUrl并通过setMimeType设置MIME类型为APPLICATION_M3U8。import{media}fromkit.MediaKit;import{fileIo}fromkit.CoreFileKit;import{common}fromkit.AbilityKit;// 类成员定义avPlayer和context。privateavPlayer:media.AVPlayer|nullnull;privatecontext:common.UIAbilityContext|undefinedundefined;privatem3u8FileName:string;// 在业务函数中示例工程函数名为avSetupURL// 创建avPlayer实例对象。this.avPlayerawaitmedia.createAVPlayer();this.contextthis.getUIContext().getHostContext()ascommon.UIAbilityContext;// 通过UIAbilityContext获取沙箱地址filesDir以Stage模型为例。letm3u8FileName;letfilePath${this.context.filesDir}/${m3u8FileName};// 通过fileIo.openSync获取文件句柄。letfilefileIo.openSync(filePath,fileIo.OpenMode.READ_ONLY);letfd:stringfile.fd.toString();// 用文件句柄构造本地m3u8的URL。letfdUrl:stringfd://fd?offset0size0;// 按需设置HTTP请求头。letheaders:Recordstring,string{User-Agent:User-Agent-Value,Cookie:Cookie-Value};// 通过本地m3u8的URL和HTTP请求头构造mediaSource媒体来源。letmediaSource:media.MediaSourcemedia.createMediaSourceWithUrl(fdUrl,headers);// 设置媒体MIME类型为APPLICATION_M3U8。letmimeType:media.AVMimeTypesmedia.AVMimeTypes.APPLICATION_M3U8;mediaSource?.setMimeType(mimeType);// 设置播放策略设置缓冲区数据量为20s。letplaybackStrategy:media.PlaybackStrategy{preferredBufferDuration:20};// 为avPlayer设置媒体来源和播放策略。this.avPlayer.setMediaSource(mediaSource,playbackStrategy);本地raw文件播放场景下设置URL情况一应用沙箱文件播放import{media}fromkit.MediaKit;import{fileIo}fromkit.CoreFileKit;import{common}fromkit.AbilityKit;// 类成员定义avPlayercontext和fileName。privateavPlayer:media.AVPlayer|nullnull;privatecontext:common.UIAbilityContext|undefinedundefined;privatefileName:string;// 在业务函数中示例工程函数名为avSetupURL// 创建avPlayer实例对象。this.avPlayerawaitmedia.createAVPlayer();this.contextthis.getUIContext().getHostContext()ascommon.UIAbilityContext;letfdPathfd://;letfileNametest.mp4;// test.mp4为应用文件目录下的预置资源需要开发者根据实际情况进行替换。// 通过UIAbilityContext获取沙箱地址filesDir以Stage模型为例。letpath${this.context?.filesDir}/${this.fileName};// 打开相应的资源文件地址获取fd并为url赋值触发initialized状态机上报。letfileawaitfileIo.open(path);fdPathfdPathfile.fd;this.avPlayer.urlfdPath;情况二本地文件播放说明当使用AVPlayer播放本地资源时AVPlayer会独占此fd。import{media}fromkit.MediaKit;import{common}fromkit.AbilityKit;// 类成员定义avPlayercontext和fileName。privateavPlayer:media.AVPlayer|nullnull;privatefileName:string;privatecontext:common.UIAbilityContext|undefinedundefined;// 在业务函数中示例工程函数名为avSetupURL// 创建avPlayer实例对象。this.avPlayerawaitmedia.createAVPlayer();this.contextthis.getUIContext().getHostContext()ascommon.UIAbilityContext;// 通过UIAbilityContext的resourceManager成员的getRawFd接口获取媒体资源播放地址。// 返回类型为{fd,offset,length},fd为HAP包fd地址offset为媒体资源偏移量length为播放长度。letfileNametest.mp4;// test.mp4为应用文件目录下的预置资源需要开发者根据实际情况进行替换。letfileDescriptorawaitthis.context?.resourceManager.getRawFd(this.fileName);letavFileDescriptor:media.AVFileDescriptor{fd:fileDescriptor.fd,offset:fileDescriptor.offset,length:fileDescriptor.length};// 为fdSrc赋值触发initialized状态机上报。this.avPlayer.fdSrcavFileDescriptor;运行完整示例新建工程下载示例工程也可直接运行并将示例工程的以下资源复制到对应目录。AVPlayerArkTSURL entry/src/main/ets/ └── pages └── Index.ets (播放界面) entry/src/main/resources/ ├── base │ ├── element │ │ ├── color.json │ │ ├── float.json │ │ └── string.json │ └── media │ ├── ic_video_play.svg (播放键图片资源) │ └── ic_video_pause.svg (暂停键图片资源) └── rawfile ├── test.m3u8 (m3u8资源) └── test_01.mp3 音频资源在/entry/src/main/module.json5中申请使用网络的权限或直接替换为示例工程的module.json5。requestPermissions:[{name:ohos.permission.INTERNET},{name:ohos.permission.GET_WIFI_INFO}]通过注释、解注释/entry/src/main/ets/pages/Index.ets中的上文示例的各种情况编译并运行。在安装应用后可将示例工程的/entry/src/main/resources/rawfile/test.m3u8通过以下命令加入应用沙箱从而运行应用沙箱相关示例:FILESDIR为物理路径以示例工程为例可通过console.info打印this.context.filesDir得到应用沙箱路径再根据应用沙箱指南的应用沙箱路径和真实物理路径的对应关系表找到物理路径。hdc file send [目录]\test.m3u8 FILESDIR hdc file send [目录]\test_01.mp3 FILESDIR