首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTTP实时流AVAsset

HTTP实时流AVAsset
EN

Stack Overflow用户
提问于 2014-03-06 06:51:19
回答 1查看 1.1K关注 0票数 1

我正在使用avplayer用OSX实现n个HTTP直播播放器。我能够正确地流它,寻找和获得持续时间,时间等。现在我想采取屏幕截图和处理从它使用OpenCV的帧。我选择使用AVASSetImageGenerator。但是,与AVAsset没有音频和视频轨道,这是与player.currentItem相关的。

轨道出现在player.currentItem.tracks上。所以我不能起诉AVAssetGenerator。在这样的场景中,有谁能帮助找出一个方案来提取屏幕截图和单个帧呢?

请找到下面的代码,我是如何启动HTTP实时流的

提前谢谢。

代码语言:javascript
复制
NSURL* url = [NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
playeritem = [AVPlayerItem playerItemWithURL:url];

[playeritem addObserver:self forKeyPath:@"status" options:0 context:AVSPPlayerStatusContext];
[self setPlayer:[AVPlayer playerWithPlayerItem:playeritem]];
[self addObserver:self forKeyPath:@"player.rate" options:NSKeyValueObservingOptionNew context:AVSPPlayerRateContext];
[self addObserver:self forKeyPath:@"player.currentItem.status" options:NSKeyValueObservingOptionNew context:AVSPPlayerItemStatusContext];
AVPlayerLayer *newPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:[self player]];
[newPlayerLayer setFrame:[[[self playerView] layer] bounds]];
[newPlayerLayer setAutoresizingMask:kCALayerWidthSizable | kCALayerHeightSizable];
[newPlayerLayer setHidden:YES];
[[[self playerView] layer] addSublayer:newPlayerLayer];
[self setPlayerLayer:newPlayerLayer];
[self addObserver:self forKeyPath:@"playerLayer.readyForDisplay" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:AVSPPlayerLayerReadyForDisplay];
[self.player play];    

下面是我如何检查视频轨道是否存在资产

代码语言:javascript
复制
case AVPlayerItemStatusReadyToPlay:

                [self setTimeObserverToken:[[self player] addPeriodicTimeObserverForInterval:CMTimeMake(1, 10) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
                    [[self timeSlider] setDoubleValue:CMTimeGetSeconds(time)];
                    NSLog(@"%f,%f,%f",[self currentTime],[self duration],[[self player] rate]);
                    AVPlayerItem *item = playeritem;
                    if(item.status == AVPlayerItemStatusReadyToPlay)
                    {
                    AVAsset *asset = (AVAsset *)item.asset;
                    long audiotracks = [[asset tracks] count];
                    long videotracks = [[asset availableMediaCharacteristicsWithMediaSelectionOptions]count];

                    NSLog(@"Track info Audio = %ld,Video=%ld",audiotracks,videotracks);
                    }
                }]];



                AVPlayerItem *item = self.player.currentItem;
                if(item.status != AVPlayerItemStatusReadyToPlay)
                    return;
                AVURLAsset *asset = (AVURLAsset *)item.asset;
                long audiotracks = [[asset tracksWithMediaType:AVMediaTypeAudio]count];
                long videotracks = [[asset tracksWithMediaType:AVMediaTypeVideo]count];

                NSLog(@"Track info Audio = %ld,Video=%ld",audiotracks,videotracks);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-12 15:47:56

这是一个较老的问题,但如果有人需要帮助,我有答案

代码语言:javascript
复制
AVURLAsset *asset = /* Your Asset here! */;
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.requestedTimeToleranceAfter =  kCMTimeZero;
generator.requestedTimeToleranceBefore =  kCMTimeZero;
for (Float64 i = 0; i < CMTimeGetSeconds(asset.duration) *  /* Put the FPS of the source video here */ ; i++){
    @autoreleasepool {
        CMTime time = CMTimeMake(i, /* Put the FPS of the source video here */);

        NSError *err;
        CMTime actualTime;
        CGImageRef image = [generator copyCGImageAtTime:time actualTime:&actualTime error:&err];

        // Do what you want with the image, for example save it as UIImage
        UIImage *generatedImage = [[UIImage alloc] initWithCGImage:image];

        CGImageRelease(image);
    }
}

通过使用以下代码,可以轻松获得视频的FPS:

代码语言:javascript
复制
float fps=0.00;
if (asset) {
    AVAssetTrack * videoATrack = [asset tracksWithMediaType:AVMediaTypeVideo][0];
    if(videoATrack)
    {
        fps = [videoATrack nominalFrameRate];
    }
}

希望这能帮助那些询问如何从视频中获取所有帧的人,或者只是一些特定的(比如CMTime )帧。请记住,将所有帧保存到一个数组中几乎不会影响内存!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22217195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档