2017-02-03 8 views
2

Я хочу использовать AVPlayer для воспроизведения аудиофайлов на iphone. Аудиофайл - это mp3-файл из локального хранилища на устройстве. Мне нужно синхронизировать его (воспроизведенный файл) с внешним источником времени. Этот источник времени может меняться во время игры, поэтому время от времени требуется синхронизация. Я использовал следующий код, чтобы изменить время в воспроизводимом аудиофайле:avplayer ищет неправильное положение в звуковом файле

player.play() 

//sth here...... 


//the code which is executed periodically whene it is time to synchronize 
let currentShowTime = ...... //time in miliseconds 
print("current show time \(currentShowTime)") 
let timescale = player.currentItem!.asset.duration.timescale 
let currentTime = CMTime(value:Int64(Float64(currentShowTime!) * Float64(timescale)/1000.0), timescale:timescale) 

//alternative way I count the seek time but the effect is the same 
//let currentTime = CMTimeMakeWithSeconds(Float64(currentShowTime!)/1000.0, 1000) 

print("currenttime \(currentTime)") 
player!.seek(to: currentTime,toleranceBefore:kCMTimeZero, toleranceAfter:kCMTimeZero){done in 
    print("done: \(done)")               
    print("player currenttime \(self.player!.currentItem!.currentTime().seconds)") 
} 

Проблема заключается в том, что звуковой файл играет неправильное место. Все параметры: текущее время показа, текущее время и текущее время игрока одинаковы (печатайте те же значения). Но я слышу, что звук сдвинут. Когда начинается воспроизведение файла, сдвиг мал (возможно, 500 мс), но когда дело доходит до конца (20 минут файла), сдвиг намного больше (около 8 секунд). Я также заметил, что когда я предоставляю меньший mp3-файл (с меньшей скоростью передачи), сдвиг меньше, но когда файл находится в лучшем качестве, сдвиг составляет до 20 секунд. Я делаю это неправильно или это ошибка в AVPlayer?

ответ

1

Я предполагаю, что файл, который вы используете, является файлом VBR (переменной скорости передачи). AVFoundation имеет проблемы с поиском через VBR файлы - он использует

averageBitRate = totalBytes/duration 
offset = seekTime * averageBitRate 

но для VBR файлов, averageBitRate не постоянен по всему файлу, поэтому offset может быть просчитался.

Вам потребуется перекодировать mp3 с постоянной скоростью передачи.

+1

Спасибо! Это оно! – user7509906