标签: avplayerlayer

使用AVPlayer的多个视频

我正在开发一款适用于iPad的iOS应用程序,需要在屏幕的某些部分播放视频.我有几个视频文件需要按照编译时未给出的顺序互相播放.它看起来好像只是一个视频播放.从一个视频转到另一个视频是很好的,这是两个视频的最后一帧或第一帧显示的延迟,但是没有闪烁或没有内容的白色屏幕.视频不包含音频.考虑内存使用情况非常重要.视频具有非常高的分辨率,并且可以同时彼此相邻地播放几个不同的视频序列.

为了获得这个,我已经尝试了一些解决方案.它们列在下面:

1.带有AVComposition的AVPlayer,其中包含所有视频

在这个解决方案中,我有一个AVPlayer,只能在AVPlayerItem上使用AVComposition制作,AVComposition包含彼此相邻的所有视频.当我去特定的视频时,我会在下一个视频开始的构图中寻找时间.这个解决方案的问题是,当寻找时,播放器将快速显示它正在寻找的一些帧,这是不可接受的.似乎没有办法直接跳到合成中的特定时间.我尝试通过制作刚完成的视频中最后一帧的图像来解决这个问题,然后在搜索时显示在AVPLayer前面,最后在搜索完成后删除它.我使用AVAssetImageGenerator制作图像,但由于某种原因,图像的质量与视频不同,因此在视频上显示和隐藏图像时会有显着的变化.另一个问题是AVPlayer使用大量内存,因为单个AVPlayerItem包含所有视频.

2.具有多个AVPlayerItem的AVPlayer

此解决方案为每个视频使用AVPlayerItem,并在切换到新视频时替换AVPlayer的项目.这个问题是,当切换AVPlayer的项目时,它会在加载新项目时短时间显示白色屏幕.为了解决这个问题,可以使用在加载时将图像放在最后一帧的前面的解决方案,但仍然存在图像和视频的质量不同且值得注意的问题.

3.两个AVPlayers互相排斥,轮流播放AVPlayerItem

我尝试的下一个解决方案是让两个AVPlayer在彼此之上,轮流播放AVPlayerItems.因此,当玩家完成播放时,它将保留在视频的最后一帧.另一个AVPlayer将被带到前面(其项目设置为nil,因此它是透明的),并且下一个AVPlayerItem将被插入到该AVPlayer中.一旦加载它就会开始播放,两个视频之间顺畅交易的错觉将完好无损.此解决方案的问题是内存使用情况.在某些情况下,我需要同时在屏幕上播放两个视频,这将导致4个AVPlayers同时加载AVPlayerItem.这只是太多的记忆,因为视频可以分辨率非常高.


有没有人有一些关于整体问题和上面发布的尝试解决方案的想法,建议,评论或其他内容.

objective-c ios avplayer avcomposition avplayerlayer

38
推荐指数
2
解决办法
2万
查看次数

来电后AV播放器恢复正常

我正在AVPlayer用于音乐播放.我的问题是,在来电后,播放器将无法恢复.来电时如何处理此问题?

ios avplayer avplayerlayer ios7

26
推荐指数
2
解决办法
1万
查看次数

在tvOS上播放时出现AVPlayer错误

我正在使用以下代码在tvOS上播放视频:

NSString *filePath = [[NSBundle mainBundle] pathForResource:name ofType:@"mov"];
NSURL *fileUrl = [NSURL fileURLWithPath:filePath];

self.player = [AVPlayer playerWithURL:fileUrl];
AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];

avPlayerLayer.frame = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height);
[view.layer addSublayer:avPlayerLayer];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(replayMovie:) name:AVPlayerItemDidPlayToEndTimeNotification object:nil];

[self.player play];
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误

错误:> aqme> 718:MEMixerChannel :: EnableProcessor:无法打开处理器类型0x705f6571

任何想法如何解决它?

objective-c avplayer avplayerlayer tvos

19
推荐指数
1
解决办法
2566
查看次数

AVPlayer视频空白但听到声音

我正在切换MPMoviePlayerControllerAVPlayer我需要对视频交换进行更细粒度的控制..mov我正在播放的文件MPMoviePlayerController播放得很好,但在切换到AVPlayer我听到视频中的音频后,视频只显示我添加AVPlayerLayer到的视图背景.这是我如何初始化AVPlayer.

self.player = [[AVPlayer alloc] initWithURL:video];

AVPlayerLayer* playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
playerLayer.frame = self.playerContainer.bounds;
[self.playerContainer.layer addSublayer:playerLayer];
Run Code Online (Sandbox Code Playgroud)

