标签: avplayerlayer

AVPlayer没有显示任何内容

我尝试在youtube vimeo中嵌入不同的视频,dailymotion.

可悲的是,除了我的containerView的backgroundcolor之外,没有显示任何内容:

UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0, 320.0f, 200.0f)];

//item.url is my url which i get fro my webserver, it looks like http://www.youtube.com/watch?v=zPP6lXaL7KA&feature=youtube_gdata_player

            AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:item.url]];

            AVPlayer *avPlayer = [AVPlayer playerWithPlayerItem:playerItem];

            NSLog(@"%@",playerItem);

            AVPlayerLayer *avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];

            avPlayerLayer.frame = self.frame;
            [containerView.layer addSublayer:avPlayerLayer];
            [self addSubview:containerView];
            [avPlayer play];

            if (avPlayer.status == AVPlayerStatusReadyToPlay) {
                //[playingLbl setText:@"Playing Audio"];
                NSLog(@"It works");

            } else if (avPlayer.status == AVPlayerStatusFailed) {
                // something went wrong. player.error should contain some information
                NSLog(@"Not works"); …
Run Code Online (Sandbox Code Playgroud)

youtube objective-c ios avplayer avplayerlayer

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

如何避免AVPlayerLayer`setPlayer`音频短片?

我有一个使用AVPlayer和播放视频的应用程序AVPlayerLayer.在我的应用程序中,当应用程序进入后台时player,我AVPlayerLayer可以通过设置my 的属性来锁定应用程序时播放音频nil:

-(void)appEnteredBackgroundNotification:(NSNotification *)notification {

    [[self playerLayer] setPlayer:nil];

}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,音频将滞后/闪烁约0.5秒.对最终用户来说这听起来真的很糟糕.当应用程序进入前台并重新设置player属性时也是如此.

我怎样才能避免这种音频昙花一现?作为测试,我尝试在后台线程中删除播放器无济于事.

更新:我在WWDC上与一位苹果工程师进行了交谈,他们说这个问题是他们的一个错误(到目前为止还没有在iOS 9中修复),这种方法是正确的方法.大...

ios avplayer avplayerlayer

7
推荐指数
1
解决办法
267
查看次数

在AVPlayerLayer上拉伸视频

我使用以下代码在我的UIView上显示全屏视频:

- (void)playMovie:(NSString *)name :(NSString *)type
{
    NSURL *movieURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:name ofType:type]];

    self.movieAsset = [AVAsset assetWithURL:movieURL];
    self.movieItem = [[AVPlayerItem alloc] initWithAsset:self.movieAsset];
    self.moviePlayer = [[AVPlayer alloc] initWithPlayerItem:self.movieItem];
    self.moviePlayer.actionAtItemEnd = AVPlayerActionAtItemEndNone;
    self.movieLayer.videoGravity = AVLayerVideoGravityResize;

    self.movieLayer = [AVPlayerLayer playerLayerWithPlayer:self.moviePlayer];
    [self.movieLayer setFrame:self.view.frame];

    [self.view.layer addSublayer:self.movieLayer];
    [self.moviePlayer addObserver:self forKeyPath:@"status" options:0 context:nil];

    // Schedule stop after 6 seconds
    [NSTimer scheduledTimerWithTimeInterval:6.0 target:self selector:@selector(stopCurrentMovie:) userInfo:nil repeats:NO];
}
Run Code Online (Sandbox Code Playgroud)

视频正在播放,但它不会在整个屏幕上填充(如果需要的话),但它只调整大小以保持其宽高比:我已经尝试了"videoGravity"的所有三个值...似乎没有任何改变.

我怎么解决?谢谢

video objective-c ios avplayer avplayerlayer

6
推荐指数
1
解决办法
3794
查看次数

Swift:调整AVPlayerLayer的大小以匹配其父容器的边界

