簡體   English   中英

使用AVPlayer流mp3音頻

[英]Streaming mp3 audio with AVPlayer

我聽到一些與此有關的報道。 我想做的是從URL流mp3文件。 我已經進行了數小時的研究,但找不到有關如何執行此操作的最佳指南,甚至找不到應該使用的音頻播放器。

一些朋友告訴我,AVPlayer可以流mp3,但是Apple文檔說不能。 我傾倒了Matt Gallagher的音頻流媒體(http://www.cocoawithlove.com/2008/09/streaming-and-playing-live-mp3-stream.html),但是該代碼在很早以前就已經做了,並且我對此還很陌生,以至於很難完成自動發布,保留和所有這些工作。

我嘗試流式傳輸的音頻是來自libsyn服務器的相當大的mp3文件,其URL格式為。

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

我需要做的就是抓住它並開始播放,並具有暫停和擦洗的功能。 那么首先,CANVP播放器可以流mp3嗎? 如果是這樣,是否有人可以向我指出任何指南或代碼? 如果沒有,是否有可以播放音頻的任何音頻播放器類?

我試圖創建一個AVPlayerItem,使用URL進行初始化,然后將其添加到AVPlayer中,但是卻遇到大量錯誤加載...和找不到符號...錯誤。 非常感謝您提供任何信息,謝謝!

嘗試這個

 -(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

    }

您還可以嘗試支持HTTP流的開放源代碼Audjustable庫。 它基於Matt的AudioStreamer,但經過整理,優化和更新,以支持多個數據源(非HTTP)和無縫播放。

https://github.com/tumtumtum/audjustable

除了Sumit Mundra的回答對我大有幫助外,我發現該技術實際上並沒有從遠程服務器流式傳輸 MP3文件。 當我實現此功能時,文件會在播放前同步下載,阻止UI。 正確傳輸我發現很好的MP3的方法是指向M3U文件。 這只是一個擴展名為.m3u的文本文件,其中包含指向原始MP3的鏈接。 將Sumit的代碼指向該文件,您將有一個流立即開始播放。

這是我發現該信息的地方: http : //www.soundabout.net/streammp3.htm

馬特·加拉格爾(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對象。

亞倫關於使用m3u文件而不是mp3的帖子對我有用。 我還發現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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM