Wavesurfer:Spotty Canvas 使用 lineTo() 和 Stroke() 的图形

Wavesurfer: Spotty Canvas Graph Using lineTo() and Stroke()

有一个很棒的音频可视化库,叫做 wavesurfer:https://github.com/katspaugh/wavesurfer.js/

我需要可视化(波形渲染)看起来更像心音图,所以我编辑了初始代码。

更具体地说,我更改了 drawWave 方法中的代码

    cc.beginPath();
    cc.moveTo($, halfH);

    for (var i = 0; i < length; i++) {
        var h = Math.round(peaks[i] * coef);
        cc.lineTo(i * scale + $, halfH + h);
    }

    cc.lineTo(this.width + $, halfH);
    cc.moveTo($, halfH);

    for (var i = 0; i < length; i++) {
        var h = Math.round(peaks[i] * coef);
        cc.lineTo(i * scale + $, halfH - h);
    }

    cc.lineTo(this.width + $, halfH);
    cc.fill();

    // Always draw a median line
    cc.fillRect(0, halfH - $, this.width, $);
}, this);

    cc.beginPath();
    cc.moveTo($, halfH);

    for (var i = 0; i < length; i++) {
        var h = Math.round(peaks[i] * coef);
        cc.lineTo(i * scale + $, halfH - h);
    }

    cc.stroke();

    // Always draw a median line
    cc.fillRect(0, halfH - $, this.width, $);
}, this);

我的意图是删除镜像效果并将其从 fill() 更改为 stroke() 所以它只是一条线。然而,效果不稳定且奇怪。

这可能与此人的问题 (Canvas drawing with lineTo after clearRect() shows spotty lines) 有关,在调用 clearRect 后,他的线条参差不齐,但他没有显示图像或代码源,所以我不能确定。此外,在 wavesurfer 代码中也没有对 clearRect() 的引用,所以也许我在抓稻草。编辑 - 实际上有对 clearRect 的引用,但它似乎不相关;更多更新 2

我已经向可视化工具的作者征求意见,以防这与影响 drawWave 方法的另一种方法有关,但我也想 post 在这里看看是否有明显的东西我不见了。如果您有想法,请随时给我一个大致的研究方向;我已经玩了几个小时了,除了尝试在不包含该库的更简单示例中重新创建问题之外,我没有其他想法。到目前为止,没有骰子。

下面是我的 fiddle,其中包含修改后的 wavesurfer 库。

https://jsfiddle.net/morgwild/5sm3momk/

更新一:

这绝对是与我的更改交互的代码的不同部分;我把原来的 fiddle 删减到我写的部分,看起来很棒。

https://jsfiddle.net/morgwild/7x3wyhxh/

所以,现在我正在深入研究原始代码,看看之后会发生什么,并破坏我想要的图像。

更新二

糟糕,代码中有一个 clearRect()。

this.waveCc.clearRect(0, 0, this.width, this.height), this.progressCc && this.progressCc.clearRect(0, 0, this.width, this.height)

然而,我更新了更新一中提到的fiddle,线条看起来仍然不错。因此,仍然没有在更简单的上下文中重新创建问题。

波形库带有像素比选项。它不能 100% 解决问题,但可以解决大部分问题。