ios - AVPlayereekToTime导致播放器停止播放

标签 ios objective-c audio avplayer

我有一个 AVPlayer,可以播放广播电台,并且有一个我构建的快退按钮。当您倒回时,该方法会被调用,并且在大约 80% 的时间内有效,成功地将 AVPLayer 的当前时间设置回 X 秒。然而,另外 20% 的时间,AVPlayer 会停止播放音频,并且在应用程序被终止并重新打开之前不会再次播放。方法如下:

- (IBAction)rewind:(id)sender
{
    CMTime cmTime = CMTimeMake(CMTimeGetSeconds(self.player.currentTime) - 1.0, 1);
    CMTime almostZero = CMTimeMake(1, 2);
    if (CMTimeGetSeconds(cmTime) > CMTimeGetSeconds(almostZero)) {
    [self.player.currentItem seekToTime:cmTime];
    }
}

就上下文而言,这是一场直播。

这是我的 15 秒倒带方法:

 if((self.currentPlaybackTime - 15.0f) > CMTimeGetSeconds(kCMTimeZero)) {
        [self.player pause];
        [self.player seekToTime:CMTimeMakeWithSeconds((self.currentPlaybackTime - 15.0f), self.player.currentTime.timescale)];
        [self.player play];
        } else if((self.currentPlaybackTime - 10.0f) > CMTimeGetSeconds(kCMTimeZero)) {
       [self.player pause];
       [self.player seekToTime:CMTimeMakeWithSeconds((self.currentPlaybackTime - 10.0f), self.player.currentTime.timescale)];
            [self.player play];
    } else if((self.currentPlaybackTime - 5.0f) > CMTimeGetSeconds(kCMTimeZero)) {
        [self.player pause];
        [self.player seekToTime:CMTimeMakeWithSeconds((self.currentPlaybackTime - 5.0f), self.player.currentTime.timescale)];
        [self.player play];

    } else if((self.currentPlaybackTime - 3.0f) > CMTimeGetSeconds(kCMTimeZero)) {
        [self.player pause];
        [self.player seekToTime:CMTimeMakeWithSeconds((self.currentPlaybackTime - 3.0f), self.player.currentTime.timescale)];
        [self.player play];
    } else if((self.currentPlaybackTime - 2.0f) > CMTimeGetSeconds(kCMTimeZero)) {
       [self.player pause];
       [self.player seekToTime:CMTimeMakeWithSeconds((self.currentPlaybackTime - 2.0f), self.player.currentTime.timescale)];
        [self.player play];
    } else if((self.currentPlaybackTime - 1.0f) > CMTimeGetSeconds(kCMTimeZero)) {
        [self.player pause];
        [self.player seekToTime:CMTimeMakeWithSeconds((self.currentPlaybackTime - 1.0f), self.player.currentTime.timescale)];
        [self.player play];
    }

- (NSTimeInterval)currentPlaybackTime
{
    return CMTimeGetSeconds(self.player.currentTime);
}

当我记录方法和秒数时,您可以看到在第三次倒带时(音频总是停止并且不会重新启动),播放器实际上并没有倒退 15 秒,尽管看起来eekToTime当前时间减 15 秒有效。