我有一个本地视频播放使用AVPlayerAVPlayerLayer(斯威夫特的iOS 8.2),我需要调整AVPlayerLayer(introPlayerLayer当它的父视图() introView)被调整,包括对取向变化.到目前为止,我所尝试过的任何东西似乎都没有用,而且playerLayer它的大小和位置都不对.

AVPlayer设置使用本地MP4视频,并且AVPlayerLayer正在使用该播放器初始化.然后将该图层作为子图层添加到父视图中.

这是我的代码:

func playIntro() {
    let path = NSBundle.mainBundle().pathForResource("intro", ofType: "mp4")
    let url  = NSURL.fileURLWithPath(path!)
    let introPlayer           = AVPlayer(URL: url)
    introPlayer.allowsExternalPlayback = false

    var introPlayerLayer = AVPlayerLayer(player: introPlayer)
    introView.layer.addSublayer(introPlayerLayer)
    introPlayerLayer.frame = introView.bounds

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "playerDidFinishPlaying:", name: AVPlayerItemDidPlayToEndTimeNotification, object: introPlayer.currentItem)

    introView.hidden = false
    introPlayer.play()
}
Run Code Online (Sandbox Code Playgroud)

我应该添加AVPlayerLayer作为子层UIView,或者我应该继承父容器(UIView),如https://developer.apple.com/library/ios/documentation/AudioVideo/的"播放器视图"部分所示Conceptual/AVFoundationPG/Articles/02_Playback.html.如果是这样,我将如何PlayerView在Swift中编写该子类(在Objective-C中显示)?提前感谢您的任何帮助.

iphone ios avplayer avplayerlayer swift

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

AVPlayer的视频和音频在暂停然后恢复视频后变得不同步

我正在使用AVPlayer我的应用中播放视频.视频播放始终完美无缺,但暂停/恢复视频时除外.如果用户按下暂停按钮,然后恢复视频,则有时音频将位于视频之前.

视频将在正确的位置恢复,但音频已提前.这就好像按下暂停时,音频一直在运行.

当他们按下暂停按钮时,我正在做的就是调用pause方法AVPlayer,我也尝试根据文档设置它的rate属性0.0应该是完全相同的东西.

我只注意到我升级后,这种行为iPhone 6iOS 9.我已经在iPhone 6 Simulator使用上测试了这个iOS 8.4并且我无法重新创建这种行为,但是AVPlayer在真实设备和模拟器上使用时通常存在差异所以我不能说100%确定到现在为止无法重新创建bug上iOS 8也是如此.

如果您查看iOS 9发行说明并搜索" AVFoundation",您会发现有些内容已发生变化:https://developer.apple.com/library/prerelease/ios/releasenotes/General/RN-iOSSDK-9.0/

我认为AVPlayerItem's新属性canUseNetworkResourcesForLiveStreamingWhilePaused是这个问题的根源,但经过测试,无论我是将其设置为YES或者NO,在这两种情况下问题仍然存在.

在这一点上,我不知道为什么会这样,但现在我最好的猜测是这是一个iOS 9错误.

我希望我不是唯一经历过这种情况的人,并且有人已经找到了解决方案,或者可能知道为什么会这样.我愿意尝试和测试任何东西.

谢谢您的帮助.

avfoundation avplayer avplayerlayer avplayeritem ios9

6
推荐指数
0
解决办法
709
查看次数

AVPlayerLayer作为SCNMaterial没有渲染,音频播放正常

我正在尝试将AVPlayerLayer用作SCNMaterial分配给SCNSphere.

基于:https: //developer.apple.com/library/mac/samplecode/SceneKit_Slides_WWDC2013/Listings/Scene_Kit_Session_WWDC_2013_Sources_Slides_ASCSlideMaterialLayer_m.html

我创建一个玩家,创建一个玩家图层并尝试使用和不使用backgroundLayer作为我的SCNSphere的材质

问题是,我得到了相同的结果: SCNMaterialProperty没有渲染层

