Остановите AVPlayer и снова перезапустите файл MP3.

Я хочу запускать, приостанавливать и останавливать (так же, как перезапуск) мой mp3-файл, и я использую AVPlayer. Я получаю файлы с сервера.

Чтобы начать песню, я делаю:

[self.player start];

Чтобы сделать паузу, я делаю:

[self.player pause];

но когда я хочу остановить песню и перезагрузить ее, чтобы песня начиналась с самого начала, когда пользователь в следующий раз нажимает «кнопку запуска», я понятия не имею, что делать.

Я пробовал что-то вроде этого:

[self.player pause];
self.player = nil;

Но тогда плеер, конечно, нулевой, и я не могу снова перезапустить файл без новой инициализации. Есть идеи, как это остановить?


person Davis    schedule 16.09.2014    source источник
comment
[self.player seekToTime:CMTimeMakeWithSeconds(0, 5) completeHandler:nil], чтобы снова воспроизвести его с самого начала.   -  person Sandeep    schedule 16.09.2014
comment
Идеально, что работает как шарм, большое спасибо!   -  person Davis    schedule 16.09.2014
comment
@Sandeep, для чего нужен второй параметр (5)?   -  person Daniel Springer    schedule 18.02.2020


Ответы (6)


Остановите видео с помощью [player pause]

Затем используйте этот код при запуске видео.

[player seekToTime:kCMTimeZero];
[player play];

Мне это нравится больше, чем комментарий, который решил OP, потому что он устраняет предупреждение и использует константу.

person Cbas    schedule 12.04.2016

Лучшее решение для этого в Swift ‹ 4:

player.seek(to: kCMTimeZero)
player.play()

Свифт >= 4:

player.seek(to: .zero)
player.play()
person fabioalmeida    schedule 15.12.2017

  • В Xamarin.ios

player.Seek(CoreMedia.CMTime.Zero);

игрок.Играть();

person Kamalkumar.E    schedule 01.05.2018

seek#to имеет обработчик завершения.

p?.seek(to: .zero)
p?.rate = 1

не совсем правильно. Вы можете получить дрожание звука.

p?.seek(to: .zero) { [weak self] _ in
    self?.p?.rate = 1
}

это, вероятно, то, что вы хотите.

Если он уже воспроизводится, а вы просто выполняете поиск и ничего больше, опять же, вы можете дрожать.

Вам, наверное, лучше всего

p?.rate = 0
p?.seek(to: .zero) { [weak self] _ in
    self?.p?.rate = 1
}

Если это действительно важное приложение, вам также придется учитывать состояние ошибки при завершении поиска.

person Fattie    schedule 17.02.2020

В Swift 4: self.player.seek(to: CMTime.zero)

person Reefwing    schedule 25.12.2018

person    schedule
comment
Из-за плохого форматирования кода и отсутствия объяснений этот ответ бесполезен. - person Kerem; 20.02.2020