首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用AVFoundation AVPlayer循环播放视频?

使用AVFoundation AVPlayer循环播放视频?
EN

Stack Overflow用户
提问于 2011-03-19 17:05:23
回答 11查看 96.3K关注 0票数 147

在AVFoundation中有没有相对简单的循环视频的方法?

我已经创建了AVPlayer和AVPlayerLayer,如下所示:

代码语言:javascript
运行
复制
avPlayer = [[AVPlayer playerWithURL:videoUrl] retain];
avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:avPlayer] retain];

avPlayerLayer.frame = contentView.layer.bounds;
[contentView.layer addSublayer: avPlayerLayer];

然后我播放我的视频:

代码语言:javascript
运行
复制
[avPlayer play];

视频播放正常,但在结尾处停止。对于MPMoviePlayerController,您所要做的就是将其repeatMode属性设置为正确的值。在AVPlayer上似乎没有类似的属性。似乎也没有回调来告诉我电影什么时候结束,这样我就可以从头开始再放一遍。

我没有使用MPMoviePlayerController,因为它有一些严重的限制。我希望能够一次播放多个视频流。

EN

回答 11

Stack Overflow用户

发布于 2020-06-27 00:12:27

Swift 5:

我对前面的答案做了一些细微的调整,比如在将playerItem添加到playerLayer之前将它添加到队列中。

代码语言:javascript
运行
复制
let playerItem = AVPlayerItem(url: url)
let player = AVQueuePlayer(playerItem: playerItem)
let playerLayer = AVPlayerLayer(player: player)

playerLooper = AVPlayerLooper(player: player, templateItem: playerItem)

playerLayer.frame = cell.eventImage.bounds
playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill

// Add the playerLayer to a UIView.layer

player.play()

并将playerLooper设置为您的UIViewController的属性,否则视频可能只播放一次。

票数 7
EN

Stack Overflow用户

发布于 2014-04-04 01:35:17

我建议使用AVQueuePlayer来无缝地循环您的视频。添加通知观察者

代码语言:javascript
运行
复制
AVPlayerItemDidPlayToEndTimeNotification

在其选择器中,循环播放您的视频

代码语言:javascript
运行
复制
AVPlayerItem *video = [[AVPlayerItem alloc] initWithURL:videoURL];
[self.player insertItem:video afterItem:nil];
[self.player play];
票数 3
EN

Stack Overflow用户

发布于 2017-08-22 20:15:22

我在objective-c和AVQueuePlayer中的解决方案-似乎你必须复制AVPlayerItem,并在完成第一个元素的回放后立即添加另一个副本。“某种”是有意义的,对我来说没有任何问题。

代码语言:javascript
运行
复制
NSURL *videoLoopUrl; 
// as [[NSBundle mainBundle] URLForResource:@"assets/yourVideo" withExtension:@"mp4"]];
AVQueuePlayer *_loopVideoPlayer;

+(void) nextVideoInstance:(NSNotification*)notif
{
 AVPlayerItem *currItem = [AVPlayerItem playerItemWithURL: videoLoopUrl];

[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(nextVideoInstance:)
                                      name:AVPlayerItemDidPlayToEndTimeNotification
                                      object: currItem];

 [_loopVideoPlayer insertItem:currItem afterItem:nil];
 [_loopVideoPlayer advanceToNextItem];

}

+(void) initVideoPlayer {
 videoCopy1 = [AVPlayerItem playerItemWithURL: videoLoopUrl];
 videoCopy2 = [AVPlayerItem playerItemWithURL: videoLoopUrl];
 NSArray <AVPlayerItem *> *dummyArray = [NSArray arrayWithObjects: videoCopy1, videoCopy2, nil];
 _loopVideoPlayer = [AVQueuePlayer queuePlayerWithItems: dummyArray];

 [[NSNotificationCenter defaultCenter] addObserver: self
                                      selector: @selector(nextVideoInstance:)
                                      name: AVPlayerItemDidPlayToEndTimeNotification
                                      object: videoCopy1];

 [[NSNotificationCenter defaultCenter] addObserver: self
                                      selector: @selector(nextVideoInstance:)
                                      name: AVPlayerItemDidPlayToEndTimeNotification
                                      object: videoCopy2];
}

https://gist.github.com/neonm3/06c3b5c911fdd3ca7c7800dccf7202ad

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

https://stackoverflow.com/questions/5361145

复制
相关文章

相似问题

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