2015-05-28 09:34:57.383 Lancers[78554:11732524] sec: 45
2015-05-28 09:34:58.382 Lancers[78554:11732524] sec: 46
2015-05-28 09:34:59.383 Lancers[78554:11732524] sec: 47
2015-05-28 09:35:00.383 Lancers[78554:11732524] sec: 48
2015-05-28 09:35:01.382 Lancers[78554:11732524] sec: 49
2015-05-28 09:35:02.237 Lancers[78554:11732524] CURRENT PLAYING TIME: 49.855237
2015-05-28 09:35:02.237 Lancers[78554:11732524] REWIND 15 SECONDS!
2015-05-28 09:35:02.293 Lancers[78554:11732524] sec: 35
2015-05-28 09:35:02.293 Lancers[78554:11732524] sec: 35
2015-05-28 09:35:02.305 Lancers[78554:11732524] sec: 35
2015-05-28 09:35:02.305 Lancers[78554:11732524] sec: 35
2015-05-28 09:35:02.305 Lancers[78554:11732524] sec: 35
2015-05-28 09:35:02.472 Lancers[78554:11732524] sec: 35
2015-05-28 09:35:03.472 Lancers[78554:11732524] sec: 36
2015-05-28 09:35:04.473 Lancers[78554:11732524] sec: 37
2015-05-28 09:35:05.473 Lancers[78554:11732524] sec: 38
2015-05-28 09:35:06.473 Lancers[78554:11732524] sec: 39
2015-05-28 09:35:07.472 Lancers[78554:11732524] sec: 40
2015-05-28 09:35:08.473 Lancers[78554:11732524] sec: 41
2015-05-28 09:35:09.473 Lancers[78554:11732524] sec: 42
2015-05-28 09:35:10.473 Lancers[78554:11732524] sec: 43
2015-05-28 09:35:11.472 Lancers[78554:11732524] sec: 44
2015-05-28 09:35:12.472 Lancers[78554:11732524] sec: 45
2015-05-28 09:35:13.472 Lancers[78554:11732524] sec: 46
2015-05-28 09:35:13.771 Lancers[78554:11732524] CURRENT PLAYING TIME: 46.299634
2015-05-28 09:35:13.771 Lancers[78554:11732524] REWIND 15 SECONDS!
2015-05-28 09:35:13.821 Lancers[78554:11732524] sec: 31
2015-05-28 09:35:13.821 Lancers[78554:11732524] sec: 31
2015-05-28 09:35:13.833 Lancers[78554:11732524] sec: 31
2015-05-28 09:35:13.833 Lancers[78554:11732524] sec: 31
2015-05-28 09:35:13.833 Lancers[78554:11732524] sec: 31
2015-05-28 09:35:14.557 Lancers[78554:11732524] sec: 32
2015-05-28 09:35:15.557 Lancers[78554:11732524] sec: 33
2015-05-28 09:35:16.556 Lancers[78554:11732524] sec: 34
2015-05-28 09:35:16.870 Lancers[78554:11732524] CURRENT PLAYING TIME: 34.314164
2015-05-28 09:35:16.870 Lancers[78554:11732524] REWIND 15 SECONDS!
2015-05-28 09:35:16.898 Lancers[78554:11732524] sec: 34
2015-05-28 09:35:16.899 Lancers[78554:11732524] sec: 34

最佳答案

我正在猜测您的应用程序,但我认为问题可能出在您的流音频的缓冲上。我已经多次使用 AVPlayer 来处理本地媒体,并且从来没有遇到过eekToTime 的任何问题。

跳转到无效时间会让你陷入困境,但从我在你的代码中看到的情况来看,你应该没问题。您的倒带代码试图向后移动 1 秒(不是 15?),除非您在开始后的 1/2 秒内,在这种情况下您不会寻找并继续播放。

我会在倒回方法中检查 AVPlayer 对象的状态(player.status、player.error),并查看调用eekToTime 时发生了什么。还要使用调试器或 NSLog 检查 cmTime 变量的值和状态标志,以确保您也能正常工作。

关于ios - AVPlayereekToTime导致播放器停止播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30490905/

相关文章:

ios - removeFromSuperView 不适用于按钮

ios - '? :' 表达式中的结果值具有不匹配的类型 '()' 和 'String?'

objective-c - 如何清除 NSFetchedResultsController?

objective-c - 如何使用You Tube数据API第3版 objective-c 与最终用户分享我的YouTube播放列表

c# - 当默认音频输入更改时,.NET 中是否有事件?

c++ - 在 NodeJS 中将 Raw 流转换为 Wav 流

ios - 是否可以将状态栏文本(前景)颜色更改为任意颜色(即不是黑色或白色)?

ios - AFNetworking 可达性 iOS

windows-phone-7 - 赢电话7更改默认拨号器并播放声音

ios - 打开左侧菜单时禁用上下滚动