TV OSアプリでAVPlayerLooper
を使用して動画をループしようとしています。これにより、動画を再度再生するときに一時停止/一時停止が解消されるはずです。 _WWDC2016
_ビデオを見て https://developer.Apple.com/videos/play/wwdc2016/503/ コードを実装しようとしましたが、ループしません。 PlayerViewController
を継承するAVPlayerViewController
が1つあります。ビデオをループさせるコードを入れました。次のコードがある場合、何も表示されません。 2行目をself.queuePlayer = AVQueuePlayer(playerItem:playerItem)
に変更すると、1回しか再生されません。
_ 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
でループビデオを再生することに成功した人はいますか?
私は自分で問題を修正しました。
PlayerLooperはクラスのメンバー変数である必要があります。そうでない場合、メソッドが呼び出された後にローカル変数がなくなったため、機能しません。それで、私はそれを宣言するためにクラスの始めにこの行を置きました。これはtvos10.0以降のバージョン専用であるため、AVPlayerLooperとして宣言しませんでした。クラスをtvos9.0に適応させたい。これは私の作業コードです。
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()
}
}
}
Objective-Cバージョン:
@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];
}