2015-05-05 9 views
13

Wie kann ich Audioclips in Echtzeit auf einen Server während der Aufzeichnung hochladen? Grundsätzlich ist meine Anforderung ein Audioclip als Chucks/Pakete während seiner Aufnahme hochzuladen. Ich habe bereits den Aufzeichnungsteil mit IQAudioRecorderController https://github.com/hackiftekhar/IQAudioRecorderController gemacht. Es zeichnet das Audio auf und speichert es in TemporaryDirectory.Upload von Audio-Clips in Echtzeit während der Aufnahme?

Ich wollte wissen, wie man Echtzeit hochlädt, ohne den Audioclip zu speichern.

Dies ist der Aufzeichnungsteil

//Unique recording URL 


NSString *fileName = [[NSProcessInfo processInfo] globallyUniqueString]; 
_recordingFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.m4a",fileName]]; 


// Initiate and prepare the recorder 

_audioRecorder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:_recordingFilePath] settings:recordSetting error:nil]; 
_audioRecorder.delegate = self; 
_audioRecorder.meteringEnabled = YES; 


// Recording start 
- (void)recordingButtonAction:(UIBarButtonItem *)item 
{ 
if (_isRecording == NO) 
    { 
    _isRecording = YES; 

    //UI Update 
    { 
     [self showNavigationButton:NO]; 
     _recordButton.tintColor = _recordingTintColor; 
     _playButton.enabled = NO; 
     _trashButton.enabled = NO; 
    } 

    /* 
    Create the recorder 
    */ 
    if ([[NSFileManager defaultManager] fileExistsAtPath:_recordingFilePath]) 
    { 
     [[NSFileManager defaultManager] removeItemAtPath:_recordingFilePath error:nil]; 
    } 

    _oldSessionCategory = [[AVAudioSession sharedInstance] category]; 
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:nil]; 
    [_audioRecorder prepareToRecord]; 
    [_audioRecorder record]; 
} 
else 
{ 
    _isRecording = NO; 

    //UI Update 
    { 
     [self showNavigationButton:YES]; 
     _recordButton.tintColor = _normalTintColor; 
     _playButton.enabled = YES; 
     _trashButton.enabled = YES; 
    } 

    [_audioRecorder stop]; 
    [[AVAudioSession sharedInstance] setCategory:_oldSessionCategory error:nil]; 
} 
} 

// Recording done 

-(void)doneAction:(UIBarButtonItem*)item 
{ 
    if ([self.delegate respondsToSelector:@selector(audioRecorderController:didFinishWithAudioAtPath:)]) 
    { 
     IQAudioRecorderController *controller = (IQAudioRecorderController*)[self navigationController]; 
     [self.delegate audioRecorderController:controller didFinishWithAudioAtPath:_recordingFilePath]; 
    } 

    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

Antwort

1

Es gibt diese verschiedene Weise zu lösen, ist eine Möglichkeit, Ihre eigenen AudioGraph zu erstellen. Der AudioGraph kann Samples vom Mikrofon oder von einer Datei aufnehmen. Dann fahren Sie mit einer Ausgabeeinheit fort, installieren aber einen Callback, um die abgetasteten Frames zu erhalten. Diese drücken Sie dann auf Ihre Netzwerkklasse, die dann Paket für Paket hochladen kann.

Ein gutes Beispiel, das zeigt, wie Sie diese gefangenen Pakete auf die Festplatte schreiben, lautet AVCaptureAudioDataOutput.

In diesem Beispiel werden Pakete mit ExtAudioFileWriteAsync geschrieben. Sie müssen dies durch Ihre eigene Logik zum Hochladen auf einen Server ersetzen. Beachten Sie, dass, obwohl Sie dies leicht tun können, ein Problem darin besteht, dass Sie damit Roh-Audio-Samples erhalten. Wenn Sie sie als Wave-Datei oder ähnliches benötigen, müssen Sie möglicherweise warten, bis die Aufnahme beendet ist, da der Header der Datei Informationen über enthaltene Audio-Samples benötigt.

-1

Der Code, den Sie gerade verwenden, funktioniert für Sie, wenn Sie die aufgezeichnete Datei nach der Aufnahme hochladen möchten, da sie Ihnen die endgültige aufgenommene Datei liefert.

Wenn Sie Live-Audio-Aufzeichnung auf den Server hochladen möchten, dann ich glaube, Sie,

mit Kombination gehen

AudioSession für die Aufnahme Sachen

ffmpeg für Ihre Live-Audio-Server hochladen.

können Sie gute Hilfe bekommen für die Aufzeichnung von Audio und Audio Buffers Verwaltung von here

Für ffmpeg Ich glaube, Sie viel lear haben. Es ist einfach, statische/gespeicherte Audiodateien mit ffmpeg an den Server zu senden, aber das Senden von Live-Audiopuffern an den Server ist eine schwierige Aufgabe.

+0

Sie brauchen nicht 'ffmpeg', um Audio hochzuladen, und Sie haben wahrscheinlich Probleme mit der Lizenzierung einer App, die im App Store integriert ist. – damian

+0

Möglicherweise gibt es andere Optionen für ffmpeg, aber wenn Sie sich um die Lizenzierung kümmern, gibt es kein Problem beim Senden eines Builds an den App Store, da ich eine App mit ffmpeg-Implementierung erfolgreich im App Store eingereicht habe. Sie müssen jedoch erwähnen, dass Sie sie verwenden Ihre App für Kreditzwecke. – Yuvrajsinh

+0

ffmpeg ist lizenzierte LGPL. Die Bedingungen der LGPL sind nicht mit dem App Store vereinbar. Im Grunde verstößt man gegen die Lizenzbedingungen von ffmpeg. https://trac.ffmpeg.org/ticket/1229 – damian