ios - AvPlayer streaming,所有元数据信息都在timedMetadata里?

标签 ios stream streaming avplayer

我正在使用 AvPlayer 制作的流媒体播放器创建一个 ios 应用程序。这是我的代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self InitPlayer];

    [self ReadMetaData];
}
-(void)InitPlayer{

    NSURL *url = [[NSURL alloc] initWithString:@"http://www.fakeurl.com/stream"];

    // create a player view controller
    self.player = [AVPlayer playerWithURL:url];
    player.closedCaptionDisplayEnabled = NO;


}
-(void)ReadMetaData{

    [self.player.currentItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:nil];
}

- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object
                         change:(NSDictionary*)change context:(void*)context {

    if ([keyPath isEqualToString:@"timedMetadata"])
    {
        AVPlayerItem* playerItem = object;

        for (AVMetadataItem* metadata in playerItem.timedMetadata)
        {

            if([metadata.commonKey isEqualToString:@"title"]){

                TitleLabel.text=metadata.stringValue;
            }
        }
    }
}

使用此代码,我可以成功播放和暂停流。我还可以打印轨道的标题。 如果我尝试用这样的方式记录 timedMetadata:

NSLog(@"%@",player.currentItem.timedMetadata);

我检索到:

"<AVMetadataItem: 0x15649500, identifier=common/title, keySpace=comn, key class = __NSCFConstantString, key=title, commonKey=title, extendedLanguageTag=(null), dataType=(null), time={21888/44100 = 0.496}, duration={INVALID}, startDate=(null), extras={\n}, value=Keepin-'fake song title>"

现在我的问题是:对于那个特定的流 url,我记录的 timedMetadata 是我唯一可以检索的元数据吗?如果是,我如何才能获得更复杂的播放器类型(例如“转到下一首轨道按钮”、“转到上一首轨道按钮”、“轨道历史记录”、ecc...)?这是我第一次使用流数据,在我的期望中,音频元数据中有很多信息。在现实生活中,我似乎只能获得轨道标题。我的代码有问题,或者流源的元数据信息很差?

最佳答案

我试图找到从 AVPlayer 获取元数据的最佳解决方案并找到了它:

-(IBAction) BtnGoClick:(id)sender {
    NSURL *url = [[NSURL alloc] initWithString:@"http://cast.loungefm.com.ua/loungefm"];
    [self setupAVPlayerForURL:url];
}

-(void) setupAVPlayerForURL: (NSURL*) url {
    AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
    AVPlayerItem *anItem = [AVPlayerItem playerItemWithAsset:asset];

    player = [AVPlayer playerWithPlayerItem:anItem];
    [player addObserver:self forKeyPath:@"status" options:0 context:nil];

    [anItem addObserver:self forKeyPath:@"timedMetadata" options:NSKeyValueObservingOptionNew context:NULL];
}


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    if (object == player && [keyPath isEqualToString:@"status"]) {
        if (player.status == AVPlayerStatusFailed) {
            NSLog(@"AVPlayer Failed");
        } else if (player.status == AVPlayerStatusReadyToPlay) {
            NSLog(@"AVPlayer Ready to Play");
        } else if (player.status == AVPlayerItemStatusUnknown) {
            NSLog(@"AVPlayer Unknown");
        }
        }

    if ([keyPath isEqualToString:@"timedMetadata"])
    {
        AVPlayerItem* playerItem = object;

        for (AVMetadataItem* metadata in playerItem.timedMetadata)
        {

            if([metadata.commonKey isEqualToString:@"title"]){

                NSLog(@"%@",metadata.stringValue);
            }
        }
    }
}

结果:

enter image description here

关于ios - AvPlayer streaming,所有元数据信息都在timedMetadata里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43920310/

相关文章:

ios - 从可重用 Cell 出列时,自定义 CollectionViewCell 会触发什么方法?

ios - 尝试滚动超出scrollView限制时检测拖动方向

java - 输入流上的正则表达式

ios - 同时将数据写入和读取到NSMutableArray

ios - 使用CoreBluetooth/CBCentralManager.h框架

ios - FaSTLane sigh 配置文件未正确安装

video - VLC HLS 以 native 帧速率读取输入以进行实时流式传输

c# - 有没有办法在 netTcpBinding 中同时启用 session 和流式传输?

file - 来自流的字符

asp.net - 使用FileStream ASPNET发送大文件500MB时出现OutOfMemoryException