后来我发了一个.

[self.player play];
Run Code Online (Sandbox Code Playgroud)

播放视频时,我会听到音频,但看不到视频.我也尝试将zPosition设置为没有运气.

playerLayer.zPosition = 1;
Run Code Online (Sandbox Code Playgroud)

iphone objective-c ios avplayer avplayerlayer

15
推荐指数
1
解决办法
7712
查看次数

AVPlayerLayer没有绑定到UIView框架

我正在尝试将AVPlayerLayer添加到UIView

    self.player = AVPlayer(URL: NSURL(fileURLWithPath: path!))
    self.playerLayer = AVPlayerLayer(player: player);
    self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    self.playerLayer.frame =  ctrVideo.bounds;
    self.ctrVideo.layer.addSublayer(playerLayer);
    player.play();
Run Code Online (Sandbox Code Playgroud)

这是视频的容器(蓝色):

这是观点:

约束: 约束:

最后结果: 在此输入图像描述

我无法弄清楚为什么视频没有绑定到UIVIew坐标.如果我把它绑定到控制器的超级视图中,那就没关系.

iphone xcode cglayer avplayerlayer swift

15
推荐指数
1
解决办法
6157
查看次数

NSKeyValueObservation:无法从对象中删除关键路径的观察者,因为它未注册为观察者

我在我的应用程序中遇到随机崩溃(我无法在我拥有的设备上重现),例外情况:

无法从AVPlayerLayer 0xaddress中删除关键路径"readyForDisplay"的观察者Foundation.NSKeyValueObservation 0xaddress,因为它未注册为观察者.

当我释放包含AVPlayerLayer的UIView时会发生这种情况.

我的初学者:

private var playerLayer : AVPlayerLayer { return self.layer as! AVPlayerLayer }

init(withURL url : URL) {
    ...
    self.asset = AVURLAsset(url: url)
    self.playerItem = AVPlayerItem(asset: self.asset)
    self.avPlayer = AVPlayer(playerItem: self.playerItem)
    super.init(frame: .zero)
    ...
    let avPlayerLayerIsReadyForDisplayObs = self.playerLayer.observe(\AVPlayerLayer.isReadyForDisplay, options: [.new]) { [weak self] (plLayer, change) in ... }
    self.kvoPlayerObservers = [..., avPlayerLayerIsReadyForDisplayObs, ...]
    ...
    }
Run Code Online (Sandbox Code Playgroud)

我的deinit抛出异常:

deinit {
    self.kvoPlayerObservers.forEach { $0.invalidate() }
    ...
    NotificationCenter.default.removeObserver(self)
}
Run Code Online (Sandbox Code Playgroud)

根据Crashlytics的说法,它发生在不同iPhone上的iOS 11.4.1上.

导致的代码deinit非常简单:

// Some UIViewController context.
self.viewWithAVLayer?.removeFromSuperview()
self.viewWithAVLayer …
Run Code Online (Sandbox Code Playgroud)

key-value-observing ios avplayerlayer swift

14
推荐指数
1
解决办法
1464
查看次数

使用AVQueuePlayer时如何在视频之间添加转换?

我正在制作一个视频应用程序,一个接一个地播放大量视频.视频存储在一个AVPlayerItems 数组中.AVQueuePlayer初始化与那些AVPlayerItems和它自动地从该阵列播放视频.

问题是,当它改变播放下一个视频就被卡住了几分之一秒,或者它从一个到另一个过渡的时间创建了一个混蛋.我想改善与某种动画如淡入这一过渡,而更改视频淡出.

我的代码AVQueuePlayer:

AVQueuePlayer *mediaPlayer = [[AVQueuePlayer alloc] initWithItems:arrPlayerItems];
playerLayer=[AVPlayerLayer playerLayerWithPlayer:mediaPlayer];
playerLayer.frame=self.bounds;
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
playerLayer.needsDisplayOnBoundsChange = NO;
[self.layer addSublayer:playerLayer];
self.layer.needsDisplayOnBoundsChange = YES;

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(itemPlayEnded:)
                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                           object:[mediaPlayer currentItem]];
Run Code Online (Sandbox Code Playgroud)

我试图创建在过渡的时间一个新层,通过降低其不透明度和增加新的图层的不透明度动画旧层(创建淡出效果所需的渐暗),但可根据需要它无法正常工作.

自定义转换的代码:

