96SEO 2026-02-20 06:35 39
以下指导仅介绍如何实现媒体资源播放#xff0c;如果要实现后台播放或熄屏播放#xff0c;需要…1

使用AVPlayer可以实现端到端播放原始媒体资源本开发指导将以完整地播放一首音乐作为示例向开发者讲解AVPlayer音频播放相关功能。
以下指导仅介绍如何实现媒体资源播放如果要实现后台播放或熄屏播放需要使用AVSession媒体会话和申请长时任务避免播放被系统强制中断。
播放的全流程包含创建AVPlayer设置播放资源设置播放参数音量/倍速/焦点模式播放控制播放/暂停/跳转/停止重置销毁资源。
在进行应用开发的过程中开发者可以通过AVPlayer的state属性主动获取当前状态或使用on(‘stateChange’)方法监听状态变化。
如果应用在音频播放器处于错误状态时执行操作系统可能会抛出异常或生成其他未定义的行为。
completed状态时播放引擎处于工作状态这需要占用系统较多的运行内存。
当客户端暂时不使用播放器时调用reset()或release()回收内存资源做好资源利用。
创建实例createAVPlayer()AVPlayer初始化idle状态。
设置资源设置属性urlAVPlayer进入initialized状态。
下面代码示例中的url仅作示意使用开发者需根据实际情况确认资源有效性并设置
1.如果使用本地资源播放必须确认资源文件可用并使用应用沙箱路径访问对应资源参考获取应用文件路径。
应用沙箱的介绍及如何向应用沙箱推送文件请参考文件管理。
2.如果使用网络播放路径需声明权限ohos.permission.INTERNET。
3.如果使用ResourceManager.getRawFd打开HAP资源文件描述符使用方法可参考ResourceManager
准备播放调用prepare()AVPlayer进入prepared状态此时可以获取duration设置音量。
音频播控播放play()暂停pause()跳转seek()停止stop()
等操作。
可选更换资源调用reset()重置资源AVPlayer重新进入idle状态允许更换资源url。
退出播放调用release()销毁实例AVPlayer进入released状态退出播放。
注册avplayer回调函数setAVPlayerCallback(avPlayer:
seek操作结果回调函数avPlayer.on(seekDone,
error回调监听函数,当avPlayer在操作过程中出现错误时调用
reset接口触发重置流程avPlayer.on(error,
${err.message});avPlayer.reset();
状态机变化回调函数avPlayer.on(stateChange,
成功调用reset接口后触发该状态机上报console.info(AVPlayer
设置播放源后触发该状态上报console.info(AVPlayer
called.);avPlayer.prepare();break;case
prepare调用成功后上报该状态机console.info(AVPlayer
play成功调用后触发该状态机上报console.info(AVPlayer
seek.);avPlayer.seek(avPlayer.duration);
当播放模式不支持seek操作时继续播放到结尾console.info(AVPlayer
调用暂停接口暂停播放}this.count;break;case
pause成功调用后触发该状态机上报console.info(AVPlayer
播放结束后触发该状态机上报console.info(AVPlayer
stop接口成功调用后触发该状态机上报console.info(AVPlayer
调用reset接口初始化avplayer状态break;case
called.);break;default:console.info(AVPlayer
以下demo为使用fs文件系统打开沙箱地址获取媒体文件地址并通过url属性进行播放示例async
创建状态机变化回调函数this.setAVPlayerCallback(avPlayer);let
通过UIAbilityContext获取沙箱地址filesDir以Stage模型为例let
打开相应的资源文件地址获取fd并为url赋值触发initialized状态机上报let
以下demo为使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放示例async
创建状态机变化回调函数this.setAVPlayerCallback(avPlayer);//
通过UIAbilityContext的resourceManager成员的getRawFd接口获取媒体资源播放地址//
返回类型为{fd,offset,length},fd为HAP包fd地址offset为媒体资源偏移量length为播放长度let
context.resourceManager.getRawFd(01.mp3);let
为fdSrc赋值触发initialized状态机上报avPlayer.fdSrc
以下demo为使用fs文件系统打开沙箱地址获取媒体文件地址并通过dataSrc属性进行播放(seek模式)示例async
创建状态机变化回调函数this.setAVPlayerCallback(avPlayer);//
dataSrc播放模式的的播放源地址当播放为Seek模式时fileSize为播放文件的具体大小下面会对fileSize赋值let
通过UIAbilityContext获取沙箱地址filesDir以Stage模型为例let
fs.statSync(path).size;src.fileSize
以下demo为使用fs文件系统打开沙箱地址获取媒体文件地址并通过dataSrc属性进行播放(No
创建状态机变化回调函数this.setAVPlayerCallback(avPlayer);let
通过UIAbilityContext获取沙箱地址filesDir以Stage模型为例let
以下demo为通过url设置网络地址来实现播放直播码流的demoasync
创建状态机变化回调函数this.setAVPlayerCallback(avPlayer);this.isSeek
http://xxx.xxx.xxx.xxx:xx/xx/index.m3u8;}
使用SoundPool音频池提供的接口可以实现低时延短音播放。
当应用开发时经常需要使用一些急促简短的音效如相机快门音效、系统通知音效等此时建议调用SoundPool实现一次加载多次低时延播放。
SoundPool当前支持播放1MB以下的音频资源大小超过1MB的长音频将截取1MB大小数据进行播放。
本开发指导将以SoundPool进行一次低时延播放音频的过程为例向开发者讲解如何使用SoundPool。
详细的API声明请参考SoundPool
过程包括创建SoundPool实例加载音频资源包括资源的解封装与解码:解码格式参考音频解码支持设置播放参数循环模式/播放优先级等播放控制播放/停止释放资源。
在应用开发过程中开发者应通过监听方法检查当前播放状态并按照一定顺序调用接口执行对应操作否则系统可能会抛出异常或生成其他未定义的行为。
具体顺序可参考下列开发步骤及对应说明。
调用createSoundPool方法创建SoundPool实例。
audio.StreamUsage.STREAM_USAGE_MUSIC,rendererFlags
audioRendererInfo).***n((soundpool_:
可以传入uri或fd加载资源此处使用传入uri的方式为例更多方法请参考API文档。
fs.OpenMode.READ_ONLY).***n((file:
作为样例使用时需要传入文件对应路径。
soundPool.load(uri).***n((soundId:
}调用on(‘loadComplete’)方法用于监听“资源加载完成”。
});调用on(‘playFinished’)方法用于监听“播放完成”。
});配置播放参数PlayParameters并调用play方法播放音频。
多次调用play播放同一个soundID只会播放一次。
soundPool.setPriority(streamID,
先调用play方法获取到对应资源的streamIDsoundPool.setVolume(streamID,
//先调用play方法给拿到对应的streamIDsoundPool.stop(streamID).***n(()
先调用load方法获取到对应资源的soundIDsoundPool.unload(soundID).***n(()
});调用off(‘loadComplete’)方法注销加载完成监听。
soundPool.off(loadComplete);调用off(‘playFinished’)方法注销播放完成监听。
soundPool.off(playFinished);调用off(‘error’)方法注销错误错误类型监听。
soundPool.off(error);调用release()方法释放SoundPool实例。
ohos.base;soundPool.release().***n(()
下面展示了使用SoundPool进行低时延播放的完整示例代码。
audio.StreamUsage.STREAM_USAGE_MUSIC,rendererFlags:
audio.AudioRendererRate.RENDER_RATE_NORMAL,
audioRendererInfo);//注册监听loadCallback();finishPlayCallback();setErrorCallback();//
fs.OpenMode.READ_ONLY).***n((file:
加载完成回调soundPool.on(loadComplete,
播放完成回调soundPool.on(playFinished,
开始播放,这边play也可带播放播放的参数PlayParametersstreamId
设置循环播放次数soundPool.setLoop(streamId,
设置对应流的优先级soundPool.setPriority(streamId,
设置音量soundPool.setVolume(streamId,
终止指定流的播放soundPool.stop(streamId);//
soundPool.unload(soundId);//关闭监听setOffCallback();//
{soundPool.off(loadComplete);soundPool.off(playFinished);soundPool.off(error);
使用AVRecorder可以实现音频录制功能本开发指导将以“开始录制-暂停录制-恢复录制-停止录制”的一次流程为示例向开发者讲解AVRecorder音频录制相关功能。
在进行应用开发的过程中开发者可以通过AVRecorder的state属性主动获取当前状态或使用on(‘stateChange’)方法监听状态变化。
开发过程中应该严格遵循状态机要求例如只能在started状态下调用pause()接口只能在paused状态下调用resume()接口。
media.createAVRecorder().***n((recorder:
{console.error(createAVRecorder
配置音频录制参数调用prepare()接口此时进入prepared状态。
prepare接口的入参avConfig中仅设置音频相关的配置参数如示例代码所示。
如果只需要录制音频请不要设置视频相关配置参数如果需要录制视频可以参考视频录制开发指导进行开发。
直接设置视频相关参数会导致后续步骤报错。
录制输出的url地址即示例里avConfig中的url形式为fd://xx
number)。
需要基础文件操作接口ohos.file.fs实现应用文件访问能力获取方式参考应用文件访问与管理。
media.ContainerFormatType.CFT_MPEG_4A,
media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC,
参考应用文件访问与管理中的开发示例获取创建的音频文件fd填入此处
avRecorder.prepare(avConfig).***n(()
})开始录制调用start()接口此时进入started状态。
avRecorder.start();暂停录制调用pause()接口此时进入paused状态。
avRecorder.pause();恢复录制调用resume()接口此时再次进入started状态。
avRecorder.resume();停止录制调用stop()接口此时进入stopped状态。
avRecorder.stop();重置资源调用reset()重新进入idle状态允许重新配置录制参数。
avRecorder.reset();销毁实例调用release()进入released状态退出录制。
参考以下示例完成“开始录制-暂停录制-恢复录制-停止录制”的完整流程。
media.ContainerFormatType.CFT_MPEG_4A,
media.AudioSourceType.AUDIO_SOURCE_TYPE_MIC,
注册audioRecorder回调函数setAudioRecorderCallback()
状态机变化回调函数this.avRecorder.on(stateChange,
错误上报回调函数this.avRecorder.on(error,
this.avRecorder.release();this.avRecorder
media.createAVRecorder();this.setAudioRecorderCallback();//
2.获取录制文件fd赋予avConfig里的url参考FilePicker文档//
this.avRecorder.prepare(this.avConfig);//
仅在started状态下调用pause为合理状态切换await
仅在paused状态下调用resume为合理状态切换await
仅在started或者paused状态下调用stop为合理状态切换await
this.avRecorder.release();this.avRecorder
一个完整的【开始录制-暂停录制-恢复录制-停止录制】示例async
用户此处可以自行设置录制时长例如通过设置休眠阻止代码执行await
使用AVMetadataExtractor可以实现从原始媒体资源中获取元信息本开发指导将以获取一个音频资源的元信息作为示例向开发者讲解AVMetadataExtractor元信息相关功能。
视频资源的元信息获取流程与音频类似由于视频没有专辑封面所以无法获取视频资源的专辑封面。
获取音频资源的元信息的全流程包含创建AVMetadataExtractor设置资源获取元信息获取专辑封面销毁资源。
使用createAVMetadataExtractor()创建实例。
设置资源用户可以根据需要选择设置属性fdSrc表示文件描述符,
1.如果设置fdSrc可以使用ResourceManager.getRawFd打开HAP资源文件描述符使用方法可参考ResourceManager
2.如果设置dataSrc必须正确设置dataSrc中的callback属性确保callback被调用时能正确读取到对应资源使用应用沙箱路径访问对应资源参考获取应用文件路径。
应用沙箱的介绍及如何向应用沙箱推送文件请参考文件管理。
获取元信息调用fetchMetadata()可以获取到一个AVMetadata对象通过访问该对象的各个属性可以获取到元信息。
可选获取专辑封面调用fetchAlbumCover()可以获取到专辑封面。
{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(()
获取音频元信息和专辑封面异步接口以Callback形式调用this.testFetchMetadataFromFdSrcByCallback()//
获取音频元信息和专辑封面异步接口以Promise形式调用this.testFetchMetadataFromFdSrcByPromise()//
获取音频元信息和专辑封面this.testFetchMetadataFromDataSrc()})Image(this.pixelMap).width(300).height(300).margin({top:
20})}.width(100%)}.height(100%)}//
在以下demo中使用资源管理接口获取打包在HAP内的媒体资源文件通过设置fdSrc属性获取音频元信息并打印//
获取音频专辑封面并通过Image控件显示在屏幕上。
该demo以Callback形式进行异步接口调用async
testFetchMetadataFromFdSrcByCallback()
media.createAVMetadataExtractor()//
设置fdSrcavMetadataExtractor.fdSrc
getContext(this).resourceManager.getRawFd(cover.mp3);//
获取元信息callback模式avMetadataExtractor.fetchMetadata((error,
${JSON.stringify(error)})return}console.info(TAG,
${metadata.genre})})//获取专辑封面callback模式avMetadataExtractor.fetchAlbumCover((err,
${JSON.stringify(err)})return}this.pixelMap
释放资源callback模式avMetadataExtractor.release((error)
${JSON.stringify(error)})return}console.info(TAG,
在以下demo中使用资源管理接口获取打包在HAP内的媒体资源文件通过设置fdSrc属性获取音频元信息并打印//
获取音频专辑封面并通过Image控件显示在屏幕上。
该demo以Promise形式进行异步接口调用async
testFetchMetadataFromFdSrcByPromise()
media.createAVMetadataExtractor()//
设置fdSrcavMetadataExtractor.fdSrc
getContext(this).resourceManager.getRawFd(cover.mp3);//
avMetadataExtractor.fetchMetadata()console.info(TAG,
avMetadataExtractor.fetchAlbumCover()//
释放资源promise模式avMetadataExtractor.release()console.info(TAG,
在以下demo中使用fs文件系统打开沙箱地址获取媒体文件地址设置dataSrc属性获取音频元信息并打印//
通过UIAbilityContext获取沙箱地址filesDir以Stage模型为例let
设置dataSrc描述符通过callback从文件中获取资源写入buffer中let
media.createAVMetadataExtractor()//
设置dataSrcavMetadataExtractor.dataSrc
avMetadataExtractor.fetchMetadata()console.info(TAG,
avMetadataExtractor.fetchAlbumCover()//
释放资源promise模式avMetadataExtractor.release()console.info(TAG,
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback