功能描述
本文将介绍如何使用 AudioPlayer 插件在通话过程中实现背景音乐功能。AudioPlayer 插件支持播放 mp3、ogg、wav、flac 格式的音频文件,并可将音频混入发布流推送给远端用户。
相比 AudioMixer 插件,AudioPlayer 插件提供了播放器实例化的控制方式,支持更灵活的播放控制(start/pause/resume/stop/seek)和属性动态修改。
体验在线 Demo
前提条件
-
TRTC 版本 > 5.18.0
-
支持在通话中添加背景音乐的平台如下
操作系统 浏览器类型 浏览器最低版本要求 Mac OS 桌面版 Chrome 浏览器 56+ Mac OS 桌面版 Safari 浏览器 11+ Mac OS 桌面版 Firefox 浏览器 56+ Mac OS 桌面版 Edge 80+ Windows 桌面版 Chrome 浏览器 56+ Windows 桌面版 QQ 浏览器(极速模式) 10.4+ Windows 桌面版 Firefox 浏览器 56+ Windows 桌面版 Edge 80+ iOS 移动版 Safari 浏览器 14+ iOS 微信内嵌网页 ✖ Android 移动版 Chrome 浏览器 81+ Android 微信内嵌网页(TBS 内核) ✔ Android 移动版 QQ 浏览器 ✖
实现流程
1. 安装与注册插件
import TRTC from 'trtc-sdk-v5';
import AudioPlayer from 'trtc-sdk-v5/plugins/audio-player';
const trtc = TRTC.create({ plugins: [AudioPlayer] });
2. 进房并打开麦克风
await trtc.enterRoom({ roomId: 8888, sdkAppId, userId, userSig });
await trtc.startLocalAudio();
3. 创建播放器并播放背景音乐
使用 trtc.startPlugin 创建一个 URL 播放器实例,设置 publish: true 将音频混入发布流推送给远端用户。
const player = await trtc.startPlugin('AudioPlayer', {
id: 'bgm',
sourceType: 'url',
url: 'https://example.com/music.mp3',
loop: true,
volume: 0.5,
publish: true,
onTimeUpdate: (currentTime, duration) => {
console.log(`播放进度: ${currentTime.toFixed(2)}s / ${duration.toFixed(2)}s`);
},
onDurationChange: (duration) => {
console.log(`音频时长: ${duration.toFixed(2)}s`);
},
onEnded: () => {
console.log('播放结束');
},
});
// 开始播放
await player.start();
4. 控制播放器
通过播放器实例方法进行播放控制:
// 暂停播放
player.pause();
// 恢复播放
player.resume();
// 跳转到指定时间(秒)
player.seek(30);
// 停止播放(重置到起始位置)
player.stop();
// 重新播放
await player.start();
通过实例属性动态修改参数:
// 调整音量(0~1)
player.volume = 0.8;
// 切换循环播放
player.loop = false;
// 调整播放速率
player.playbackRate = 1.5;
// 动态切换是否推送给远端
player.publish = false;
5. 销毁播放器
不再需要播放器时,调用 stopPlugin 销毁:
// 销毁指定播放器
await trtc.stopPlugin('AudioPlayer', { id: 'bgm' });
player = null; // 主动解除引用,避免内存泄漏
// 销毁所有播放器
await trtc.stopPlugin('AudioPlayer', { id: '*' });
⚠️ 重要:调用
stopPlugin销毁播放器后,务必将播放器实例引用设为null,否则实例对象无法被垃圾回收,会造成内存泄漏。
API 说明
trtc.startPlugin('AudioPlayer', options)
创建一个音频播放器实例。
options
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| id | string |
✅ | - | 播放器实例唯一标识 |
| sourceType | string |
✅ | - | 音频源类型,设置为 'url' |
| url | string |
✅ | - | 音频文件 URL,支持 mp3/ogg/wav/flac 格式及 blob/data URL |
| publish | boolean |
❌ | false |
是否混入发布流推送给远端用户 |
| loop | boolean |
❌ | false |
是否循环播放 |
| volume | number |
❌ | 1 |
播放音量(0~1) |
| playbackRate | number |
❌ | 1 |
播放速率 |
| onTimeUpdate | function |
❌ | - | 播放进度回调,参数为 (currentTime: number, duration: number),单位为秒 |
| onDurationChange | function |
❌ | - | 音频时长变化回调,参数为 (duration: number),单位为秒 |
| onEnded | function |
❌ | - | 播放结束回调(loop 模式下每次播放到末尾不会触发) |
返回值: Promise<AudioPlayerContext> — 播放器实例
示例:
const player = await trtc.startPlugin('AudioPlayer', {
id: 'bgm',
sourceType: 'url',
url: 'https://example.com/music.mp3',
loop: true,
volume: 0.5,
playbackRate: 1.0,
publish: true,
onTimeUpdate: (currentTime, duration) => {
console.log(`${currentTime}s / ${duration}s`);
},
onDurationChange: (duration) => {
console.log(`音频时长: ${duration}s`);
},
onEnded: () => {
console.log('播放结束');
},
});
播放器实例方法
| 方法 | 说明 |
|---|---|
start() |
开始播放,返回 Promise |
pause() |
暂停播放 |
resume() |
从暂停位置恢复播放 |
stop() |
停止播放,重置到起始位置 |
seek(time) |
跳转到指定时间(秒) |
播放器实例只读属性
| 属性 | 类型 | 说明 |
|---|---|---|
id |
string |
播放器实例 ID |
sourceType |
string |
音频源类型 |
currentTime |
number |
当前播放时间(秒) |
duration |
number |
音频总时长(秒) |
isStop |
boolean |
是否已停止 |
isPause |
boolean |
是否已暂停 |
isPlayEnd |
boolean |
是否播放结束 |
播放器实例可读写属性
| 属性 | 类型 | 说明 |
|---|---|---|
volume |
number |
播放音量(0~1) |
loop |
boolean |
是否循环播放 |
playbackRate |
number |
播放速率 |
publish |
boolean |
是否混入发布流 |
trtc.stopPlugin('AudioPlayer', options)
销毁播放器实例。
options
| 参数 | 类型 | 说明 |
|---|---|---|
| id | string |
目标播放器实例 ID,传 '*' 销毁所有实例 |
示例:
// 销毁指定播放器
await trtc.stopPlugin('AudioPlayer', { id: 'bgm' });
// 销毁所有播放器
await trtc.stopPlugin('AudioPlayer', { id: '*' });
// 释放播放器引用
player = null;
⚠️ 重要:调用
stopPlugin销毁播放器后,务必将播放器实例引用设为null,否则实例对象无法被垃圾回收,会造成内存泄漏。
常见问题
1. 出现跨域错误
例如:Access to audio at XXX from origin XXX has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
解决:您需要配置线上音乐文件的 CORS 协议,确保音频资源服务器允许跨域访问。
2. 音频格式不支持
例如:NotSupportedError: The operation is not supported.
解决:请使用浏览器支持的音频格式(推荐 mp3、ogg、wav、flac)。
3. publish 设置为 true 但远端听不到
解决:使用 publish: true 时,需要先进入房间并发布音频流(调用 trtc.startLocalAudio()),确保本地音频已发布后再创建播放器。
4. iOS 设备无法播放
解决:iOS 浏览器要求音频播放必须由用户手势触发,请确保 player.start() 在用户点击事件的回调中调用。
5. 如何同时播放多个背景音乐
AudioPlayer 支持多实例管理,通过不同的 id 创建多个播放器即可:
const bgm1 = await trtc.startPlugin('AudioPlayer', {
id: 'bgm1',
sourceType: 'url',
url: 'https://example.com/music1.mp3',
publish: true,
});
const bgm2 = await trtc.startPlugin('AudioPlayer', {
id: 'bgm2',
sourceType: 'url',
url: 'https://example.com/music2.mp3',
publish: true,
});
await bgm1.start();
await bgm2.start();