Почему, когда AvPlayer играет с заблокированным экраном, и я останавливаюсь на игре, он выполняется только после нескольких миллисекундов? В моем приложении для обучения английскому звуку будет воспроизводиться и пауза, контролируемая таймером. Но когда я выключите экран с AvPlayer, не будет пауза, как запланировано (он управляется текстами, которые являются точными), но задерживается сотнями миллисекунд. Мой код работает хорошо, когда экран включен даже при заблокированном экране или когда приложение работает в фоновом режиме. Мой iPhone не в режиме низкой батареи. Аудио -файл хранится на самом iPhone.if observer == nil {
weak var wself = self;
observer = self.addPeriodicTimeObserver(forInterval: CMTime(seconds: 0.05, preferredTimescale: CMTimeScale(NSEC_PER_SEC)), queue: nil, using: {cmtime in
if wself != nil {
wself!.onTimerTick(cmTime: cmtime);
}
})
}
< /code>
onTimerTick() Метод:
@objc func onTimerTick(cmTime:CMTime) {
if self.openAutoPlayAndReadTimer == false {
if self.autoPlayAndReadTimer != nil {
if self.autoPlayAndReadTimer!.isValid {
self.autoPlayAndReadTimer?.invalidate();
}
self.autoPlayAndReadTimer = nil;
}
return
}
let index = UserDefaults.getAL_WhiteCircleTime_In_ReadAndFollowView();
if index == 0 {
return
}
var i = 0;
for item in self.realPlayTimeList! {
if item.time < cmTime.seconds && abs(item.time - cmTime.seconds) < 0.5 {
break
}
i = i + 1;
}
if i >= self.realPlayTimeList!.count {
return
}
let matchItem = self.realPlayTimeList!;
let time = matchItem.time;
if time == lastTickTime {
return
}
//If the duation is zero, break
if matchItem.stopDuration * matchItem.scale < 0.05 {
return
}
self.pause();
if self.delegate != nil {
self.delegate?.onSongPauseByAutoPlayAndReadTimer();
}
lastTickTime = time;
autoPlayAndReadTimer?.invalidate();
autoPlayAndReadTimer = nil;
if autoPlayAndReadTimer == nil || autoPlayAndReadTimer?.isValid == false {
let duration = matchItem.stopDuration * matchItem.scale;
autoPlayAndReadTimer = Timer.scheduledTimer(timeInterval: duration, target: self, selector: #selector(onAutoPlayAndReadTimerTick), userInfo: nil, repeats: true);
}
autoPlayAndReadTimer?.fire()
}
< /code>
Timer onAutoPlayAndReadTimerTick() Метод:
@objc func onAutoPlayAndReadTimerTick() {
if hasEnter == false {
hasEnter = true
return
} else {
hasEnter = false
}
self.play();
if self.delegate != nil {
self.delegate?.onSongPlayByAutoPlayAndReadTimer();
}
autoPlayAndReadTimer?.invalidate();
autoPlayAndReadTimer = nil;
}
< /code>
Code in AppDelegate:
let audioSession = AVAudioSession.sharedInstance();
do {
try audioSession.setCategory(.playback, mode: .default, options: []) // 或者使用 .ambient
try audioSession.setActive(true)
} catch {
print("Setting category to AVAudioSessionCategoryPlayback failed.")
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... een-locked
Почему AvPlayer останавливается на игровых действиях, задержанных с заблокированным экраном? ⇐ IOS
Программируем под IOS
1756057071
Anonymous
Почему, когда AvPlayer играет с заблокированным экраном, и я останавливаюсь на игре, он выполняется только после нескольких миллисекундов? В моем приложении для обучения английскому звуку будет воспроизводиться и пауза, контролируемая таймером. Но когда я выключите экран с AvPlayer, не будет пауза, как запланировано (он управляется текстами, которые являются точными), но задерживается сотнями миллисекунд. Мой код работает хорошо, когда экран включен даже при заблокированном экране или когда приложение работает в фоновом режиме. Мой iPhone не в режиме низкой батареи. Аудио -файл хранится на самом iPhone.if observer == nil {
weak var wself = self;
observer = self.addPeriodicTimeObserver(forInterval: CMTime(seconds: 0.05, preferredTimescale: CMTimeScale(NSEC_PER_SEC)), queue: nil, using: {cmtime in
if wself != nil {
wself!.onTimerTick(cmTime: cmtime);
}
})
}
< /code>
onTimerTick() Метод:
@objc func onTimerTick(cmTime:CMTime) {
if self.openAutoPlayAndReadTimer == false {
if self.autoPlayAndReadTimer != nil {
if self.autoPlayAndReadTimer!.isValid {
self.autoPlayAndReadTimer?.invalidate();
}
self.autoPlayAndReadTimer = nil;
}
return
}
let index = UserDefaults.getAL_WhiteCircleTime_In_ReadAndFollowView();
if index == 0 {
return
}
var i = 0;
for item in self.realPlayTimeList! {
if item.time < cmTime.seconds && abs(item.time - cmTime.seconds) < 0.5 {
break
}
i = i + 1;
}
if i >= self.realPlayTimeList!.count {
return
}
let matchItem = self.realPlayTimeList![i];
let time = matchItem.time;
if time == lastTickTime {
return
}
//If the duation is zero, break
if matchItem.stopDuration * matchItem.scale < 0.05 {
return
}
self.pause();
if self.delegate != nil {
self.delegate?.onSongPauseByAutoPlayAndReadTimer();
}
lastTickTime = time;
autoPlayAndReadTimer?.invalidate();
autoPlayAndReadTimer = nil;
if autoPlayAndReadTimer == nil || autoPlayAndReadTimer?.isValid == false {
let duration = matchItem.stopDuration * matchItem.scale;
autoPlayAndReadTimer = Timer.scheduledTimer(timeInterval: duration, target: self, selector: #selector(onAutoPlayAndReadTimerTick), userInfo: nil, repeats: true);
}
autoPlayAndReadTimer?.fire()
}
< /code>
Timer onAutoPlayAndReadTimerTick() Метод:
@objc func onAutoPlayAndReadTimerTick() {
if hasEnter == false {
hasEnter = true
return
} else {
hasEnter = false
}
self.play();
if self.delegate != nil {
self.delegate?.onSongPlayByAutoPlayAndReadTimer();
}
autoPlayAndReadTimer?.invalidate();
autoPlayAndReadTimer = nil;
}
< /code>
Code in AppDelegate:
let audioSession = AVAudioSession.sharedInstance();
do {
try audioSession.setCategory(.playback, mode: .default, options: []) // 或者使用 .ambient
try audioSession.setActive(true)
} catch {
print("Setting category to AVAudioSessionCategoryPlayback failed.")
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79744831/why-are-avplayer-pause-an-play-actions-delayed-with-the-screen-locked[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия