Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在swift 3中将AVPlayer从4秒循环到8秒?_Ios_Loops_Swift3_Avplayer - Fatal编程技术网

Ios 如何在swift 3中将AVPlayer从4秒循环到8秒?

Ios 如何在swift 3中将AVPlayer从4秒循环到8秒?,ios,loops,swift3,avplayer,Ios,Loops,Swift3,Avplayer,我在swift 3中有一个播放视频的AVPlayer-问题是我想在A到B秒(例如4到8秒)之间使用循环,这是我的循环代码,但不起作用 NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.Player.currentItem, queue: nil, using: { (_) in DispatchQueue.main.async {

我在swift 3中有一个播放视频的AVPlayer-问题是我想在A到B秒(例如4到8秒)之间使用循环,这是我的循环代码,但不起作用

NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.Player.currentItem, queue: nil, using: { (_) in
        DispatchQueue.main.async {
            self.Player.seek(to: kCMTimeZero)
            self.Player.play()
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 4.0) {
                // check if player is still playing
                if self.Player.rate != 0 {
                    print("OK")
                    print("Player reached 4.0 seconds")
                    let timeScale = self.Player.currentItem?.asset.duration.timescale;
                    //        let seconds = kCMTimeZero
                    let time = CMTimeMakeWithSeconds( 8.0 , timeScale!)
                    self.Player.seek(to: time, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)
                    self.Player.play()


                }
            }
        }
    })

问题是,此循环不起作用,并且由于AVPlayerItemDidPlayToEndTime,在播放器完成电影之前,打印(“确定”)将不起作用。您可以添加定期时间观察者来监视当前时间

let timeObserverToken = player.addPeriodicTimeObserver(forInterval: someInterval, queue: DispatchQueue.main) { [unowned self] time in
    let seconds = CMTimeGetSeconds(cmTime)
    if seconds >= 8.0 {
        // jump back to 4 seconds
        // do stuff
    }
}

您可以添加定期时间观察者来监视当前时间

let timeObserverToken = player.addPeriodicTimeObserver(forInterval: someInterval, queue: DispatchQueue.main) { [unowned self] time in
    let seconds = CMTimeGetSeconds(cmTime)
    if seconds >= 8.0 {
        // jump back to 4 seconds
        // do stuff
    }
}

有几种选择:

如果希望无间隙播放,可以使用以下命令开始:

iOS 10之前:

iOS 10+:

苹果在ios10之前的“解决方案”确实有效,这是我瞄准ios9以来唯一实现无缝循环的方法

如果您正在使用该解决方案,您还需要为其提供正确长度的avplayeritem,或者添加到解决方案中,以便在将其发送给播放器时将其切碎

为此,您可以做一些事情,比如我如何更改Apple代码(抱歉,如果它有点稀疏-只是试图显示主要的更改)-基本上是添加发送曲目和要使用的时间块,然后将其制作为AVMutableCompositionTrack(我已经删除了所有视频内容-您希望保留这些内容):


有几种选择:

如果希望无间隙播放,可以使用以下命令开始:

iOS 10之前:

iOS 10+:

苹果在ios10之前的“解决方案”确实有效,这是我瞄准ios9以来唯一实现无缝循环的方法

如果您正在使用该解决方案,您还需要为其提供正确长度的avplayeritem,或者添加到解决方案中,以便在将其发送给播放器时将其切碎

为此,您可以做一些事情,比如我如何更改Apple代码(抱歉,如果它有点稀疏-只是试图显示主要的更改)-基本上是添加发送曲目和要使用的时间块,然后将其制作为AVMutableCompositionTrack(我已经删除了所有视频内容-您希望保留这些内容):


我应该为间隔写些什么?因为我使用了init(),但收到了错误libc++abi.dylib:以NSException类型的未捕获异常终止,我应该为forInterval编写什么?因为我使用了init(),但我收到了错误libc++abi.dylib:以NSExceptionfirst类型的未捕获异常终止我有视频播放器而不是音频播放器-第二,我想在用户按下按钮时,例如,循环从视频的4.0秒开始到8.0秒。默认情况下,我链接的这两件事都可以做视频。制作avplayerlooper时,可以在init中选择正确的时间范围。对于ios10之前的版本,您需要使用类似于合成的内容来告诉它播放哪个部分,但我看不到这些秒之间循环视频代码中的4.0秒和8.0秒。这对我来说是一个很好的答案-海报似乎希望您为其编写应用程序him@mehdok目前无法打开xcode,但是你可以让合成有音频/视频/和IIR。首先,我有视频播放器,而不是音频播放器。第二,当用户按下按钮时,我想做。例如,循环从视频的4.0秒开始到8.0秒。默认情况下,我链接的两件事都可以做视频。制作avplayerlooper时,可以在init中选择正确的时间范围。对于ios10之前的版本,您需要使用类似于合成的内容来告诉它播放哪个部分,但我看不到这些秒之间循环视频代码中的4.0秒和8.0秒。这对我来说是一个很好的答案-海报似乎希望您为其编写应用程序him@mehdok目前无法打开xcode,但是你可以让这篇文章有音频/视频/和iirc