Получите аудиопоток из URI и воспроизведите его на iPhone

Я хотел бы получить аудиопоток из URL-адреса и воспроизвести его на iPhone. К сожалению, есть только пример С#, как играть в этот поток, но мне нужна реализация Objective C в iPhone. Я пробовал самостоятельно использовать разные аудиокарты, но все это было безуспешно. Это то, что в С#:

response = httpWebRequest.GetResponse();
            using (Stream stream = response.GetResponseStream())
            {
                using (SoundPlayer player = new SoundPlayer(stream))
                {
                    player.PlaySync();
                }
            }

Что мне делать в объективе C, чтобы получить поток аудио из этого URL-адреса? В этом URL-адресе у меня нет mp3 файла или чего-то еще, я просто получаю поток. Вероятно, я должен каким-то образом загрузить этот поток в аудиофайл iPhone, а затем воспроизвести его, чтобы избавиться от лагов.

Я пробовал это:

 AVPlayer *player = [AVPlayer playerWithURL:url];
 [player play];

И это:

AVAudioPlayer *theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: url error:nil];

    [theAudio setVolume :0.50]; //setting the volume

    [theAudio play];

Ни один из них не работал. Я проверил свой url, он хорошо работает в браузере.

Это код, который сработал:

NSData *_objectData = [NSData dataWithContentsOfURL:url];
    NSError *error;

    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData:_objectData error:&error];
    audioPlayer.numberOfLoops = 0;
    audioPlayer.volume = 1.0f;
    [audioPlayer prepareToPlay];

    if (audioPlayer == nil)
        NSLog(@"%@", [error description]);
    else
        [audioPlayer play];

Ответ 1

NSString* resourcePath = url; //your url
NSData *_objectData = [NSData dataWithContentsOfURL:[NSURL URLWithString:resourcePath]];
NSError *error;

app.audioPlayer = [[AVAudioPlayer alloc] initWithData:_objectData error:&error];
app.audioPlayer.numberOfLoops = 0;
app.audioPlayer.volume = 1.0f;
[app.audioPlayer prepareToPlay];

if (app.audioPlayer == nil)
    NSLog(@"%@", [error description]);
else
    [app.audioPlayer play];

Ответ 2

Привет, я столкнулся с этой проблемой потоковой передачи звука для радиоприложения. Я искал ответы, и они не работали. AVAudioPlayer не является классом, который будет использоваться здесь. Загрузка содержимого URL-адреса с использованием объекта NSData не является решением, так как он загружает содержимое, а затем выполняет код. Это похоже на загрузку mp3, а затем воспроизведение его локально на проигрывателе.
[NSData dataWithContentsOfURL:[NSURL URLWithString:resourcePath]]; //Downloads the contents of the url and in case of radio the url content is unlimited. The program gets frozen on executing this.

Вместо этого используйте класс AVPlayer.

Этот код работал в моем приложении радио

AVPlayer *objAVPlayer = [[AVPlayer alloc] initWithURL:url];
[objAVPlayer play];

Этот код не загружает содержимое на url, но он воспроизводит поток по мере его получения.

Ответ 3

Посмотрите на AVPlayer класс, часть рамки AVFoundation... это класс objective-c (iOS), который вы используете для потоковой передачи звука.

Ответ 4

MPMoviePlayerController *player;
player = [[MPMoviePlayerController alloc] init] ;
player.view.frame = CGRectMake(0, 0, 0, 0);
player.movieSourceType = MPMovieSourceTypeStreaming;
player.view.hidden = YES;
[self.view addSubview: [wikiMusicPlayer view]];

NSString *address = Your URL;
address = [address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURL URLWithString:address];
[wikiMusicPlayer setContentURL:url];
[wikiMusicPlayer prepareToPlay];
[wikiMusicPlayer setShouldAutoplay: NO];
[wikiMusicPlayer play];