Safari Web音频可视化工具适用于mp3文件,但不适用于流

问题描述 投票:0回答:1

我正在尝试通过画布流式传输音频并对其进行可视化,但是当我需要使其与连续流一起使用时,它似乎仅适用于静态文件(在这种情况下为mp3)。

[使用getByteFrequencyData看起来bufferArray充满零,或者使用getByteTimeDomainData看起来是128。

请参阅以下代码段。

示例文件静态mp3文件:https://s3-us-west-2.amazonaws.com/s.cdpn.io/481938/Find_My_Way_Home.mp3流端点:http://rfcmedia.streamguys1.com/MusicPulse.mp3

HTML

<button id="btn">Start</button>
<canvas id="canvas" style="background:black;width:512px;height:255px;"></canvas>

JS

window.onload = () => {
    document.getElementById('btn').addEventListener('click', () => {
        const audio = new Audio()
        audio.autoplay = false
        audio.crossOrigin = 'anonymous'
        audio.src = 'http://rfcmedia.streamguys1.com/MusicPulse.mp3'


        const player = document.getElementById('audio_player')
        const canvas = document.getElementById('canvas')
        const canvasCtx = canvas.getContext('2d')
        const audioContext = new (window.AudioContext ||
            window.webkitAudioContext)()
        const analyser = audioContext.createAnalyser()
        analyser.connect(audioContext.destination)

        const audioSourceNode = audioContext.createMediaElementSource(audio)
        audioSourceNode.connect(analyser)

        const data = new Uint8Array(analyser.frequencyBinCount)

        const render = () => {
            analyser.getByteFrequencyData(data)

            canvasCtx.clearRect(0, 0, canvas.width, canvas.height)
            const center = canvas.height / 2
            let diff = 10
            let shape = {
                x: diff,
                y1: center,
                y2: center
            }

            for (let i = 0; i < data.length; i++) {
                let height = data[i] / 2

                if (height) {
                    shape.y1 = center - height
                    shape.y2 = center + height

                    const { x, y1, y2 } = shape

                    const lingrad = canvasCtx.createLinearGradient(0, 0, 0, 180)
                    lingrad.addColorStop(0, '#5d8db6')
                    lingrad.addColorStop(0.515, '#5d8db6')
                    lingrad.addColorStop(0.52, '#fff')
                    lingrad.addColorStop(0.53, '#fff')
                    lingrad.addColorStop(0.535, 'rgba(93, 141, 182, 0.6)')
                    lingrad.addColorStop(1, 'rgba(93, 141, 182, 0.6)')

                    canvasCtx.beginPath()
                    canvasCtx.moveTo(x, y1)
                    canvasCtx.quadraticCurveTo(x - diff, center, x, y2)
                    canvasCtx.moveTo(x, y1)
                    canvasCtx.quadraticCurveTo(x + diff, center, x, y2)
                    canvasCtx.closePath()
                    canvasCtx.fillStyle = lingrad
                    canvasCtx.fill()

                    shape.x = x + 8
                }
            }

            requestAnimationFrame(render)
        }

        requestAnimationFrame(render)
        audio.play()
    })
}
javascript safari html5-audio web-audio-api
1个回答
0
投票

您可能希望使用Media Source Extensions进行研究,它使您可以在流式传输文件时读取和解码文件块。 This MSE MP3 tutorial也可能有用。该教程引用了XHR,但您也可以将fetch()与stream API一起使用来播放音频

© www.soinside.com 2019 - 2024. All rights reserved.