【发布时间】:2016-02-24 03:55:14
【问题描述】:
我想自己扫描 SHOUTcast 元数据。我知道有很酷的类,例如 IcyStreamMeta 等,但我想知道为什么我自己看不到数据。
我正在使用这个网址(也尝试过其他网址):
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() );
}
}
以下是一些“LAME”示例:
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\]
【问题讨论】:
标签: android streaming metadata inputstream shoutcast