gpt4 book ai didi

android - 手动获取 SHOUTcast 元数据

转载 作者:行者123 更新时间:2023-11-29 17:23:31 25 4
gpt4 key购买 nike

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

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

http://www.shoutcastunlimited.com:8512/

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

我尝试做的是输出可打印的 ASCII 字符序列,看看我是否能看到诸如“StreamTitle”之类的关键字,但我只能看到是否有任何东西是“LAME”。

我下面的代码不太理想,但我没有看到“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() );
}
}

这里有一些“蹩脚”的例子:

02-24 16:58:01.570: I/System.out(26965): ICY[LAME3.98.4UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU|]
02-24 16:58:01.580: I/System.out(26965): ICY[LAME3.98.4UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU|\]
02-24 16:58:01.590: I/System.out(26965): ICY[LAME3.98.4IUb\]

最佳答案

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

Icy-MetaData: 1

在响应中,您会得到一个 header (假设服务器支持元数据),上面写着:

Icy-MetaInt: 8192

无论该数字是多少(在本例中为 8192,这是一个典型数字)都是每个元数据 block 之间的字节数。

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

关于android - 手动获取 SHOUTcast 元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com