2015-05-05 12 views
13

Jak przesłać klip audio w czasie rzeczywistym do serwera podczas jego nagrywania? Zasadniczo moim wymaganiem jest przesłanie klipu audio jako uchwytu/pakietu podczas jego nagrywania. Zrobiłem już część nagrywającą przy użyciu IQAudioRecorderController https://github.com/hackiftekhar/IQAudioRecorderController. Nagrywa audio i zapisuje do TemporaryDirectory.Przesyłanie klipu audio w czasie rzeczywistym podczas nagrywania?

Chciałem wiedzieć, jak przesłać w czasie rzeczywistym bez zapisywania klipu audio.

Jest to część zapisu

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

Odpowiedz

1

Istnieją różne sposoby rozwiązywania tego, jednym ze sposobów jest stworzenie własnego AudioGraph. AudioGraph może pobierać próbki z mikrofonu lub z pliku. Następnie przechodzisz do jednostki wyjściowej, ale instalujesz wywołanie zwrotne, aby pobrać próbkowane ramki. Te następnie popychasz do swojej klasy sieci, która następnie może przesłać pakiet po pakiecie.

Dobrym przykładem, który pokazuje, jak zapisać przechwycone pakiety na dysku, jest AVCaptureAudioDataOutput.

W tym przykładzie pakiety są zapisywane w trybie ExtAudioFileWriteAsync. Trzeba to zastąpić własną logiką do przesłania na serwer. Zauważ, że choć możesz to łatwo zrobić, jednym z problemów jest to, że dostarczysz surowe próbki audio. Jeśli potrzebujesz ich jako pliku wave lub podobnego, możesz poczekać do zakończenia nagrywania, ponieważ nagłówek pliku wymaga informacji o zawartych próbkach audio.

-1

Kod, który aktualnie używasz, zadziała, jeśli chcesz przesłać nagrany plik po zakończeniu nagrywania, ponieważ otrzymasz ostatni nagrany plik.

Jeśli chcesz przesłać nagranie live audio do serwera to myślę, że trzeba iść z połączeniem,

AudioSession do nagrywania materiału

ffmpeg do przesyłania audio na żywo na serwerze.

Można dostać dobrą pomoc dla nagrywania audio i zarządzanie audio Bufory z here

Dla ffmpeg myślę trzeba Lear dużo. Łatwo będzie wysłać statyczny/zapisany plik audio na serwer za pomocą ffmpeg, ale do wysyłania na żywo bufora audio do serwera będzie trudna praca.

+0

Nie potrzebujesz "ffmpeg" do przesyłania dźwięku, a najprawdopodobniej będziesz mieć problemy z licencjonowaniem związane z umieszczaniem aplikacji w App Store. – damian

+0

Możliwe są inne opcje dla ffmpeg, ale jeśli chodzi o licencjonowanie, nie ma problemu z przesłaniem kompilacji do App Store, ponieważ pomyślnie przesłałem aplikację z implementacją ffmpeg do App Store, ale trzeba wspomnieć, że używasz jej w Twoja aplikacja dla celów kredytowych. – Yuvrajsinh

+0

ffmpeg ma licencję LGPL. Warunki LGPL są niezgodne z App Store. Zasadniczo naruszasz warunki licencji ffmpeg. https://trac.ffmpeg.org/ticket/1229 – damian

Powiązane problemy