2016-05-23 43 views
0

我想通過逐個提交音頻幀來播放mp3音頻流。 我必須從內存緩衝區提交它 - 不使用mp3文件url(假設mp3從網絡流入併到達內存緩衝區)。Objective c - 從內存緩衝區逐幀播放mp3流

從哪裏開始? 有沒有任何示例代碼做這種事情?

+0

你能把它制定成MP3文件嗎?如在,你可以安排這樣的字節?我不是要求你把它寫到任何地方,或者在任何時候都有可用的東西,但作爲一個消費者,我可以不斷要求你輸入下一個字節,並最終收到一個看起來像有效的MP3文件的流? – Tommy

+0

我不是完全理解你的評論,所以請讓我知道如果我沒有回答你的問題。我逐幀獲取內存緩衝區(uint數組)中的數據。原始數據來自一個真正的MP3文件,所以基本上我可以保存所有的緩衝區,並播放它,但我想盡快播放數據..所以技術上,我認爲你的問題的答案是是的:) –

+0

我試圖決定是否值得提倡你寫一個'NSURLProtocol'子類,讓你以任何從URL讀取數據的人的數據源的方式進行異步操作。我不得不承認,儘管沙盒上最新的內容是不確定的(對於DRM原因,AVFoundation並不一定尊重你的NSURLProtocol),所以這可能不是答案。除非或直到我可以更新自己,否則將其作爲一次性評論。 – Tommy

回答

1

所以它似乎比我想象的要簡單得多......

我剛剛創建:

AVAudioPlayer* oAudioPlayer; 

,並與數據初始化它:

oAudioPlayer = [[AVAudioPlayer alloc] initWithData:chunk fileTypeHint:AVFileTypeMPEGLayer3 error:&error]; 

而大塊是一些mp3幀來自網絡。

,最終的播放方法:

if ([oAudioPlayer play] == false) 
     NSLog(@"failed to play audio buffer"); 

如果一個人希望有一個回調,框架已經完成,以播放他可以添加一個委託播放之前:

oAudioPlayer.delegate = oSound; 

而oSound是一類:

@interface SoundClass : NSObject <AVAudioPlayerDelegate> {} 

    @property(nonatomic,retain) AVAudioPlayer *player; 

    - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag; 
    - (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError * __nullable)error; 

    @end 

似乎音頻播放器需要大緩衝區(我需要在leas t兩個幀在原始聽到聲音)。

目前,音頻聽起來不夠好,但我想這是數據饋送我做錯了。