Security News
Fluent Assertions Faces Backlash After Abandoning Open Source Licensing
Fluent Assertions is facing backlash after dropping the Apache license for a commercial model, leaving users blindsided and questioning contributor rights.
trtc-audio-mixer
Advanced tools
trtc-audio-mixer 已经废弃,您可以使用 rtc-audio-mixer 来实现功能。
本文将介绍您可以使用 AudioMixerPlugin
实现的功能。
操作系统 | 浏览器类型 | 浏览器最低版本要求 | 增加背景音 | 设置音量大小 | 设置播放速率 | 设置播放位置 | 原音频轨道增加背景音发布后,进行多次替换音频轨道操作 |
---|---|---|---|---|---|---|---|
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 浏览器 | ✖ |
AudioMixerPlugin
插件需要和 TRTC
在同一作用域引入。
import TRTC from 'trtc-js-sdk';
import AudioMixerPlugin from 'rtc-audio-mixer';
调用 AudioMixerPlugin.createAudioSource(params)
方法创建一个 AudioSource
的音乐实例,参数如下:
url
:String类型,必选,音乐文件的地址,可使用线上文件地址,也可以使用本地选择对象生成的 blob URL。loop
: Boolean类型,可选,是否循环播放,默认 false
不循环。volume
:Number类型,可选,音量设置(0 - 1), 默认为1。// 通过线上文件地址,也可以通过选择本地文件生成 blob url 加载,参考文末的 API 说明
let audioSourceA = AudioMixerPlugin.createAudioSource({ url: 'https://audioSourceA.mp3' });
注意事项
https
协议。调用 AudioMixerPlugin.mix(params)
方法,获取已加入背景音乐的 mixedAudioTrack,可用于替换发布流的音频轨道:
targetTrack
: 可选,需要加入背景音乐的音频轨道。当不传递的时候则生成只有背景音的轨道。sourceList
: 必选,Array类型,传入第一步创建的音乐实例,例如: [ audioSourceA, audioSourceB ]
。在 localStream
发布之前,将 mixedAudioTrack
替换掉 localStream
里的音频轨道。
let audioSourceA = AudioMixerPlugin.createAudioSource({ url: 'https://audioSourceA.mp3' });
let audioSourceB = AudioMixerPlugin.createAudioSource({ url: 'https://audioSourceB.mp3' });
const localStream = TRTC.createStream({ userId: 'user', audio: true, video: true });
await localStream.initialize();
// 1. 获取麦克风轨道
let originAudioTrack = localStream.getAudioTrack();
// 2. 与 audioSourceA audioSourceB 混合后生成 mixedAudioTrack
mixedAudioTrack = AudioMixerPlugin.mix({targetTrack: originAudioTrack, sourceList: [ audioSourceA, audioSourceB ]});
// 3. 替换麦克风轨道
localStream.replaceTrack(mixedAudioTrack);
// 4. 发布
client.publish(localStream);
// 5. 调用 play 方法播放,这时通话双方都能听到背景音乐
audioSourceA.play();
let audioSourceA = AudioMixerPlugin.createAudioSource({ url: 'https://audioSourceA.mp3' });
let audioSourceB = AudioMixerPlugin.createAudioSource({ url: 'https://audioSourceB.mp3' });
// 1. 获取麦克风轨道
let originAudioTrack = localStream.getAudioTrack();
// 2. 将麦克风轨道 与 audioSourceA audioSourceB 进行混合
mixedAudioTrack = AudioMixerPlugin.mix({ targetTrack: originAudioTrack, sourceList: [ audioSourceA, audioSourceB ] });
// 3. 替换 localStream 的音频轨道
localStream.replaceTrack(mixedAudioTrack);
// 4. 调用 play 方法播放,这时通话双方都能听到背景音乐
audioSourceA.play();
audioSourceB.play();
let audioSourceA = AudioMixerPlugin.createAudioSource({ url: 'https://audioSourceA.mp3' });
let audioSourceB = AudioMixerPlugin.createAudioSource({ url: 'https://audioSourceB.mp3' });
// 暂存包含了麦克风和背景音的轨道,可用于取消静音麦克风
let microAndBgmTrack = localStream.getAudioTrack();
// 1. 生成只有 audioSourceA audioSourceB 的背景音
let bgmTrack = AudioMixerPlugin.mix({sourceList: [audioSourceA, audioSourceB]});
// 2. 替换 localStream 的 audio track,此时只有背景音,没有麦克风声音
localStream.replaceTrack(bgmTrack);
// 如果想开启麦克风,保留背景音,只需要恢复包含了麦克风和背景音的轨道即可
localStream.replaceTrack(microAndBgmTrack);
采集系统声音只支持 Chrome M74+ ,在 Windows 和 Chrome OS 上,可以捕获整个系统的音频,在 Linux 和 Mac 上,只能捕获选项卡的音频。其它 Chrome 版本、其它系统、其它浏览器均不支持。
// AudioMixerPlugin 插件需要和 TRTC 在同一作用域引入。
import TRTC from 'trtc-js-sdk';
import AudioMixerPlugin from 'rtc-audio-mixer';
采集屏幕分享流,和麦克风音频流。
// 创建屏幕分享流
const screenStream = TRTC.createStream({
screenAudio: true,
screen: true,
...
});
// 创建麦克风音频流
const localStream = TRTC.createStream({
audio: false,
video: true,
...
});
await screenStream.initialize();
await localStream.initialize();
const screenAudioTrack = screenStream.getAudioTrack();
const microphoneTrack = localStream.getAudioTrack();
// 将系统音频 track 和麦克风音频 track 进行混音
const mixedTrack = AudioMixerPlugin.mix({ targetTrack: microphoneTrack, trackList: [ screenAudioTrack ] });
// 替换 screenStream 的音频 track
screenStream.replaceTrack(mixedTrack);
// 发布流
await client.publish(screenStream);
用于实现背景音乐、音效的 AudioMixerPlugin 插件,可以通过 TRTC.AudioMixerPlugin 访问。
用于检测当前浏览器是否支持添加背景音的功能。返回值为 Boolean 类型,true 为支持,false 为不支持。
const result = AudioMixerPlugin.isSupported();
if (!result) {
alert('Your browser is not compatible with AudioMixerPlugin');
}
用于创建一个 AudioSource
的音乐实例用于给音频轨道增加背景音乐。
Example:
例一:通过文件地址创建
// 线上文件地址
let audioSourceA = AudioMixerPlugin.createAudioSource({ url: 'https://XXXX.mp3', loop: true, volume: 0.5 });
// 文件相对路径
let audioSourceB = AudioMixerPlugin.createAudioSource({ url: '../XXXX.mp3' });
audioSourceA.play();
例二:通过选择本地文件生成 blob url 加载
// 通过 `<input type="file" id="fileInput">` 选择本地文件生成 blob url 加载
fileInput.addEventListener('change', function() {
var file = fileInput.files[0];
var reader = new FileReader();
reader.onload = function(e) {
let result = e.target.result;
let audioSourceC = AudioMixerPlugin.createAudioSource({ url: result, loop: true, volume: 0.5 });
};
reader.readAsDataURL(file);
});
Name | Type | Attributes | Description |
---|---|---|---|
url | string | 音乐文件地址 | |
loop | boolean | <optional> | 是否循环播放,默认为false |
volume | number | <optional> | 设置初始音量,默认为1 |
Name | Type | Description |
---|---|---|
play() | 播放音乐 | |
pause() | 暂停音乐 | |
resume() | 重置音乐 | |
stop() | 停止音乐 | |
duration() | 获取音乐的时长(s) | |
setPosition(time) | time: number (秒) | 设置音乐位置(不超过音乐的最长时长) |
getPosition() | 获取音乐当前播放位置 | |
setVolume(volume) | volume: number (0 - 1) | 设置音量大小 (同时影响本地和远端播放的音量) |
getVolume() | 获取音量大小 | |
setPlayBackRate(rate) | rate: number (1 - 5) | 设置播放速率 (1 - 5) |
getPlayBackRate() | 获取播放速率 | |
loop(loop) | loop: boolean | 设置是否循环播放,不传 loop 返回 loop 的状态 |
on(eventName, handler) | eventName: number handler: function | 监听事件 |
off(eventName, handler) | eventName: number handler: function | 取消监听事件 |
事件列表
可以监听的事件与 HTMLAudioElement 的标准事件相同,查看:事件列表 。
Name | Description |
---|---|
play | 开始播放音乐 |
progress | 音乐加载 |
end | 音乐播放结束 |
...... | |
error | audio 加载、播放异常等错误,参考文章的常见问题部分 |
// 监听播放事件
audioSourceA.on('play', function play(event) {
console.log('play event trigger', event);
});
// 取消监听所有事件
audioSourceA.off('*', function cancel(event) {
console.log('取消监听所有事件', event);
});
用于将创建的音乐实例与音频轨道进行混音,targetTrack 为待混合的音频轨道,sourceList 为 createAudioSource 创建的音乐实例数组, 例:[ audioSourceA, audioSourceB ] 。
当 targetTrack 不传参的时候, 此时生成纯背景音的音轨。
Example:
targetTrack 和 sourceList 都传参
// 1. 获取麦克风轨道
let originAudioTrack = localStream.getAudioTrack();
// 2. 将麦克风轨道与 audioSourceA audioSourceB 进行混合
mixedAudioTrack = AudioMixerPlugin.mix({ targetTrack: originAudioTrack, sourceList: [ audioSourceA, audioSourceB ] });
// 3. 替换麦克风轨道即可
localStream.replaceTrack(mixedAudioTrack);
只传 sourceList 数组
// 生成只有 audioSourceA audioSourceB 的背景音
let bgmTrack = AudioMixerPlugin.mix({ sourceList: [ audioSourceA, audioSourceB ] });
Name | Type | Description |
---|---|---|
targetTrack | MediaStreamTrack | 目标音频轨道 |
sourceList | Array<AudioSource> | AudioSource 的数组对象 |
trackList | Array<MediaStreamTrack> | AudioTrack 的数组对象 |
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.
解决:您需要使用浏览器支持的音频格式。
FAQs
AudioMixerPlugin for TRTC Web SDK
The npm package trtc-audio-mixer receives a total of 10 weekly downloads. As such, trtc-audio-mixer popularity was classified as not popular.
We found that trtc-audio-mixer demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Fluent Assertions is facing backlash after dropping the Apache license for a commercial model, leaving users blindsided and questioning contributor rights.
Research
Security News
Socket researchers uncover the risks of a malicious Python package targeting Discord developers.
Security News
The UK is proposing a bold ban on ransomware payments by public entities to disrupt cybercrime, protect critical services, and lead global cybersecurity efforts.