音频播放,视频根本没有渲染!

代码很简单:

    // video player
    let path = NSBundle.mainBundle().pathForResource("tb", ofType: "mp4")
    let url  = NSURL(fileURLWithPath: path!)
    let player = AVPlayer(URL: url)             // AVPlayer
    player.actionAtItemEnd = .None
    player.play()

    let frame = CGRectMake(0, 0, 300, 300)

    let playerLayer = AVPlayerLayer()
    playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    playerLayer.frame = frame
    playerLayer.player = player


    sceneMaterial = SCNMaterial()
    sceneMaterial.specular.contents = UIColor.whiteColor()
    sceneMaterial.shininess = 0.5
    sceneMaterial.diffuse.contents = playerLayer
    sphere.materials = [sceneMaterial]
Run Code Online (Sandbox Code Playgroud)

如上所述,我是否使用backgroundLayer:CALayer并将playerLayer添加为子图层会产生相同的结果.

任何帮助表示赞赏

avfoundation calayer avplayer avplayerlayer scenekit

6
推荐指数
1
解决办法
499
查看次数

AVPlayerLayer 显示黑屏但声音正常

我尝试在AVPlayerLayer中显示本地录制的视频,该视频有时可以工作。我可以听到录制视频中的音频,但看不到视频。有时视频和音频都可以工作,有时只有音频。

我已经尝试过使用AVPlayerLayerAVPlayerViewController,但这两种情况都会出现相同的问题。所以这不是因为框架错误。

示例代码AVPlayerViewController

let player = AVPlayer(url: url)
let playerController = AVPlayerViewController()
playerController.player = player

self.present(playerController, animated: true) {
  player.play()
}
Run Code Online (Sandbox Code Playgroud)

示例代码AVPlayerLayer

let asset = AVAsset(url: url)
let item = AVPlayerItem(asset: asset)

self.player = AVPlayer(playerItem: item)
self.player?.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions(), context: nil)
self.playerLayer = AVPlayerLayer(player: self.player!)
self.playerLayer?.frame = imageView.bounds
imageView.layer.addSublayer(self.playerLayer!)
Run Code Online (Sandbox Code Playgroud)

编辑1:

观察播放器状态时,错误nil状态readyToPlay

编辑2:

如果 URL 是远程的,则工作正常。

编辑3:

如果我在视频完成导出后等待几秒钟,似乎可以工作。是否是文件未 100% 写入文件系统的原因? …

avfoundation ios avplayerlayer swift avplayerviewcontroller

5
推荐指数
1
解决办法
3764
查看次数

AVPlayer 空白视频:播放声音但没有视频

这个问题有同样的问题,但解决方案不起作用。

AVPlayer有时扮演一个空白视频:有声音,但没有视频。

在播放空白视频时,我们打印了播放器的帧和状态。帧不为零并且设置正确。状态也是readyToPlay。该play函数也在主线程上调用。

换句话说,播放器层的帧有效,播放器也准备好播放。然而没有视频出现,即使有声音。

这个问题似乎是一个时间问题。如果我们在播放视频前等待 5-10 秒,则视频每次都能正常播放。

此问题出现在 iOS 10 上,而不是 iOS 8 或 9。

这个线程在苹果论坛上表明,它可能与一个bug AVVideoCompositionCoreAnimationTool,我们也可以使用。

任何解决方案?

与 iPhone 5s 设备相比,这种情况在 iPhone 7 设备上发生的频率更高。

代码:

