首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用AVPlayerLooper循环播放视频

如何使用AVPlayerLooper循环播放视频
EN

Stack Overflow用户
提问于 2016-09-01 04:17:29
回答 3查看 11.7K关注 0票数 18

我尝试使用AVPlayerLooper在TV OS应用程序中循环播放视频,因为这应该会在再次播放视频时消除暂停/打卡。我观看了WWDC2016视频https://developer.apple.com/videos/play/wwdc2016/503/并尝试实现代码,但它没有循环。我有一个继承AVPlayerViewControllerPlayerViewController。我放了让视频循环的代码。如果我有以下代码,它不会显示任何内容。如果我将第二行改为self.queuePlayer = AVQueuePlayer(playerItem:playerItem),它只会播放一次。

代码语言:javascript
复制
  let playerItem = AVPlayerItem(url: url as URL)
  self.queuePlayer = AVQueuePlayer()   //I declared this as a variable in the view controller
  self.playerLayer = AVPlayerLayer(player: self.queuePlayer) //I declared this as a variable in the view controller
  let playerLooper = AVPlayerLooper(player:  self.queuePlayer!, templateItem: playerItem)
  self.view.layer.addSublayer(self.playerLayer!)
  self.playerLayer?.frame = self.view.frame
  self.queuePlayer?.play()

你们有没有人用最新的AVPlayerLooper成功地播放了循环视频

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-01 14:48:13

我自己解决了这个问题。

playerLooper必须是类中的成员变量,否则它无法工作,因为局部变量在方法被调用后就消失了。所以我把这一行放在类的开头来声明它。我没有将它声明为AVPlayerLooper,因为这只适用于tvos10.0和更新版本。我希望我的类能够适应to 9.0。这是我的工作代码。

代码语言:javascript
复制
var playerLooper: NSObject?
var playerLayer:AVPlayerLayer!
var queuePlayer: AVQueuePlayer?


func playVideo(_ filmName: String){
    if let path = Bundle.main.path(forResource: filmName, ofType: "mov") {
        let url =  URL(fileURLWithPath: path)

        if #available(tvOS 10.0, *) {

            // Use a new player looper with the queue player and template item
            let playerItem = AVPlayerItem(url: url as URL)
            self.player = AVQueuePlayer(items: [playerItem])
            self.playerLayer = AVPlayerLayer(player: self.player)
            self.playerLooper = AVPlayerLooper(player: self.player! as! AVQueuePlayer, templateItem: playerItem)
            self.view.layer.addSublayer(self.playerLayer!)
            self.playerLayer?.frame = self.view.frame
            self.player?.play()


        } else {
            // Fallback on earlier versions, this solution has hicup at end
            player = AVPlayer(url: url)
            player?.play()
            loopVideo(player!)
        }

    }
}

func loopVideo(_ videoPlayer: AVPlayer) {
    NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil, queue: nil) { notification in
        if(!self.isStopped){

            videoPlayer.seek(to: kCMTimeZero)
            videoPlayer.play()

        }
    }
}
票数 34
EN

Stack Overflow用户

发布于 2018-05-10 03:12:43

Objective-C版本:

代码语言:javascript
复制
@implementation ViewController
{
    // As explained in accepted answer, the playerLooper must be a
    // member (I put everything as member for simplicity):
    AVPlayerItem *_playerItem;
    AVQueuePlayer *_player;
    AVPlayerLooper *_playerLooper;
    AVPlayerLayer *_playerLayer;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    // ...

    NSString *videoFile = [[NSBundle mainBundle] pathForResource:@"example" ofType:@"mov"];
    NSURL *videoURL = [NSURL fileURLWithPath:videoFile];

    _playerItem = [AVPlayerItem playerItemWithURL:videoURL];
    _player = [AVQueuePlayer queuePlayerWithItems:@[_playerItem]];
    _playerLooper = [AVPlayerLooper playerLooperWithPlayer:_player templateItem:_playerItem];
    _playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];
    _playerLayer.frame = self.view.bounds;
    [self.view.layer addSublayer:_playerLayer];
    [_player play];
}
票数 8
EN

Stack Overflow用户

发布于 2019-11-11 19:53:59

Swift 5自定义类,用于播放视频循环,没有任何故障

代码语言:javascript
复制
import Foundation
import AVKit

class VideoPlayerLooped {

    public var videoPlayer:AVQueuePlayer?
    public var videoPlayerLayer:AVPlayerLayer?
    var playerLooper: NSObject?
    var queuePlayer: AVQueuePlayer?

    func playVideo(fileName:String, inView:UIView){

        if let path = Bundle.main.path(forResource: fileName, ofType: "mov") {

            let url = URL(fileURLWithPath: path)
            let playerItem = AVPlayerItem(url: url as URL)

            videoPlayer = AVQueuePlayer(items: [playerItem])
            playerLooper = AVPlayerLooper(player: videoPlayer!, templateItem: playerItem)

            videoPlayerLayer = AVPlayerLayer(player: videoPlayer)
            videoPlayerLayer!.frame = inView.bounds
            videoPlayerLayer!.videoGravity = AVLayerVideoGravity.resizeAspectFill

            inView.layer.addSublayer(videoPlayerLayer!)

            videoPlayer?.play()
        }
    }

    func remove() {
        videoPlayerLayer?.removeFromSuperlayer()

    }
}

用法:

代码语言:javascript
复制
let videoHolder = UIView()
videoHolder.frame = CGRect(x: 0, y: 0, width: 200, height: 200)

var myVideoPlayerLooped = VideoPlayerLooped()
videoPlayerLooped.playVideo(video: "myLocalMovFile", inView: videoHolder)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39258312

复制
相关文章

相似问题

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