Android 手动获取SHOUTcast元数据

Android 手动获取SHOUTcast元数据,android,streaming,metadata,inputstream,shoutcast,Android,Streaming,Metadata,Inputstream,Shoutcast,我想自己扫描SHOUTcast元数据。我意识到有一些很酷的类,比如IcyStreamMeta等,但我想知道为什么我自己看不到这些数据 我正在使用此URL(也尝试过其他URL): 我的理解是,我应该在音频流数据中看到元数据——特别是当广播电台更改当前音调时 我试图做的是输出可打印ASCII字符的序列,看看我是否能看到诸如“StreamTitle”之类的关键字,但我所能看到的只是是否有“跛脚”的东西 我下面的代码不太理想,但我没有看到“StreamTitle”或其他有意义的词有什么原因吗 pub

我想自己扫描SHOUTcast元数据。我意识到有一些很酷的类,比如IcyStreamMeta等,但我想知道为什么我自己看不到这些数据

我正在使用此URL(也尝试过其他URL):

我的理解是,我应该在音频流数据中看到元数据——特别是当广播电台更改当前音调时

我试图做的是输出可打印ASCII字符的序列,看看我是否能看到诸如“StreamTitle”之类的关键字,但我所能看到的只是是否有“跛脚”的东西

我下面的代码不太理想,但我没有看到“StreamTitle”或其他有意义的词有什么原因吗

  public void retreiveMetadata()
  {
    try
    {
      OkHttpClient client = new OkHttpClient();
      Request request = new Request.Builder().url( mStreamUrl ).build();

      Response response = client.newCall( request ).execute();
      mStream = response.body().byteStream();    

      // This returns 200 as expected
      ContextActivity.LogDebugf( "ICY RESPONSE: %d\n", response.code() );

      if( abBuffer == null )
        abBuffer = new byte[ nBufferSize ];

      for( ;; )
      {
        // Read data INTO the buffer
        int nRead    = mStream.read( abBuffer, 0, nBufferSize );

        //ContextActivity.LogDebugf( "ICY Data Read: %d\n", nRead );

        int nPrintableStart = -1;
        int nPrintableCount = 0;

        for( int i = 0; i < nRead; i ++ )
        {
          // Look for printable chars only
          if( ( abBuffer[ i ] >= ' ' ) && ( abBuffer[ i ] < '~' ) )
          {
            if( nPrintableStart < 0 )
            {
              nPrintableStart = i;
              nPrintableCount = 0;
            }

            nPrintableCount ++;
          }
          else
          {
            // End of printable range
            if( nPrintableCount >= 11 )
            {
              String sMeta  = new String( abBuffer, nPrintableStart, nPrintableCount, "UTF-8" );        
              ContextActivity.LogDebugf( "ICY[%s]\n", sMeta );
            }

            nPrintableStart = -1;
            nPrintableCount = 0;
          }
        }
      }
    }
    catch( Exception e )
    {
      ContextActivity.LogDebugf( "ICY Exception[%s]\n", e.toString() );     
    }
  }

我看不到任何地方您实际请求元数据。如果您不请求它,服务器将不会发送它。将此标题添加到您的请求中:

Icy-MetaData: 1
在响应中,您将返回一个标题(假设服务器支持元数据),其中显示:

Icy-MetaInt: 8192
不管这个数字是多少(
8192
,在本例中,这是一个典型的数字),都是每个元数据块之间的字节数


元数据块中的第一个字节表示元数据块的大小。如果它是
0x00
,则没有元数据,并返回到间隔大小的音频数据。如果它表示
0x02
或其他非零值,则将其乘以
16
,这是文本元数据的字节数(
num
[
0x00
]),采用
key=“value”
格式
StreamTitle
是当今唯一有意义的。已知某些流包含其他数据,通常用于内部跟踪。

Doh!我真是太傻了。剪切和粘贴不同的“解决方案”是我的错!谢谢。
Icy-MetaData: 1
Icy-MetaInt: 8192