0
我想通過逐個提交音頻幀來播放mp3音頻流。 我必須從內存緩衝區提交它 - 不使用mp3文件url(假設mp3從網絡流入併到達內存緩衝區)。Objective c - 從內存緩衝區逐幀播放mp3流
從哪裏開始? 有沒有任何示例代碼做這種事情?
我想通過逐個提交音頻幀來播放mp3音頻流。 我必須從內存緩衝區提交它 - 不使用mp3文件url(假設mp3從網絡流入併到達內存緩衝區)。Objective c - 從內存緩衝區逐幀播放mp3流
從哪裏開始? 有沒有任何示例代碼做這種事情?
所以它似乎比我想象的要簡單得多......
我剛剛創建:
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兩個幀在原始聽到聲音)。
目前,音頻聽起來不夠好,但我想這是數據饋送我做錯了。
你能把它制定成MP3文件嗎?如在,你可以安排這樣的字節?我不是要求你把它寫到任何地方,或者在任何時候都有可用的東西,但作爲一個消費者,我可以不斷要求你輸入下一個字節,並最終收到一個看起來像有效的MP3文件的流? – Tommy
我不是完全理解你的評論,所以請讓我知道如果我沒有回答你的問題。我逐幀獲取內存緩衝區(uint數組)中的數據。原始數據來自一個真正的MP3文件,所以基本上我可以保存所有的緩衝區,並播放它,但我想盡快播放數據..所以技術上,我認爲你的問題的答案是是的:) –
我試圖決定是否值得提倡你寫一個'NSURLProtocol'子類,讓你以任何從URL讀取數據的人的數據源的方式進行異步操作。我不得不承認,儘管沙盒上最新的內容是不確定的(對於DRM原因,AVFoundation並不一定尊重你的NSURLProtocol),所以這可能不是答案。除非或直到我可以更新自己,否則將其作爲一次性評論。 – Tommy