2015-05-05 10 views
13

Come caricare la clip audio in tempo reale su un server durante la sua registrazione? Fondamentalmente il mio requisito è caricare una clip audio come mandrini/pacchetti durante la sua registrazione. Ho già eseguito la parte di registrazione con IQAudioRecorderController https://github.com/hackiftekhar/IQAudioRecorderController. Registra l'audio e salva in TemporaryDirectory.Carica la clip audio in tempo reale durante la sua registrazione?

Volevo sapere come caricare in tempo reale senza salvare la clip audio.

Questa è la parte di registrazione

//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]; 
} 

risposta

1

Ci sono vari modi di risolvere questo, un modo è quello di creare il proprio AudioGraph. L'AudioGraph può prelevare campioni dal microfono o da un file. Quindi si procede verso un'unità di output, ma si installa un callback per ottenere i frame campionati. Questi vengono quindi inviati alla classe di rete che può quindi caricare pacchetti per pacchetto.

Un buon esempio che mostra come scrivere questi pacchetti acquisiti su disco è AVCaptureAudioDataOutput.

In questo esempio i pacchetti vengono scritti in causa ExtAudioFileWriteAsync. Devi sostituire questo con la tua logica per il caricamento su un server. Nota che mentre puoi farlo facilmente, un problema è che questo ti darà dei campioni audio grezzi. Se ti occorrono come file wave o simili, potrebbe essere necessario attendere fino al termine della registrazione, poiché l'intestazione del file richiede informazioni sui campioni audio contenuti.

-1

Il codice attualmente utilizzato funzionerà per te se desideri caricare il file registrato dopo che la registrazione è stata eseguita, in quanto ti darà il file registrato finale.

Se si desidera caricare la registrazione audio dal vivo per il server allora io penso che si debba andare con la combinazione di,

AudioSession per le cose di registrazione

ffmpeg per caricare il tuo audio dal vivo al server.

È possibile ottenere un buon aiuto per la registrazione audio e la gestione dei buffer audio da here

Per ffmpeg io penso che si debba Lear molto. Sarà facile inviare file audio statici/salvati sul server usando ffmpeg, ma per l'invio di Live Buffer audio al server sarà un lavoro complicato.

+0

Non è necessario 'ffmpeg' per caricare l'audio, e probabilmente avrete problemi di licenza con l'inserimento di un'app integrata nell'App Store. – damian

+0

Potrebbero esserci altre opzioni per ffmpeg, ma se ti preoccupi delle licenze, non ci sono problemi nell'invio di una build ad App Store perché ho inviato con successo un'app con implementazione ffmpeg su App Store, ma devi menzionare che la stai usando la tua app a scopo di credito. – Yuvrajsinh

+0

ffmpeg è concesso in licenza LGPL. I termini della LGPL sono incompatibili con l'App Store. Fondamentalmente, stai violando i termini di licenza di ffmpeg. https://trac.ffmpeg.org/ticket/1229 – damian

Problemi correlati