为什么加载后AVURLAsset的轨道数组为空?

0xc*_*ced 3 cocoa avfoundation

我正试图获得视频轨道的自然尺寸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;
}
Run Code Online (Sandbox Code Playgroud)

在Mountain Lion 10.8.1上运行此代码记录此:

asset.tracks (0): (
)
Run Code Online (Sandbox Code Playgroud)

更新有些人向我指出,我可能无法获得曲目,因为我正在使用HTTP直播流媒体网址.因此,任何方式(使用或不使用曲目)来获得当前播放视频的大小都是可以接受的答案.

0xc*_*ced 5

由于资产是通过HTTP Live Streaming提供的,因此它没有任何跟踪.检索视频大小的另一种方法是presentationSize使用KVO 观察播放器项属性:

AVPlayer *player = [AVPlayer playerWithPlayerItem:[AVPlayerItem playerItemWithAsset:asset]];
[player addObserver:self forKeyPath:@"currentItem.presentationSize" options:NSKeyValueObservingOptionNew context:NULL];
Run Code Online (Sandbox Code Playgroud)