使用 alsa 的 tidal-hifi 播放每首歌曲后都会停止

使用 alsa 的 tidal-hifi 播放每首歌曲后都会停止

我在用潮汐高保真用于在 Linux(Mint 17,64 位)下使用 Chrome 播放音乐。为了实现位完美播放,我关闭了 pulseaudio ($killall pulseaudio),纯粹使用 alsa 进行音频处理并输出到我的 USB DAC。但是,播放在每首歌曲后都会停止,我需要手动选择下一首要播放的歌曲。令人惊讶的是,如果我使用 pulseaudio,就不会出现这个问题。

我将非常感激任何关于如何修复此行为的提示。

答案1

我意识到这是一个老问题,但我最近遇到了同样的问题并找到了解决方案。

问题似乎源于 Tidal 中曲目的预加载。由于您没有使用 pulseaudio,因此每次从播放列表中开始播放曲目时,Google Chrome 都会创建一个新的音频控制器。Tidal 的播放器希望在下一首歌曲开始播放时使用相同的音频控制器,从而导致挂断。

我解决问题的方法是调试 Tidal 的 javascript 播放器代码,通过“中间人”代理注入我的更改(查找 mitmproxy,很棒的软件)。通过这样做,我可以改变播放器的行为。通过更改以下函数:

function m(t) {
    t || w.pause(), g(), e.trigger("track:switched", A), I = void 0, S && x === A ? (o.player !== o.preloadPlayer && (o.player.stop(), o.setMediaPlayer(o.preloadPlayer)), u(T, S, t), x = void 0, T = void 0, S = void 0) : f(A, p, k)
}

function m(t) {
    t || w.pause(), g(), e.trigger("track:switched", A), I = void 0, S && x === A, f(A, p, k)
}

我解决了这个问题。最后一个函数将始终调用“f”函数,从而创建一个新播放器,避免预加载问题。

您需要执行的步骤是:

  1. 安装 mitmproxy其证书
  2. 设置你的浏览器以使用 mitmproxy(你可以在菜单->设置->高级->更改代理设置下找到该设置
  3. 像这样运行 mitmproxy:mitmproxy -p 8888 --script tidal.py

Tidal.py 的内容如下。请注意,您必须下载 .js 文件并进行更改,然后将其放在可以加载的位置,例如与 tidal.py 文件相同的目录中。祝你好运!

import cStringIO
from libmproxy.protocol.http import decoded

def response(context, flow):
    if flow.match("~u http://listen.tidal.com/v1.6.4-p-5/app.js") and flow.response.headers.("content-type", "").startswith("application/x-javascript"):
        with decoded(flow.response):
            try:
                injected_script = cStringIO.StringIO(open('./app.js', 'rb').read())
                flow.response.content = injected_script.getvalue()
            except Exception as e:
                print e
                pass

相关内容