-(void)TransitionInVideos {
    if (roundf(CMTimeGetSeconds(mediaPlayer.currentTime))==roundf(CMTimeGetSeconds(mediaPlayer.currentItem.duration))) {
        [self.layer addSublayer:playerLayerTmp];

        //Animation for the transition between videos
        [self performSelector:@selector(FadeIn) withObject:nil afterDelay:0.3];
        [self performSelector:@selector(FadeOut) withObject:nil afterDelay:0.3];
    }
}

-(void)FadeIn {
    CABasicAnimation* fadeAnim = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeAnim.fromValue = [NSNumber numberWithFloat:1.0];
    fadeAnim.toValue = [NSNumber numberWithFloat:0.0];
    fadeAnim.duration …
Run Code Online (Sandbox Code Playgroud)

ios avplayer avqueueplayer avplayerlayer

13
推荐指数
1
解决办法
3796
查看次数

应用程序激活后恢复AVPlayer视频播放

我从AVPlayer编写自定义播放器进行视频播放.根据Apple docs设置的视频层:

    self.player = [IPLPlayer new];
    self.player.playerLayer = (AVPlayerLayer *)self.playerView.layer;
Run Code Online (Sandbox Code Playgroud)

self.playerView是那些文档的常用类:

    @implementation PlayerView

+ (Class) layerClass {
    return [AVPlayerLayer class];
}

- (AVPlayer *)player {
    return [(AVPlayerLayer *)[self layer] player];
}

- (void)setPlayer:(AVPlayer *) player {
    [(AVPlayerLayer *) [self layer] setPlayer:player];
}
Run Code Online (Sandbox Code Playgroud)

问题是:当关闭应用程序(主页按钮)或阻止屏幕时,视频播放停止,当恢复仅恢复音频播放时,屏幕上的图像仍然是块屏幕之前的图像 - 它是完全静态的并且记录更改帧.

如何在屏幕被阻止后恢复视频播放?

似乎我必须注册通知,并在应用程序变为活动后恢复视频层:

    -(void)registerNotification
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(willEnterBackground)
                                                 name:UIApplicationWillResignActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(didEnterForeground)
                                                 name:UIApplicationDidBecomeActiveNotification object:nil];
}

-(void)unregisterNotification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}


-(void)willEnterBackground
{
    NSLog(@"willEnterBackground");
    [self.playerView willEnterBackground];
}

-(void)didEnterForeground
{
    NSLog(@"didEnterForeground");
    [self.playerView didEnterForeground];
}
Run Code Online (Sandbox Code Playgroud)

iphone ios avplayer avplayerlayer

11
推荐指数
2
解决办法
1万
查看次数

如何在Swift AVPlayer中获取特定的视频区域?

我正在研究Swift基础MAC OS-X应用程序.用户将选择一个视频文件,NSView Controller将使用AVPlayerView播放视频.用户可以在AVPlayerView上绘制一个矩形,我已经实现了这个功能.如何将矩形中的选定区域视频显示到摄像机右下方的预览图层?

这是输出: 输出图片

这是代码:

var videoURL = NSURL() // The video file URL by the file chooser
var videoSize = NSSize() // Here the video resolution size will be kept i.e. 720*480
var player:AVPlayerView! // The AVPlayerView to play video

var cameraPreviewLayer:AVPlayerLayer! //The right bottom camera Preview Layer
var rectangleLayer:AVPlayerLayer! // The rectangle that will draw over AVPlayer while mouse dragging

var isClicked = false
var startPoint = NSPoint() // holds the starting point location …
Run Code Online (Sandbox Code Playgroud)

macos ios avplayer avplayerlayer swift

11
推荐指数
0
解决办法
2099
查看次数

如何获取AVPlayer的视频帧?

我有用于显示AVPlayer播放的PlayerView类.文档代码.

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface PlayerView : UIView
@property (nonatomic) AVPlayer *player;
@end

@implementation PlayerView
+ (Class)layerClass {
    return [AVPlayerLayer class];
}
- (AVPlayer*)player {
    return [(AVPlayerLayer *)[self layer] player];
}
- (void)setPlayer:(AVPlayer *)player {
    [(AVPlayerLayer *)[self layer] setPlayer:player];
}
@end
Run Code Online (Sandbox Code Playgroud)

我在此PlayerView中设置了我的AVPlayer(包含大小为320x240的视频资产)(frame.size.width = 100,frame.size.height = 100)并调整了我的视频大小.添加PlayerView后如何获得视频大小?

objective-c avfoundation avplayer avplayerlayer

10
推荐指数
3
解决办法
2万
查看次数