我有一个在 p5 中创建的 html 画布,我想向其中添加一个音轨,以便我可以通过 webrtc 连接对其进行流式传输。我目前可以流式传输视频,但不能流式传输音频。
我将音频流添加到画布中,如下所示:
let canvasSource = document.getElementById('canvas-viz');
navigator.mediaDevices.getUserMedia({
audio: true
}).then(audioStream => {
audioStream.getAudioTracks().forEach(
track => {
canvasSource.captureStream().addTrack(track)
})
console.log("canv source: ",canvasSource.captureStream().getAudioTracks()); // prints []
})
Run Code Online (Sandbox Code Playgroud)
所以我的主要问题是,当我打电话时,canvasSource.captureStream().getAudioTracks()我得到了[]. 所以看来这addTrack不能正常工作。我尝试调用canvasSource.captureStream().getAudioTracks()开发工具,以防发生一些异步愚蠢的事情,并且还 go []。我还在开发工具中尝试了以下操作:
audioTracks = audioStream.getAudioTracks();
canvasSource.captureStream().addTrack(audioTracks[0]);
Run Code Online (Sandbox Code Playgroud)
但这也不起作用,[]在查看时返回getAudioTracks()。当调用 时audioStream.getAudioTracks(),我得到一个大小为 1 的数组以及我的麦克风输入流。
我正在遵循以下所示的方法: how to add aaudiostreamoncanvasstreaminwebrtc
我正在 Chrome 中开发这个。就我的目的而言,目前它不需要在 Firefox 中交叉兼容。
我无法理解这句话"要使用解析器,您将数据从流式音频文件传递到解析器.当解析器具有完整的音频数据包或完整属性时,它会调用回调函数.然后你的回调处理解析后的数据 - 比如播放或写入磁盘." 我不知道什么是"完整包"和"完整属性".我需要你的帮助,谢谢.
我正在用 Java 创建一个小型音频播放器,可以很好地播放某些格式(例如 WAV)。我发现这是因为javax.sound不支持MP4。但根据我所读到的内容,从 MP4 转换为 WAV 是无损的,所以我相信这应该不会那么困难。我知道有很多第三方库可以做到这一点,但我对下载一个应该相当简单的东西不感兴趣。我研究了每个 ISO 的具体情况,试图了解数据是如何存储的,以便能够创建一个 ISO BufferedReader,并BufferedWritter查看是否可以手动转换它,但我无法找到我正在寻找的信息。在纯 Java 1.7.0 中执行此操作的方法是什么(我知道 JavaFX 有一个 MediaPlayer,但不幸的是我无法使用 1.8.0)。
或者如果有人知道我可以在哪里找到组成 MP4 和 WAV 的每个特定容器信息(例如标头大小/信息、数据、ACK/NACK 等)。
我非常接近通过 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) audio ×4
audiotoolbox ×1
canvas ×1
core-audio ×1
ios ×1
java ×1
javascript ×1
socket.io ×1
websocket ×1