AVPlayer не может воспроизводить файл формата mp3, загруженный AVURLAsset с параметром AVURLAssetPreferPreciseDurationAndTimingKey, установленным в значение true на iOS 14

Во время тестирования своего приложения на iOS 14 я обнаружил, что некоторые файлы в формате mp3 не работают должным образом. От начала до конца ошибок нет, но звуки слышны только в самом начале и приглушаются в следующие секунды.

Вот примеры кодов для воспроизведения.

NSURL *url = [NSURL URLWithString:urlString];

BOOL preferPreciseDuration = YES;
NSDictionary *options = @{AVURLAssetPreferPreciseDurationAndTimingKey: @(preferPreciseDuration)};
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:url options:options];

AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];
[playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionInitial|NSKeyValueObservingOptionNew context:nil];

player = [AVPlayer playerWithPlayerItem:playerItem];
[player play];

Я некоторое время изучал это и обнаружил:

  1. Эта проблема возникает только на iOS 14+.
  2. Если я опущу параметр AVURLAssetPreferPreciseDurationAndTimingKey, все будет работать нормально.
  3. Кажется, это связано с сервером, я протестировал два URL-адреса, на которых размещен один и тот же файл, но sample1 работает, а sample1 - нет.
  4. На том же сервере file1 работает, а file2 не работает.

person forkaj    schedule 26.02.2021    source источник


Ответы (1)


Недавно я реализовал функции звука в своем приложении, оно работает и в iOS 14+.

var player: AVAudioPlayer?


let url = Bundle.main.url(forResource: "zapsplat_emergency_nuclear_power_station_meltdown_alarm_42849", withExtension: "mp3")!

do {
        player = try AVAudioPlayer(contentsOf: url)
        guard let player = player else { return }

        player.prepareToPlay()
        player.play()

} catch let error as NSError {
     print(error.description)
}
person Parth Patel    schedule 26.02.2021
comment
AVAudioPlayer не подходит для воспроизведения звука из сетевого потока. - person forkaj; 26.02.2021
comment
Хотите заниматься стримингом? Можете ли вы указать URL-адрес аудио? - person Parth Patel; 26.02.2021
comment
Чтобы играть с AVAudioPlayer, необходимо загрузить весь файл, прежде чем проигрыватель сможет начать воспроизведение. С AVPlayer и AVURLAsset проигрыватель может начать воспроизведение после загрузки части файла. - person forkaj; 01.03.2021