标签: avqueueplayer

如何在AVQueuePlayer中循环声音队列?

我知道存在关于同一问题的多个问题,但在遵循这个建议之后,我遇到了一些问题.

我已经完成了所有设置但每次使用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看看调用)

objective-c avaudioplayer ios avqueueplayer

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

控制avqueueplayer中项目的预缓冲

请有人告诉我是否有一种方法可以选择性地预先缓冲AVQueuePlayer阵列中的avplayeritems,而不是将其保留AVQueuePlayer为仅在第一项完成播放时加载下一项的自动方式. 

我正在加载一系列4个短片段,我想在告诉AVQueuePlayer播放阵列之前预先缓存它们.实际上有一种方法可以获得avqueueplayer的bonet并根据需要控制预缓冲吗?

现在有了它的默认延迟加载行为,我在播放中得到了一些好处,剪辑甚至没有正常播放,因为它AVQueuePlayer正在尝试在播放时加载下一个剪辑.我在iPad上执行此操作已部署到实际设备而不是模拟器.

您可以使用mpmovieplayer通过调用[player prepareToPlay];基本上手动启动所需的每个视频文件的加载来执行此操作,然后您可以通过查看mpmovieplayerLoadstateDidChange通知并测试loadState值以查看是否已完全加载来检查加载的完成情况,然后告诉mpmovieplayer玩.你怎么能有效地做类似的事情AVQueuePlayer

这甚至可能还是我发现了一个主要的缺点AVQueuePlayer


playerObserver斯蒂芬很好的建议,但是需要的是你需要能够明确地将单个项目加载到内存中,然后告诉AVQueuePlayer'不要播放数组中的第一项,直到数组中的所有项都加载到内存'目前似乎没有办法启动数组加载中的第二项,直到第一项即将结束!

作为一个稍微独立的问题,我还注意到了一些奇怪的AVQueuePlayer地方,如果你将两个相同的源视频文件加载到数组中(两者都被引用为两个完全独立的,AVPlayerItems就像你应该做的那样)当你播放视频片段时数组一直播放,第一次剪辑播放ok,但是当再次播放相同的剪辑(作为单独的剪辑AVPlayerItem)时,它会非常快速地播放,直到视频中的某个点最终开始以正常速度播放从那里.

有没有人注意到这种行为?

avfoundation ipad ios avplayer avqueueplayer

4
推荐指数
1
解决办法
1838
查看次数

预加载AVPlayer流媒体视频

我正在尝试使用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,我确实听到了我的"真实"视频的音轨.

我搜索了很多,似乎没有办法播放流媒体视频没有延迟.我爱是错的.

ios avplayer avqueueplayer

4
推荐指数
1
解决办法
9607
查看次数

“一个 AVPlayerItem 不能与多个 AVPlayer 实例关联”

我知道这个问题遍布 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)

我为此自杀了,所以,如果有人能帮助我,我将不胜感激。

ios avqueueplayer swift avplayeritem

4
推荐指数
1
解决办法
8212
查看次数

AVQueuePlayer挫折(缓冲区欠载处理)

我和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)

buffer avplayer avqueueplayer ios6

3
推荐指数
1
解决办法
1694
查看次数

检测AVPlayer视频开始停止事件

这是一个很好的简单的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)

avfoundation avplayer avqueueplayer swift avkit

3
推荐指数
1
解决办法
6564
查看次数

如何在播放AVPlayer时开始下一首歌曲或识别出一首歌曲已完成?

如何使用AVPlayer立即开始下一首歌?我收集了从iPod库中选择的歌曲集MPMediaItemCollection.

现在我如何使用AVPlayer逐个播放歌曲列表?

iphone objective-c ios avplayer avqueueplayer

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

如何在AVPlayer中使用AVQueuePlayer

目前我正在使用以下代码播放歌曲

playerItem = [AVPlayerItem playerItemWithURL:[song valueForProperty:MPMediaItemPropertyAssetURL]];
    [_avPlayer replaceCurrentItemWithPlayerItem:playerItem];
Run Code Online (Sandbox Code Playgroud)

在这里我使用AVPlayer播放音频文件,但我的要求是需要连续播放歌曲组(NSArray)(目前播放一首歌后播放器停止).我听说AVQueuePlayer但不知道如何使用它是否与avplayer如果有人知道这个请帮助我

ios avplayer avqueueplayer

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

如何知道AVPlayerItem何时播放

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)

ios avqueueplayer

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

可以使用AVQueuePlayer在队列顶部插入项目吗?

假设队列已经初始化,我看到的将项添加到队列中的唯一方法是:

- (void)insertItem:(AVPlayerItem *)item afterItem:(AVPlayerItem *)afterItem

文件说 Pass nil to append the item to the queue.

那么是不是可以将一个项目添加到队列的顶部?我希望能够重播之前播放的内容,而无需重新删除和重新排列所有内容.

ios avplayer avqueueplayer

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

使用AVPlayerLooper循环播放多个视频

我一直在尝试找出如何使用 循环播放多个视频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)

repeat avfoundation ios avqueueplayer swift

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

播放AVQueuePlayer的第n个项目

我有一个实例,AVQueuePlayer并使用一系列视频进行了初始化AVPlayerItem(假设我有10个项目),在按钮事件中,我需要播放该集合中的第n个索引项目。

我已经用过了,- (void)replaceCurrentItemWithPlayerItem:(AVPlayerItem *)item但是它用替换了当前的播放项目AVPlayerItem

我需要打第n个AVPlayerItemAVQueuePlayer。任何帮助将不胜感激。

cocoa-touch objective-c ios avqueueplayer

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

即使 iPhone 静音,也可以使用 AVQueuePlayer 播放声音

我用它AVQueuePlayer来播放声音(一个供孩子们听图画书的小应用程序),但如果 iPhone 静音,则听不到音频。

即使 iPhone 静音,有办法强制播放音频吗?我认为 YouTube 可以听到音频,Instagram 则需要调大音量才能听故事。

谢谢。

ios avqueueplayer swift

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