tumtumtum / StreamingKit

A fast and extensible gapless AudioPlayer/AudioStreamer for OSX and iOS (iPhone, iPad)
Other
2.42k stars 523 forks source link

Weird bleeps and no metadata available when playing a SHOUTcast stream #460

Closed dylancom closed 2 years ago

dylancom commented 3 years ago

When playing a SHOUTcast stream there are random bleeps occuring every x seconds and song metadata is not available. This happens for e.g. with: http://23.237.150.98:8512/ (PRM Internet Radio) http://lin1.san.fast-serv.com:9844/ (ANDYS 80S)

When playing those URL's with for e.g. Apple Music or VLC it plays without any bleeps and the currently played song is displayed.

dimitris-c commented 3 years ago

If my memory serves me right, these bleeps might occur when the stream has metadata but are not parsed... Try and see if the request header has a key/value pair of icy-metaint in it, if that's missing then that's why you hear those bleeps.. The server includes the metadata in the stream but if the header is missing then StreamingKit tries to parse the metadata as audio thus, the bleeps!

dylancom commented 3 years ago

@dimitris-c icy-metaint seems indeed absent. Had luck with https://github.com/jorgenhenrichsen/SwiftAudio/pull/93/files but unfortunately this is based around AVPlayer.

dimitris-c commented 3 years ago

Try setting "0" on the header value in STKHTTPDataSource line 618. See if that makes any difference. I haven't got a chance to test this on my library AudioStreaming most likely to behave the same though...

dylancom commented 3 years ago

@dimitris-c Setting "Icy-MetaData" to "0" removes the random bleeps indeed so it seems your memory serves you right :) .

dimitris-c commented 3 years ago

So this is a server issue, it should provide the icy-metaint field in the header for the metadata parsing to work!

dylancom commented 3 years ago

AVPlayer can still parse it though.

iDevelopper commented 3 years ago

@dylancom ,

How do you install the StreamingKit library in your application? Cocoapods is not the latest version.

dylancom commented 3 years ago

@iDevelopper I copied all the source files located inside StreamingKit/StreamingKit/* in my Xcode project.

iDevelopper commented 3 years ago

So, I have not weird bleeps in my applications, one is available on App Store (https://apps.apple.com/fr/app/shout-radios-player/id1231770007). The next one is WIP.

dylancom commented 3 years ago

@iDevelopper I just tried your app and added: http://23.237.150.98:8512/ to favorite stations. I enabled metadata and also hear bleeps / weird noises every x seconds.

iDevelopper commented 3 years ago

@dylancom ,

Very interesting. I'll take a test!

iDevelopper commented 3 years ago

Yes, I also hear those weird noises. It must come from the server, no ?

dylancom commented 3 years ago

@iDevelopper No, when using: https://github.com/jorgenhenrichsen/SwiftAudio/pull/93/files it plays without noises and shows the metadata. (Based around AVPlayer)

iDevelopper commented 3 years ago

StreamingKit looks for the "Icy-metaint" key in the header. However, the header does not have this key but a "icy-metaint" key:

    if ([httpHeaders objectForKey:@"Icy-metaint"] != nil)
    {
        _metadataBytesRead  = 0;
        _metadataStep       = [[httpHeaders objectForKey:@"Icy-metaint"] intValue];
        _metadataOffset     = _metadataStep;
    }

If you try to replace "Icy-metaint" by "icy-metaint", it will work.

iDevelopper commented 3 years ago

What I don't understand because with the other stations the header have an "icy-metaint" key also and it works!

dimitris-c commented 3 years ago

So what I noticed is that these particular streams have the header data as part of the stream, eg they have Icy Headers. StreamingKit is parsing the data and correctly assigns the values... What happens is that normal http headers requested by CFHTTPMessageCopyAllHeaderFields are case-insensitive while the parsing of he Icy header is not, that's why it doesn't work in this case.

Now I need to find time and add parsing Icy headers in AudioStreaming

iDevelopper commented 3 years ago

@dimitris-c ,

With your brilliant explanations, and reading the documentation for the CFHTTPMessageCopyAllHeaderFields function, now I understand. Thanks a lot for that!