簡體   English   中英

播放時音頻播放器持續時間更改

[英]Audio player duration changes while playing

當我在播放音頻文件之前獲取音頻文件的持續時間時:

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
...
[audioPlayer prepareToPlay];
duration = audioPlayer.duration;

我得到例如 16.71s 的持續時間。 然后在播放時每 0.2 秒采樣一次時,持續時間會發生變化。 它每 1.2 到 1.6 秒改變為:16.71s, 17.02s, 17.23s, 17.33s, 17.38s, 17.43s, 17.38s, 17.29s, 17.31s, 然后停留在最后 17.51.5 秒所以它會上升和下降。

我在更新滑塊位置的方法中進行了示例,還顯示了經過的時間和總持續時間。 你可以想象在播放時看到持續時間(它被截斷)從 16 到 17 看起來真的很奇怪。 此外,隨着所有這些漂移,滑塊位置將關閉。

有誰知道這是為什么?

現在我們正在談論持續時間:有誰知道為什么audio player.duration可以返回大約兩倍於實際持續時間的值,當[audioPlayer prepareToPlay]被省略時?

avaudioplayer的duration方法返回的持續時間是基於到目前為止已解碼文件的多少來估計文件總持續時間的最佳方法。 因此,隨着時間的推移,持續時間會不斷完善。

為了獲得更好的時間,我使用了AVAsset的工期方法。 它解釋了這里發生了什么更好的事情:

https://developer.apple.com/library/mac/documentation/AVFoundation/Reference/AVAsset_Class/Reference/Reference.html#//apple_ref/occ/instp/AVAsset/duration

如果指定ProvidesPreciseDurationAndTiming = YES,則AVAsset會在需要時解碼文件,以准確確定其持續時間。 如果解碼時間太長而無法使用,則可以將其禁用。

在我的情況下,我使用AVURLAsset子類:

            AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:localURL options:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], AVURLAssetPreferPreciseDurationAndTimingKey, nil]];
            float t = CMTimeGetSeconds(asset.duration);

@AndyKorth 的回答是最好的! 這是在斯威夫特

guard let audioPlayer = audioPlayer, let url = audioPlayer.url else { return }

let assetOpts = [AVURLAssetPreferPreciseDurationAndTimingKey: true]
let asset = AVURLAsset(url: url, options: assetOpts)

let assetDuration: Float64 = CMTimeGetSeconds(asset.duration)

// compare both
print("assetDuration: ", assetDuration)

print("audioPlayerDuration: ", Float(audioPlayer.duration))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM