ios - 流数据(艺术家/标题)未显示在 xcode 的 AVPlayerItemTrack 数组中

标签 ios xcode avplayeritem

我有以下代码,当在大多数(Shoutcast)流媒体服务器上使用时,它会返回艺术家/歌曲元数据,但在特定服务器上它不起作用,只是显示字母“t”!

由于 NSLog 目前对我不起作用(尽管进行了各种更改,我无法让它工作(Xcode 9.2)),所以我有点一头雾水。

- (void)FetchMeta
{
    for (AVPlayerItemTrack *item in player.currentItem.tracks)
    {
        if ([item.assetTrack.mediaType isEqual:AVMediaTypeAudio])
        {
            NSArray *meta = [playerItem timedMetadata];
            for (AVMetadataItem *metaItem in meta)
            {
                NSString *source = metaItem.stringValue;
                if(![source isEqualToString:self.songInfo.text])
                {
                    self.songInfo.text = [source stringByAppendingString:@"  "];
                    //self.songInfo.text = @"Test";
                    [self LoadArtistImage];
                }
                NSLog(@"meta %@\n%@",source,metaItem.extraAttributes);
            }
        }
    }
}

我知道我在代码的正确部分,因为如果我取消注释 //self.songInfo.text = @"Test"; 行,我会在显示屏上看到它歌曲元数据应该出现,但是已经在这上面稳定显示了 3 个小时并且无法让它显示元数据并且没有 NSLog 真的没有帮助。

更新:我已经能够询问服务器并且可以看到差异,但我仍然不知道如何告诉代码在正确的字段中查找......我的理解是数据被放入数组中(我认为)但它走错了领域。也许它总是只占用最后一个字段?明确地说,我正在寻找它来获取“StreamTitle”字段。

工作服务器响应:

Input #0, mp3, from 'http://server:port':
  Metadata:
    icy-notice1     : <BR>This stream requires <a href="http://www.winamp.com">Winamp</a><BR>
    icy-notice2     : SHOUTcast DNAS/posix(linux x86) v2.5.1.724<BR>
    icy-name        : Station Name
    icy-genre       : 80s, Pop
    icy-br          : 128
    icy-sr          : 44100
    icy-url         : http://website.com
    icy-pub         : 1
    StreamTitle     : Rod Stewart - Lost In You

非工作服务器响应:

Input #0, mp3, from 'http://server:port/':
  Metadata:
    icy-notice1     : <BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR>
    icy-notice2     : SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>
    icy-name        : Station Name
    icy-genre       : Various
    icy-url         : www.website.com
    icy-pub         : 1
    icy-br          : 128
    StreamTitle     : Theory of a Deadman - Rx
    StreamUrl       : t

进一步澄清。 “工作服务器”输出正常工作,使用显示的代码显示“StreamTitle”字段,非工作服务器显示最后一个字段“StreamUrl”,这不是所需的字段。

有什么建议吗?

非常感谢。

最佳答案

正如@Larme 所说,您的循环实质上会将您的文本字段依次设置为每个项目的值,因此最后一个项目的值“获胜”。

如果循环中的当前项是流标题,则只需设置文本字段,例如:

        for (AVMetadataItem *metaItem in meta)
        {
            if([metaItem.key isEqualTo: AVMetadataIcyMetadataKeyStreamTitle])
            {
                self.songInfo.text = metaItem.stringValue;
            }
        }

关于ios - 流数据(艺术家/标题)未显示在 xcode 的 AVPlayerItemTrack 数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48342163/

相关文章:

ios - 在 iOS 中的特定时间启动本地通知

ios - 在 textField 集合中查找空的 textField

ios - "playbackBufferFull"和 "playbackBufferEmpty"属性有什么区别?

ios - 将 AVPlayerItem 转换为 NSData

ios - 解析 JSONArray 包含 JSONObjects Swift

ios - 是否有在 iOS 应用程序中设置后备本地化语言的官方方法?

xcode - macOS 应用程序不能分发 "developer ID"(选项不显示)

objective-c - 如何在私有(private)方法的调试器控制台中打印 self

c++ - 不会创建 Makefile

ios - 尽管没有错误,AVPlayer 仍无法播放音频