使用HTTP Live Streaming切换音频轨道

4
当HLS流准备播放时,我正在生成可用音轨列表。我可以很好地访问可用的音轨,但我很难提取每个音轨的正确“标题”。我正在使用苹果的测试流,其中有两个音轨。我使用以下代码提取音轨...
availableAudioTrackList = [[NSMutableArray alloc] init];
AVMediaSelectionGroup *audioTracks = [player.currentItem.asset mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicAudible];
for (int i = 0; i < [audioTracks.options count]; i++) {
    AVMediaSelectionOption *opt = audioTracks.options[i];
    NSLog(@"Opt: %@", opt);
    [availableAudioTrackList insertObject:opt.displayName atIndex:i];
}
NSLog(@"Audio Track Array: %@", availableAudioTrackList);

我的输出显示'opt.displayName'并没有给出BipBop Audio 1和BipBop Audio 2的标题(这些是我想要使用的区分名称)。
... Opt: <AVMediaSelectionKeyValueOption: 0x15dad0d0, locale = en, mediaType = 'soun', title = BipBop Audio 1, default = YES> 
... Opt: <AVMediaSelectionKeyValueOption: 0x15dad100, locale = en, mediaType = 'soun', title = BipBop Audio 2>

...Audio Track Array: ( English, English )

有什么方法/是否可以从AVMediaSelectionOption对象中提取标题?
谢谢!

displayName 属性中包含什么内容? - vipw
@vipw,这就是我困惑的地方。我做了一个类似的调用来生成播放器项目中的字幕,它会返回AVMediaSelectionOption的标题。我的输出显示音轨的标题为“BipBop Audio 1”,这就是我试图访问的字符串。 - timgcarlson
1个回答

4
你需要从元数据中提取它,方法如下:
    NSArray *metaDatas = [AVMetadataItem metadataItemsFromArray:opt.commonMetadata withKey:@"title" keySpace:@"comn"];
    if (metaDatas.count > 0) {
      NSString *title = ((AVMetadataItem*)[metaDatas objectAtIndex:0]).stringValue;
      NSLog(@"title: %@", title);
    }

这是正确的解决方案!非常感谢!在我发布了这个问题后,我把它搁置了一段时间,现在回来正好合适。我对您的解决方案进行了一个编辑,因为'opt'不是NSArray,但通过访问它的commonMetadata属性已经得到修复。再次感谢! - timgcarlson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接