web-dev-qa-db-ja.com

AVPlayerでmp3オーディオをストリーミングする

私はこれについていくつか矛盾した報告を聞いています。私がやろうとしているのは、URLからmp3ファイルをストリーミングすることです。私は何時間もの研究を行ってきましたが、これを行う方法や、どんな種類のオーディオプレーヤーを使用すべきかについての良いガイドが見つかりません。

友人の中には、AVPlayerはmp3をストリーミングできると言っていますが、Appleのドキュメントではできないと言っています。マットギャラガーのオーディオストリーマー(http://www.cocoawithlove.com/2008 /09/streaming-and-playing-live-mp3-stream.html)、しかし、そのコードはかなり前に作成されたものであり、自動リリースと保持などを介して作業するのが難しいほど私はこれに十分に新しいです。

ストリーミングしようとしているオーディオは、libsynサーバーからのかなり大きなmp3ファイルであり、URLはformatです。

http://traffic.libsyn.com/podcastname/episode.mp3

私がする必要があるのは、それをつかんで再生を開始すること、そして一時停止とスクラブの機能です。それでは、まず最初に、CAN AVPlayerでmp3をストリーミングできますか?もしそうなら、誰かが私を指すことができるガイドやコードを持っていますか?そうでない場合、オーディオをストリーミングできるオーディオプレーヤークラスはありますか?

URLで初期化してからAVPlayerに追加するAVPlayerItemを作成しようとしましたが、大量のError Loading ...およびSymbol Not Found ...エラーが発生します。私はこれに関する情報を感謝します、ありがとう!

25
derekahc

これを試して

 -(void)playselectedsong{

        AVPlayer *player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:urlString]];
        self.songPlayer = player;
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(playerItemDidReachEnd:)
                                                     name:AVPlayerItemDidPlayToEndTimeNotification
                                                   object:[songPlayer currentItem]];
        [self.songPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
        [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateProgress:) userInfo:nil repeats:YES];



    }
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

        if (object == songPlayer && [keyPath isEqualToString:@"status"]) {
            if (songPlayer.status == AVPlayerStatusFailed) {
                NSLog(@"AVPlayer Failed");

            } else if (songPlayer.status == AVPlayerStatusReadyToPlay) {
                NSLog(@"AVPlayerStatusReadyToPlay");
                [self.songPlayer play];


            } else if (songPlayer.status == AVPlayerItemStatusUnknown) {
                NSLog(@"AVPlayer Unknown");

            }
        }
    }

    - (void)playerItemDidReachEnd:(NSNotification *)notification {

     //  code here to play next sound file

    }
66
Sumit Mundra

HTTPストリーミングをサポートする私のオープンソースのAudjustableライブラリを試すこともできます。 MattのAudioStreamerに基づいていますが、複数のデータソース(非HTTP)とギャップレス再生をサポートするように整理、最適化、更新されています。

https://github.com/tumtumtum/audjustable

15
tumtumtum

Sumit Mundraの回答に加えて、私は大いに助けになりましたが、この手法は実際にはリモートサーバーからのMP3ファイルをstreamしません。これを実装すると、ファイルが同期してダウンロードされ、UIがブロックされてから再生されます。私が見つけたMP3を適切にストリーミングする方法は、M3Uファイルをポイントすることでした。これは、元のMP3へのリンクを含む.m3u拡張子を持つ単なるテキストファイルです。代わりにSumitのコードをそのファイルに向けると、すぐに再生を開始するストリームができます。

これは私がその情報を見つけた場所です: http://www.soundabout.net/streammp3.htm

2
Aaron Vegh

Matt GallagherのAudioStreamerは2か月前に更新されました https://github.com/mattgallagher/AudioStreamer/commits/master

しかし、探しているものについては、サンプルコードStichedStreamPlayer http://developer.Apple.com/library/ios/#samplecode/StitchedStreamPlayer/Introduction/Intro.html#//Apple_ref/をご覧ください。 doc/uid/DTS40010092

AVPlayerオブジェクトを使用し、メソッド-(IBAction)loadMovieButtonPressed:(id)senderを見ると、AVPlayerオブジェクトの設定方法をたどることができます。

0
Iain Smith

Mp3の代わりにm3uファイルを使用することに関するAaronの投稿は、私にとってはうまくいきました。また、AVPlayerがm3u構文にこだわりがあることもわかりました。たとえば、次のことを試してみたところ、有効な期間を取得できず(常に無期限でした)、相対パスが機能しませんでした。

#EXTM3U
#EXTINF:71
https://test-domain.com/90c9a240-51b3-11e9-bb69-c1300ce2348f.mp3

ただし、m3uファイルを次のように更新すると、両方の問題が解決されました。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:70
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:70.000,
8577d650-51b3-11e9-8e69-4f2b085e94aa.mp3
#EXT-X-ENDLIST
0
dcpedit