首页 > 解决方案 > JavaScript 从音频中解析元数据 (ICY)

问题描述

我终于找到了一个有用的库来解析音频流中的元数据,这里:https ://github.com/ghaiklor/icecast-parser 。但是,当我发送以下示例中的标头时,我仍然无法获得预期的响应。

第一个函数向广播电台/频道发出请求并获取流:

_makeRequest() {
    const request = http.request(this.getConfig('url'));

    console.log("Making request to: " + this.getConfig('url'));

    request.setHeader('Range', 'bytes=0-');
    request.setHeader('User-Agent', 'VLC/2.2.4 LibVLC/2.2.4');
    request.setHeader('Icy-MetaData', '1');
    request.setHeader('Connection', 'close');       
    request.once('response', this._onRequestResponse.bind(this));
    request.once('error', this._onRequestError.bind(this));

    request.end();

    return this;
}

当一个对电台的请求被成功调用时,这个函数被调用:

_onRequestResponse(response) {

    console.log("Received response!");
    console.log("Headers:");
    console.log(response.headers['content-type']);

    const icyMetaInt = response.headers['icy-metaint'];

    console.log("icyMetaInt= " + icyMetaInt);

    if (icyMetaInt) {
      const reader = new StreamReader(icyMetaInt);

      reader.on('metadata', metadata => {

        console.log(metadata);

        this._destroyResponse(response);
        this._queueNextRequest(this.getConfig('metadataInterval'));
        this.emit('metadata', metadata);
      });

      response.pipe(reader);
      this.emit('stream', reader);
    } else {
      this._destroyResponse(response);
      this._queueNextRequest(this.getConfig('emptyInterval'));
      this.emit('empty');
    }

return this;
}

当我在这个 URL (url: ' http://streaming.radionomy.com/70-s-80-sMetal ')上使用这些函数时,控制台中的回复是:

音频/mpeg icyMetaInt=未定义

我明白这里最关键的标题是:

setHeader('Icy-MetaData', '1')

不过,我没有收到“icyMetaInt”。使用其他工具检查 URL 时,该 URL 似乎确实包含元数据。

任何想法这里出了什么问题?谢谢!;

标签: javascriptmetadata

解决方案


请求是 Fetch API 的一部分,在发出跨源请求时,您只能访问有限范围的标头。


推荐阅读