2016-05-23 5 views
0

Ich möchte mp3 audio stream abspielen, indem ich die Audioframes eins nach dem anderen einsende. Ich muss es aus dem Speicher-Puffer - ohne Verwendung von MP3-Datei-URL (sagen wir, dass die mp3 aus dem Netzwerk gestreamt und in Speicher-Puffer angekommen).Objective c - play mp3 stream Bild für Bild aus dem Speicher

Wo soll ich anfangen? Gibt es einen Beispielcode, der so etwas tut?

+0

Können Sie es als MP3-Datei formulieren? Wie in, könnten Sie die Bytes so arrangieren? Ich verlange nicht, dass du es irgendwo schreibst oder zu irgendeinem Zeitpunkt die ganze Sache zur Verfügung hast, aber könnte ich als Verbraucher dich immer wieder nach dem nächsten Byte fragen und am Ende einen Stream erhalten, der wie eine gültige MP3-Datei aussieht? – Tommy

+0

Ich verstehe Ihren Kommentar nicht, also lassen Sie es mich wissen, wenn ich Ihre Frage nicht beantwortet habe. Ich bekomme die Daten in Speicherpuffern (Arrays von Uint) Frame für Frame. Die Originaldaten kommen von einer echten mp3-Datei, also kann ich im Prinzip alle Puffer speichern und abspielen, aber ich möchte die Daten so schnell wie möglich wiedergeben. Technisch gesehen denke ich, dass die Antwort auf Ihre Frage ja lautet: –

+0

Ich versuche zu entscheiden, ob es sich lohnt zu befürworten, dass Sie nur eine 'NSURLProtocol'-Unterklasse schreiben, die Ihnen eine Möglichkeit gibt, asynchron als Datenquelle für jeden zu fungieren, der von einer URL liest. Ich muss zugeben, dass ich mich nicht sicher bin, was das Neueste im Sandboxing ist (aus DRM-Gründen respektiert AVFoundation nicht unbedingt deine 'NSURLProtocol's), so dass dies keine Antwort sein kann. Habe es als Wegwerfkommentar, es sei denn oder bis ich mich selbst aktualisieren kann. – Tommy

Antwort

1

So scheint es viel einfacher zu sein, als ich dachte ...

Ich habe gerade:

AVAudioPlayer* oAudioPlayer; 

und die mit Daten initialisiert:

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

während Brocken einige ist mp3-Frames sind aus dem Netzwerk angekommen.

und schließlich die Spielmethode:

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

Wenn man einen Rückruf haben will, wenn der Rahmen er vor dem Spiel einen Delegaten hinzufügen können gespielt werden beendet ist:

oAudioPlayer.delegate = oSound; 

während oSound ist eine Klasse:

@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 

Es scheint, dass der Audio-Player große Puffer benötigt (ich brauchte mindestens Leas t zwei Bilder in einem rohen Ton zu hören).

Zur Zeit klingt das Audio nicht gut genug, aber ich denke, es ist etwas mit der Datenzuführung, die ich falsch mache.