首页 文章

AvPlayer流媒体,所有元数据信息都在timedMetadata中?

提问于
浏览
3

我正在创建一个带有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;
            }
        }
    }
}

使用此代码,我可以成功播放和暂停流 . 我也可以打印曲目的 Headers . 如果我尝试使用以下内容记录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 ......)?这是我第一次使用流数据,而且在我的期望中,音频元数据中有很多信息 . 在现实生活中似乎我只能获得曲目 Headers . 我的代码有问题,或者流源的元数据信息很差?

1 回答

  • 3

    噢,这是一个非常棒的问题,我可以帮助解决你的问题 . 大约2个月后,我试图找到最佳解决方案,从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);
                }
            }
        }
    }
    

    Result:
    enter image description here

相关问题