我正在将使用AVPlayer的react本机包重构为AVAudioEngine和AVAudioPlayerNode。但是,我混淆了如何使用AVPlayer.addPeriodicTimeObserver来转换AVAudioPlayerNode。这个想法是,我需要在音乐播放的时候获得时间数据,因此在这个addPeriodicTimeObserver闭包中需要用间隔发送,所以在这方面,如何在AVAudioPlayerNode上使用它,谢谢!
func addPeriodicTimeObserver() {
let timeScale = CMTimeScale(NSEC_PER_SEC)
let time = CMTime(seconds: subscriptionDuration, preferredTimescale: timeScale)
timeObserverToken = audioPlayer.addPeriodicTimeObserver(forInterval: time,
queue: .main) {_ in
if (self.audioPlayer != nil) {
self.sendEvent(withName: "rn-playback", body: [
"isMuted": self.audioPlayer.isMuted,
"currentPosition": self.audioPlayerItem.currentTime().seconds * 1000,
"duration": self.audioPlayerItem.duration.seconds * 1000,
])
}
}
}发布于 2021-12-06 04:09:57
最后我用计时器观察。
@objc(setupPlayer:rejecter:)
func setupPlayer(
resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock
) {
...
do {
try engine.start()
startPlaybackTimer()
} catch let err {
...
}
}
@objc(updatePlaybackProgress:)
public func updatePlaybackProgress(timer: Timer) -> Void {
if player.isPlaying {
let status = [
"currentPosition": getCurrentPos(),
"duration": getCurrentDuration(),
] as [String : Any];
self.sendEvent(withName: "playbackData", body: status)
}
}
@objc(startPlaybackTimer)
func startPlaybackTimer() -> Void {
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(
timeInterval: self.subscriptionDuration,
target: self,
selector: #selector(self.updatePlaybackProgress),
userInfo: nil,
repeats: true
)
}
}发布于 2021-12-01 12:40:38
请试试这个,可以解决您的问题,currentTime会告诉avplayer当前的位置。
let timeScale = CMTimeScale(NSEC_PER_SEC)
let time = CMTime(seconds: 0.01, preferredTimescale: timeScale)
timeObserverToken = player.addPeriodicTimeObserver(forInterval: time,
queue: .main) {_ in
if (self.player != nil) {
let currentTime = self.player.currentTime().seconds
print("currentTime",currentTime)
}
}https://stackoverflow.com/questions/70183617
复制相似问题