fileprivate func playVideo(_ videoURL: String, prompt: String) {
    // Show <playerView>
    playerView.isHidden = false

    // Use new video in player
    playerItem = AVPlayerItem(url: URL(fileURLWithPath: videoURL))


    print("STATUS: \(player.status == AVPlayerStatus.readyToPlay). FRAME: \(playerLayer.frame). MAIN THREAD: \(Thread.isMainThread)")


    player.replaceCurrentItem(with: playerItem)

    // Start playing video
    player.seek(to: kCMTimeZero)
    player.actionAtItemEnd = .none …
Run Code Online (Sandbox Code Playgroud)

video ios avplayer avplayerlayer

5
推荐指数
1
解决办法
3544
查看次数

在 UICollectionView 上使用 AVPlayer 和 AVPlayerLayer 显示多个视频

我正在使用水平滚动的 UICollectionView Cell 上的 AVPlayer 和 AVPlayerLayer 类在全屏上显示“n”个视频的应用程序。我在 UIScrollView 上设置了分页。因为我只需要播放当前位置的播放器,否则“上一个和下一个”单元格播放器应该处于“暂停”状态。

我正在获取 url 格式的视频。所以最初我需要下载,然后它就会开始播放。所以每个人都不需要从 URL 下载视频。所以我决定将下载的视频缓存在本地。所以我下载并将其存储在本地文件中。然后我从本地加载视频,如果它存在于本地文件中。

问题 :

(一种)。“播放和暂停”在其相关索引上无法正常工作。最初播放索引为“0”。当我此时滚动到下一个索引时,当前索引播放器应该正在播放,下一个索引播放器应该处于“暂停”状态。它没有正确同步。

(b)。我可以看到上一个播放器的视频剪辑,直到下一个播放器开始播放。

(C)。所有查看的音频同时在后台播放,也可以在释放播放器时播放。(我的意思是,我可以在关闭一些视图或视图控制器后听到)

(d) 需要维护内存泄漏问题。

下面是我尝试的来源方式,

- (void)setVideoLoading:(NSString *)videoUrl{

    NSString *urlString = videoUrl;

    SHAREDATA.videoUrl = [NSURL URLWithString:urlString];

    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:SHAREDATA.videoUrl options:nil];

    NSArray *requestedKeys = @[@"playable"];

    //Tells the asset to load the values of any of the specified keys that are not already loaded.
    [asset loadValuesAsynchronouslyForKeys:requestedKeys completionHandler:^{

        dispatch_async(dispatch_get_main_queue(), ^{

            AVPlayerItem *item = [AVPlayerItem playerItemWithAsset: asset];

            if (self.avPlayer)
            {
                /* Remove existing player …
Run Code Online (Sandbox Code Playgroud)

objective-c video-streaming avplayer avplayerlayer avplayeritem

5
推荐指数
1
解决办法
4319
查看次数

使用replaceCurrentItem()时AVPlayer闪烁 - Swift - 以编程方式

我正在以这种方式设置AVPlayer一个UIView

fileprivate func setUpAVPlayer(){
    
    self.cardModel?.urlStrings?.forEach({ (urlString) in
        
        guard let url = URL(string: urlString) else { return }
        let asset = AVAsset(url: url)
        let playerItem = AVPlayerItem(asset: asset, automaticallyLoadedAssetKeys: nil)
        playerItem.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.old, .new], context: nil)
        self.playerItemArray.append(playerItem)
    })
    player = AVPlayer(playerItem: playerItemArray[0])
}
Run Code Online (Sandbox Code Playgroud)

layoutSubviews我布局显示播放器的playerLayer:

let playerLayer = AVPlayerLayer(player: player)
playerLayer.videoGravity = .resizeAspectFill
self.playerView.layer.insertSublayer(playerLayer, at: 0)
playerLayer.frame = playerView.bounds
Run Code Online (Sandbox Code Playgroud)

在发生某个事件时,我更改播放器的当前项目:

fileprivate func goToNextVideo(){
    counter = counter+1
    counter = min(playerItemArray.count-1, counter)
    
    self.player?.replaceCurrentItem(with: self.playerItemArray[self.counter])
    self.player?.seek(to: .zero) …
Run Code Online (Sandbox Code Playgroud)

avfoundation avplayer avplayerlayer swift avplayeritem

5
推荐指数
1
解决办法
1512
查看次数