我知道存在关于同一问题的多个问题,但在遵循这个建议之后,我遇到了一些问题.
我已经完成了所有设置但每次使用kMTTimeZero时我都会遇到马赫错误.
soundQueue = [AVQueuePlayer queuePlayerWithItems:soundEmotions];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[soundEmotions lastObject]];
Run Code Online (Sandbox Code Playgroud)
这就是我所做的.
- (void)playerItemDidReachEnd:(NSNotification *)notification {
// Do stuff here
NSLog(@"End has been reached.");
// Set it back to the beginning
[soundQueue seekToTime:kCMTimeZero];
//Replay
[soundQueue play];
}
Run Code Online (Sandbox Code Playgroud)
错误:架构armv7的未定义符号:"_kCMTimeZero",引用自: - ViewController中的[ViewController playerItemDidReachEnd:] ld:未找到架构armv7 clang的符号:错误:链接器命令失败,退出代码为1(使用 - v看看调用)
请有人告诉我是否有一种方法可以选择性地预先缓冲AVQueuePlayer阵列中的avplayeritems,而不是将其保留AVQueuePlayer为仅在第一项完成播放时加载下一项的自动方式.
我正在加载一系列4个短片段,我想在告诉AVQueuePlayer播放阵列之前预先缓存它们.实际上有一种方法可以获得avqueueplayer的bonet并根据需要控制预缓冲吗?
现在有了它的默认延迟加载行为,我在播放中得到了一些好处,剪辑甚至没有正常播放,因为它AVQueuePlayer正在尝试在播放时加载下一个剪辑.我在iPad上执行此操作已部署到实际设备而不是模拟器.
您可以使用mpmovieplayer通过调用[player prepareToPlay];基本上手动启动所需的每个视频文件的加载来执行此操作,然后您可以通过查看mpmovieplayerLoadstateDidChange通知并测试loadState值以查看是否已完全加载来检查加载的完成情况,然后告诉mpmovieplayer玩.你怎么能有效地做类似的事情AVQueuePlayer?
这甚至可能还是我发现了一个主要的缺点AVQueuePlayer?
playerObserver斯蒂芬很好的建议,但是需要的是你需要能够明确地将单个项目加载到内存中,然后告诉AVQueuePlayer'不要播放数组中的第一项,直到数组中的所有项都加载到内存'目前似乎没有办法启动数组加载中的第二项,直到第一项即将结束!
作为一个稍微独立的问题,我还注意到了一些奇怪的AVQueuePlayer地方,如果你将两个相同的源视频文件加载到数组中(两者都被引用为两个完全独立的,AVPlayerItems就像你应该做的那样)当你播放视频片段时数组一直播放,第一次剪辑播放ok,但是当再次播放相同的剪辑(作为单独的剪辑AVPlayerItem)时,它会非常快速地播放,直到视频中的某个点最终开始以正常速度播放从那里.
有没有人注意到这种行为?
我正在尝试使用AVPlayer播放流媒体视频而没有任何网络延迟.幸运的是,我们的应用程序在播放视频的屏幕之前有一个进度屏幕.我希望在这个进度屏幕上使用一些时间来预加载视频,以便在下一个屏幕上无延迟地播放.
我提出的最有前途的方法是使用AVQueuePlayer播放2个视频,第一个是我在屏幕上播放的视频(所以你看不到它)并且是静音的,所以你不要听到.从我在SO AVQueuePlayer上看到的内容,当第n个视频接近完成时,缓冲第n + 1个视频.
这是我的代码:
NSString *blackVideoPath = [[NSBundle mainBundle] pathForResource:@"black10-counting" ofType:@"MOV"];
AVPlayerItem *blackVideoItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:blackVideoPath]];
AVPlayerItem *realVideoItem = [AVPlayerItem playerItemWithURL:_videoWithEffectsURL];
NSArray *theItems = [NSArray arrayWithObjects:blackVideoItem, realVideoItem, nil];
AVQueuePlayer *theQueuePlayer = [AVQueuePlayer queuePlayerWithItems:theItems];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:[theItems firstObject]];
AVPlayerLayer* playerLayer = [AVPlayerLayer playerLayerWithPlayer:theQueuePlayer];
playerLayer.frame = self.view.bounds;
[self.view.layer addSublayer:playerLayer];
[theQueuePlayer play];
Run Code Online (Sandbox Code Playgroud)
这确实播放了我的第一个视频(用于调试我有一个带有计数音轨的视频)但是当到达结尾并前进到下一个屏幕(在playerItemDidReachEnd中)时,我的真实视频不能立即播放.
为了确保我的URL正确,我在列表中颠倒了blackVideoItem和realVideoItem,我确实听到了我的"真实"视频的音轨.
我搜索了很多,似乎没有办法播放流媒体视频没有延迟.我爱是错的.
我知道这个问题遍布 Stack Overflow,但其中大多数都是旧问题,与我要在这里问的问题无关。
所以我有一个带有AVPlayerItems和 的数组AVQueuePlayer。首先,我设置 AVQueuePlayer 来播放数组项目:
func mediaPicker(mediaPicker: MPMediaPickerController!, didPickMediaItems mediaItemCollection: MPMediaItemCollection!) {
mediaItems = mediaItemCollection.items
for thisItem in mediaItems as [MPMediaItem] {
var itemUrl = thisItem.valueForProperty(MPMediaItemPropertyAssetURL) as? NSURL
var playerItem = AVPlayerItem(URL: itemUrl)
mediaArray.append(playerItem)
}
updateMetadata()
audioPlayer = AVQueuePlayer(items: mediaArray)
self.dismissViewControllerAnimated(true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
但是,例如,当用户添加新项目或删除项目时,我尝试更新播放器(与我首先设置它的方式相同),但它给了我错误。我想知道是否有任何解决办法,或者有什么解决方案。这是用户删除歌曲的方式:
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == UITableViewCellEditingStyle.Delete{
mediaArray.removeAtIndex(indexPath.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
audioPlayer = AVQueuePlayer(items: mediaArray) //here gives the error
}
}
Run Code Online (Sandbox Code Playgroud)
我为此自杀了,所以,如果有人能帮助我,我将不胜感激。
我和AVQueuePlayer有一段时间了.很简单,我在一个使用playerItemWithURL构建的AVPlayerItem数组上制作它:并指向网络上服务器上的视频资产.
如果我试图在刺激器中运行这个东西(原文如此),那么它将通过第一个资产播放,开始播放第二个资产然后就死了.有时它甚至没有通过第一个资产.
现在,我知道sim的行为与设备不同,所以我也尝试在设备上使用同样的问题.
当我在项目上记录各种状态更改时,我看到缓冲区用完了,播放器就死了.对于一个正在播放项目队列的构造来说,这对我来说似乎有点傻......当然缓冲区可能会不足,但为什么它会死掉呢?
我做错了什么,或者这是它应该如何表现?
我通过观察loadedTimeRanges属性以及何时将PLAY发送给播放器来解决这个问题.但这会导致口吃回放,这也很糟糕.
这是我的代码.有人可以告诉我如何做到这一点,而不是播放完全废话?
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handlePlayerItemReachedEnd:) name:AVPlayerItemDidPlayToEndTimeNotification object:self.queuePlayer];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handlePlayerStalled:) name:AVPlayerItemPlaybackStalledNotification object:self.queuePlayer];
NSString *baseURL = @"http://www.aDomain.com/assets/";
NSMutableArray *vidItemArray = [[NSMutableArray alloc] initWithCapacity:5];
for (int i = 1; i <= 5; i++) {
AVPlayerItem *vid = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:[baseURL stringByAppendingFormat:@"%d.mov", i]]];
[vid addObserver:self forKeyPath:@"status" options:0 context:nil];
[vid addObserver:self forKeyPath:@"playbackBufferEmpty" options:0 context:nil];
[vid addObserver:self forKeyPath:@"loadedTimeRanges" options:0 context:nil];
[vidItemArray addObject:vid];
}
self.queuePlayer = [AVQueuePlayer queuePlayerWithItems:vidItemArray];
[self.mPlaybackView setPlayer:self.queuePlayer];
}
- (void)handlePlayerItemReachedEnd:(NSNotification *)notification …Run Code Online (Sandbox Code Playgroud) 这是一个很好的简单的avplayer代码片段,在队列中播放一小部分视频.我的问题.我实际上想在队列中的视频之间暂停.可能吗?
我注意到率两次发射; 状态只会像通知那样触发一次.
import UIKit
import AVKit
import AVFoundation
class ViewController: UIViewController {
@IBOutlet weak var VideoView: UIView!
var player:AVQueuePlayer = AVQueuePlayer()
@IBAction func NextSlide(sender: AnyObject) {
player.play()
}
override func viewDidLoad() {
func NextSlide(sender: AnyObject) {
}
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let arrayOfPaths: [String] = ["http://192.100.1.1:8080/dino1.mov","http://192.100.1.1:8080/dino1.mov","http://192.100.1.1:8080/dino1.mov"]
var shots = [AVPlayerItem]()
for item in arrayOfPaths {
let url2adopt = NSURL(string: item)
let avAsset = AVURLAsset(URL: url2adopt!)
let shot = AVPlayerItem(asset: …Run Code Online (Sandbox Code Playgroud) 如何使用AVPlayer立即开始下一首歌?我收集了从iPod库中选择的歌曲集MPMediaItemCollection.
现在我如何使用AVPlayer逐个播放歌曲列表?
目前我正在使用以下代码播放歌曲
playerItem = [AVPlayerItem playerItemWithURL:[song valueForProperty:MPMediaItemPropertyAssetURL]];
[_avPlayer replaceCurrentItemWithPlayerItem:playerItem];
Run Code Online (Sandbox Code Playgroud)
在这里我使用AVPlayer播放音频文件,但我的要求是需要连续播放歌曲组(NSArray)(目前播放一首歌后播放器停止).我听说AVQueuePlayer但不知道如何使用它是否与avplayer如果有人知道这个请帮助我
我AVPlayerItem和他有问题AVQueuePlayer.目前我有很多1-2秒长的音乐文件和一个按顺序播放它们的队列播放器.
我想要的是知道音乐文件何时刚刚开始播放而不是在播放完毕后(通过AVPlayerItemDidPlayToEndTimeNotification).
这是因为我想在加载和播放新文件时运行一个函数.
我的代码:
for (NSUInteger i = 0; i < [matchedAddr count]; i++)
{
NSString *firstVideoPath = [[NSBundle mainBundle] pathForResource:[matchedAddr objectAtIndex:i] ofType:@"wav"];
//NSLog(@"file %@",firstVideoPath);
avitem=[AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:firstVideoPath]];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(currentItemIs:)
name:AVPlayerItemDidPlayToEndTimeNotification
object:avitem];
[filelist addObject:avitem];
}
player = [AVQueuePlayer queuePlayerWithItems:filelist];
[player play];
- (void)currentItemIs:(NSNotification *)notification
{
NSString *asd=[seqArray objectAtIndex:currentColor];
currentColor=currentColor+1;
AVPlayerItem *p = [notification object];
[p seekToTime:kCMTimeZero];
if([asd isEqual:@"1"])
{
[UIView animateWithDuration:0.01 animations:^{
one.alpha = 0;
} completion:^(BOOL finished) {
[UIView …Run Code Online (Sandbox Code Playgroud) 假设队列已经初始化,我看到的将项添加到队列中的唯一方法是:
- (void)insertItem:(AVPlayerItem *)item afterItem:(AVPlayerItem *)afterItem
文件说 Pass nil to append the item to the queue.
那么是不是可以将一个项目添加到队列的顶部?我希望能够重播之前播放的内容,而无需重新删除和重新排列所有内容.
我一直在尝试找出如何使用 循环播放多个视频AVPlayerLooper,但它们templateItem采用 type 参数AVPlayerItem而不是[AVPlayerItem]。我目前正在使用 anAVQueuePlayer来显示视频,但我需要循环播放它。
到目前为止,这是我的代码:
class MyVC: UIViewController {
@IBOutlet weak var playerView: UIView!
lazy var backgroundVideoPlayer = AVQueuePlayer()
// View Controller related code (viewDidLoad, etc.) is taken out for brevity.
private func loadBackgroundVideosRandomly() -> [AVPlayerItem] {
let mainBundle = Bundle.main
let movieURLs = [mainBundle.url(forResource: "Boop Burj Al Arab", withExtension: "mov"),
mainBundle.url(forResource: "Boop Dubai", withExtension: "mov"),
mainBundle.url(forResource: "Boop Dubai Clock", withExtension: "mov"),
mainBundle.url(forResource: "Boop Dubai Lake", withExtension: "mov")].shuffled()
let …Run Code Online (Sandbox Code Playgroud) 我有一个实例,AVQueuePlayer并使用一系列视频进行了初始化AVPlayerItem(假设我有10个项目),在按钮事件中,我需要播放该集合中的第n个索引项目。
我已经用过了,- (void)replaceCurrentItemWithPlayerItem:(AVPlayerItem *)item但是它用替换了当前的播放项目AVPlayerItem。
我需要打第n个AVPlayerItem的AVQueuePlayer。任何帮助将不胜感激。
我用它AVQueuePlayer来播放声音(一个供孩子们听图画书的小应用程序),但如果 iPhone 静音,则听不到音频。
即使 iPhone 静音,有办法强制播放音频吗?我认为 YouTube 可以听到音频,Instagram 则需要调大音量才能听故事。
谢谢。
avqueueplayer ×13
ios ×11
avplayer ×7
swift ×4
avfoundation ×3
objective-c ×3
avkit ×1
avplayeritem ×1
buffer ×1
cocoa-touch ×1
ios6 ×1
ipad ×1
iphone ×1
repeat ×1