3

のビデオ トラックの自然なサイズを取得しようとしていAVURLAssetます。だから私はアセットtracksをロードしていloadValuesAsynchronouslyForKeys:completionHandler:ます。完了ハンドラーで、ステータスが の場合は、空ですAVKeyValueStatusLoadedasset.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 ライブ ストリーミングで提供されるため、トラックはありません。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 に答える