воспроизводить аудио из интернета с помощью AVAudioPlayer - PullRequest
7 голосов
/ 03 сентября 2010

Я использую AVAudioPlayer для воспроизведения звука, и он отлично работает при воспроизведении файлов, локально хранящихся на ПК.

Но когда я передаю URL-адрес аудиофайла через Интернет, он, к сожалению, не работает. Вот как выглядит код:

NSString *url = [[NSString alloc] init];  
url = @"http://files.website.net/audio/files/audioFile.mp3";  
NSURL *fileURL = [[NSURL alloc] initWithString: url];  
AVAudioPlayer *newPlayer =[[AVAudioPlayer alloc] initWithContentsOfURL: fileURL error: nil];

Может ли кто-нибудь указать на проблему и что можно сделать?
Спасибо!

Ответы [ 4 ]

30 голосов
/ 29 апреля 2013

Используйте AVPlayer для потоковой передачи аудио / видео на основе URL-адресов http. Это будет работать нормально. AVAudioPlayer для локальных файлов. Вот код

NSURL *url = [NSURL URLWithString:url];    
self.avAsset = [AVURLAsset URLAssetWithURL:url options:nil];    
self.playerItem = [AVPlayerItem playerItemWithAsset:avAsset];    
self.audioPlayer = [AVPlayer playerWithPlayerItem:playerItem];    
[self.audioPlayer play];
18 голосов
/ 04 августа 2011

Это то, что говорится в документации Apple:

Класс AVAudioPlayer не обеспечивает поддержку потокового аудио на основе URL-адресов HTTP.URL, используемый с initWithContentsOfURL:, должен быть URL-адресом файла (file://).То есть локальный путь.

3 голосов
/ 22 сентября 2010

Я попробовал другой метод initWithData на AVAudioPlayer вместо initWithContentsOfURL.Сначала попробуйте загрузить файл MP3 в NSData, а затем воспроизвести эти данные.

Посмотрите на мой код здесь .

0 голосов
/ 03 мая 2017

Используйте AVPlayer и следите за его состоянием, чтобы начать воспроизведение.

Вот рабочий пример, надеюсь, он будет полезен.

@implementation AudioStream

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    if (context == PlayerStatusContext) {
        AVPlayer *thePlayer = (AVPlayer *)object;
        switch ([thePlayer status]) {
            case AVPlayerStatusReadyToPlay:
                NSLog(@"player status ready to play");
                [thePlayer play];
                break;
            case AVPlayerStatusFailed:
                NSLog(@"player status failed");
                break;
            default:
                break;
        }
        return;
    } else if (context == ItemStatusContext) {
        AVPlayerItem *thePlayerItem = (AVPlayerItem *)object;
        switch ([thePlayerItem status]) {
            case AVPlayerItemStatusReadyToPlay:
                NSLog(@"player item ready to play");
                break;
            case AVPlayerItemStatusFailed:
                NSLog(@"player item failed");
                break;
            default:
                break;
        }
        return;
    }

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}

- (void)playAudioStream
{
    NSURL *audioUrl = [NSURL URLWithString:@"your_stream_url"];
    AVURLAsset *audioAsset = [AVURLAsset assetWithURL:audioUrl];
    AVPlayerItem *audioPlayerItem = [AVPlayerItem playerItemWithAsset:audioAsset];
    [audioPlayerItem addObserver:self forKeyPath:@"status" options:0 context:ItemStatusContext];
    self.player = [AVPlayer playerWithPlayerItem:audioPlayerItem];
    [self.player addObserver:self forKeyPath:@"status" options:0 context:PlayerStatusContext];
}

@end
...