我正在从 WebRTC 获取媒体流并进行一些音频处理和监控。它可以在 FireFox 上运行,但在 Chrome 上保持沉默。
这是一个简化版本,以单个增益节点为例。
const AudioContext = window.AudioContext || window.webkitAudioContext;
let myAudioCtx = new AudioContext();
let mySource = myAudioCtx.createMediaStreamSource(stream);
let gainNode = myAudioCtx.createGain();
gainNode.gain.value = 2;
mySource.connect(gainNode);
gainNode.connect(myAudioCtx.destination);
Run Code Online (Sandbox Code Playgroud)
而如果我直接将流分配给 srcObject,我就会听到声音。
看来 createMediaStreamSource() 没有返回任何音频,因为我的监控显示静音。但是,如果我将来自 WebRTC 的流分配给 srcObect 并通过我的监控运行,那么监控会检测到声音。
myAudioCtx.state 说“正在运行”
想不出还有什么地方可以检查。任何帮助,将不胜感激
我在我的项目中使用 WaveSurfer js,我们可以在其中编辑音频。为此,我使用区域插件。
当用户单击完成按钮时,我想将结果导出为音频文件(mp3/wav)
为了获得用户选择音频的音频峰值,我这样做:
var json = wavesurfer.backend.getPeaks(960, wavesurfer.regions.list["wavesurfer_j99v7ophop8"].start, wavesurfer.regions.list["wavesurfer_j99v7ophop8"].end)
Run Code Online (Sandbox Code Playgroud)
这可行,但我想将其导出为音频文件而不是 json
提前致谢
我似乎无法理解为什么这不起作用.我没有错误.我使用振荡器做到了这一点并且工作正常.仅供参考,这是此主题的延续: 使用Web Audio API将两个声音分配给两个Div并通过javascript单击事件独立播放
码:
<div id="divElement"></div>
<style>
#divElement{
background-color: orange;
width:70px;
height:100px;
left:143px;
}
</style>
<script>
var context = new webkitAudioContext(),
savedBuffer;
var playAudioFile = function () {
var source = context.createBufferSource();
var gainNode = context.createGainNode();
source.buffer = savedBuffer;
// START OF PROBLEM AREA: Gain not working but file still plays with no errors.
source.connect(gainNode);
gainNode.connect(context.destination);
gainNode.gain = 0;
// END OF PROBLEM AREA
source.noteOn(0); // Play sound immediately
};
var request = new XMLHttpRequest();
request.open('get', 'audio/A.mp3', true);
request.responseType …Run Code Online (Sandbox Code Playgroud) 我想访问麦克风输入navigator.getUserMedia(),但不确定如何继续.
我可以很好地开始音频,但我不知道在那之后怎么做.
if (!navigator.getUserMedia) {
navigator.getUserMedia = navigator.getUserMedia
|| navigator.webkitGetUserMedia
|| navigator.mozGetUserMedia
|| navigator.msGetUserMedia;
}
if (navigator.getUserMedia) {
navigator.getUserMedia({audio: true}, function (e) {
// what goes here?
}, function (e) {
alert('Error capturing audio.');
});
} else {
alert('getUserMedia not supported in this browser.');
}
Run Code Online (Sandbox Code Playgroud)
我想以流的形式访问它.我甚至不需要立体声,只是一种获取数据的方法.
编辑:我想使用websockets将数据发送回服务器,以创建一种对讲系统.在这里,我需要能够访问一个简单的音频流,停止并在某些事件上启动它.
我有两个一秒音频源,如下所示:
var context = system.AudioContext();
var source = context.createBufferSource();
var audioBuffer1 = context.createBuffer(1, float32Array_1.length, context.sampleRate);
audioBuffer1.getChannelData(0).set(float32Array_1);
var audioBuffer2 = context.createBuffer(1, float32Array_2.length, context.sampleRate);
audioBuffer2.getChannelData(0).set(float32Array_2);
Run Code Online (Sandbox Code Playgroud)
现在我想在它们之间没有延迟地播放这两个音频源。对于单个源,我可以使用以下代码播放音频:
source.buffer = audioBuffer1;
source.connect(context.destination);
source.start(0);
Run Code Online (Sandbox Code Playgroud)
我如何附加第二个源,以便它们之间没有延迟。
我正在构建一个音频程序并在 .createMediaElementSource 方法上遇到了绊脚石。我能够解决问题,但我不太清楚为什么该解决方案有效。
在我的 HTML 中,我创建了一个音频播放器: <audio id="myAudio><source src="music.mp3"></audio>
现在在我的 JS 中:
context = new AudioContext();
audio = document.getElementById('myAudio');
source = context.createMediaElementSource(audio);
audio.play();
Run Code Online (Sandbox Code Playgroud)
不起作用。音频元素加载,但不播放歌曲,也没有音频。
然而!此 JS 代码有效:
context = ...; //same as above
audio...;
source = context.createMediaElementSource(audio[0]);
audio.play();
Run Code Online (Sandbox Code Playgroud)
我所做的只是在音频中添加了一个 [0],程序突然又开始工作了。由于 .getElementById 不返回数组,我不知道为什么将音频作为数组引用有效,但仅引用音频则不行。
在Web音频振荡器上调用stop()时,振荡器节点只会挂起,断开连接和未使用.
如果我告诉振荡器在2秒内停止:
oscillator.stop( audioCtx.currentTime + 2 );
Run Code Online (Sandbox Code Playgroud)
有没有办法设置回调,所以我可以在stop()运行后立即删除振荡器?
我想过使用一个带有停止时间加上半秒左右的setTimeout但最终可能会删除错误的振荡器.
我想我可以使用拉伸样本playbackRate,但如何设置音高?我试图在不使用任何库的情况下实现这一目标。
我在规范中发现了一些有关多普勒音调效应的内容,但除此之外,我找不到任何与我的目标真正相关的内容。只是一个简单的音高变换,这可能吗?如果是这样那怎么办?
编辑:是否也playbackRate改变了音调,但浏览器应用了某种校正?我想可能是这样的。如果是这种情况并且可能的话,我必须禁用它。
我目前正在为我正在处理的项目调整此网络音频 API 演示,但在 iPhone 上测试时没有声音。它在 iPad 上运行良好。
我已经搜索了解决方案,并在 StackOverflow 上找到了此线程,其中包含以下答案片段:
iOS 6 上的 Safari 有效地从 Web Audio API 静音开始。直到您尝试在用户输入事件中播放声音(创建缓冲区源,将其连接到目标,然后调用 noteOn()),它才会取消静音。在此之后,它会取消静音并且音频播放不受限制并且应该如此。这是 Web Audio API 如何在 iOS 6 上工作的一个未记录的方面(Apple 的文档在这里,希望他们尽快更新它并提及这一点!)
用户输入事件应该是播放按钮上的 onclick 事件,但更改为使用noteOn()而不是start()仍然无法修复它。
更新:我也尝试将播放按钮与touchend事件绑定,但无济于事。
这是使用 noteOn() 的函数:
function playNote(buffer, pan, x, y, z, sendGain, mainGain, playbackRate, noteTime) {
// Create the note
var voice = context.createBufferSource();
voice.buffer = buffer;
voice.playbackRate.value = playbackRate;
// Optionally, connect to a panner
var finalNode;
if …Run Code Online (Sandbox Code Playgroud) 我非常接近通过 Websockets 进行音频聊天。我正在构建的这个应用程序的想法是在浏览器中进行群组语音聊天。
我正在使用 socket.io 服务器来转发此信息。
音频传输良好。这段代码的用途是:
let hasHeader = false
export function emitAudioStream(mic, sock, room) {
console.log('beginning record')
const recorder = new MediaRecorder(mic)
recorder.ondataavailable = (evt) => {
// fetch the header
if (!hasHeader) {
console.log('header:', evt.data)
sock.emit('header:audio', evt.data)
hasHeader = true
}
// console.log(evt.data.size)
sock.emit('stream:audio', ({room, streamData: evt.data}))
}
recorder.start()
console.log(`Recording begin. (State: "${recorder.state}")`)
setInterval(() => {
recorder.requestData()
}, 1e3/60)
}
Run Code Online (Sandbox Code Playgroud)
有一些“参与者”的房间——相互联系的个人。服务器处理这样的请求:
sock.on('header:audio', (packet) => {
console.log(`setting audio header for ${sock.id}`)
sock.__audioHeader = packet
})
sock.on('stream:audio', ({room, streamData}) …Run Code Online (Sandbox Code Playgroud) 我是tone.js 的新手,我只想要一个简单的暂停按钮。我知道有一个 stop() 和 start() 但它不是暂停,何时再次开始音乐只是转到歌曲的开头。
我使用tone.js 是因为我想操纵音乐并进行一些合成声音。我也使用 p5.js 但不知何故暂停不起作用。它抛出一个错误,说“无法读取未定义的属性‘长度’。所以我想使用tone.js,但只需要弄清楚如何暂停音乐。谢谢。
这是代码
var player = new Tone.Player("data/audio/singingbird_audio.mp3").toMaster();
var whale = new Tone.Player("data/audio/whale.mp3").toMaster();
whale.autostart = false;
whale.volume.value = -10;
player.autostart = false;
player.volume.value = 5;
player.stop();
button = createButton('Play Bird');
button.position(20, 200);
button.mousePressed(birdSwitch);
function birdSwitch() {
if (player.state == "started") {
player.stop();
whale.stop();
} else if (player.state == "stopped") {
player.start();
whale.start();
}
}
Run Code Online (Sandbox Code Playgroud) web-audio-api ×11
javascript ×9
audio ×3
audiocontext ×1
firefox ×1
html5-audio ×1
ios ×1
iphone ×1
json ×1
p5.js ×1
pause ×1
socket.io ×1
tone.js ×1
webrtc ×1
websocket ×1