3

我正在尝试获取AVURLAsset. 所以我tracksloadValuesAsynchronouslyForKeys:completionHandler:. 在完成处理程序中,当状态为时,AVKeyValueStatusLoaded我查看asset.tracks它并且它是空的。我期待至少找到一个音频和视频轨道。为什么轨道数组是空的?

这是我的代码:

#import <AVFoundation/AVFoundation.h>

int main(int argc, char *argv[])
{
    __block BOOL loaded = NO;
    AVURLAsset *asset;
    @autoreleasepool
    {
        NSURL *url = [NSURL URLWithString:@"https://devimages.apple.com.edgekey.net/resources/http-streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8"];
        asset = [AVURLAsset URLAssetWithURL:url options:nil];
        [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:@"tracks"] completionHandler:^{
            loaded = YES;
            dispatch_async(dispatch_get_main_queue(), ^{
                NSError *error = nil;
                AVKeyValueStatus status = [asset statusOfValueForKey:@"tracks" error:&error];
                if (status == AVKeyValueStatusLoaded)
                    NSLog(@"asset.tracks (%ld): %@", [asset.tracks count], asset.tracks);
                else
                    NSLog(@"error (%ld): %@", status, error);
            });
        }];
    }

    while (!loaded)
        [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

    return 0;
}

在 Mountain Lion 10.8.1 上运行此代码会记录以下内容:

asset.tracks (0): (
)

更新有些人指出我可能无法获得曲目,因为我使用的是HTTP 实时流URL。因此,任何获取当前播放视频大小的方法(是否使用曲目)都是可以接受的答案。

4

1 回答 1

5

由于资产是通过HTTP Live Streaming提供的,因此它没有任何轨道。获取视频大小的另一种方法是presentationSize使用 KVO 观察播放器项目属性:

AVPlayer *player = [AVPlayer playerWithPlayerItem:[AVPlayerItem playerItemWithAsset:asset]];
[player addObserver:self forKeyPath:@"currentItem.presentationSize" options:NSKeyValueObservingOptionNew context:NULL];
于 2012-09-18T08:01:49.100 回答