iOS - AVPlayer seekToTime 重新开始播放 currentItem

标签 ios objective-c cocoa-touch avplayer

我正在制作一个使用 AVPlayer 的应用程序。在我的一个观点中,我有一个 UISlider,用户应该能够使用它向前和向后滑动。我在让 seekToTime 按我的意愿工作时遇到了一些问题。当我尝试更改时间时,播放从 0 开始,但我不确定如何解决这个问题。我当前的实现如下所示:

[self.progressSlider  addTarget:self action:@selector(sliderValueChanged) forControlEvents:UIControlEventValueChanged];

[self.progressSlider  addTarget:self action:@selector(sliderReleased) forControlEvents:UIControlEventTouchUpInside];


- (void)sliderValueChanged {

    [...]
    [player pause];

}

- (void)sliderReleased {

    float timeInSecond = self.progressSlider.value;

    timeInSecond *= 1000;

    // I have trie to hard code this value, but I get the same result.
    CMTime cmTime = CMTimeMake(timeInSecond, NSEC_PER_SEC);

    [player.currentItem seekToTime:cmTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {

        if (finished) {
            [player play];
        }
    }];
}

对我做错了什么有什么想法吗?

可以提及我使用 AVPlayer 的流式传输音频:playerItemWithURL 如果这有任何区别的话。

最佳答案

一个问题是 NSEC_PER_SEC 是 1,000,000,000,所以 CMTimeMake(timeInSecond, NSEC_PER_SEC) 将是一个非常小的数字(除非 timeInSecond大得离谱) - 事实上,它会任意接近于零,这正是你正在经历的。

需要说明的是:CMTimeMake 定义了一个有理数。你给了一个分子和一个分母。如果分母很大,那么有理数就会很小。

关于iOS - AVPlayer seekToTime 重新开始播放 currentItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23228181/

相关文章:

objective-c - performSelectorOnMainThread : 实现的底层细节

objective-c - 你如何在 NSWindow 上使用黑暗活力?

iphone - 这些真的是我最终为 iPhone 编程需要采取的步骤吗?

ios - Cocoapod路径引用错误

android - 从 .net 公开服务以供移动应用程序使用的最佳方式

ios - 如何使用 CoreData 存储自定义类

ios - Parse.com 开发到生产版本 iOS

ios - iOS 蓝牙 LE 必须在 readRSSI 之前先进行读取或写入才能获取最新的 RSSI 值吗?

ios - 从 View Controller 引用模型的方法

javascript - 使用适用于 iOS 应用程序的 php 在没有网页的情况下加载 URL