2011-01-10 15 views
7

Czy jest jakiś sposób nagrywania na końcu pliku audio? Nie możemy po prostu wstrzymać nagrania zamiast go zatrzymać, ponieważ użytkownik musi mieć możliwość późniejszego powrotu do aplikacji i dodania więcej dźwięku do swojego nagrania. Obecnie dźwięk jest przechowywany w CoreData jako NSData. Plik NSData o numerze AppendData nie działa, ponieważ wynikowy plik audio nadal informuje, że jest on tak długi, jak oryginalne dane.AVAudioRecorder/AVAudioPlayer - dołącz nagrywanie do pliku

Inną możliwością jest pobranie oryginalnego pliku dźwiękowego wraz z nowym i połączenie ich w jeden plik audio, jeśli jest jakakolwiek metoda.

+0

Proszę spojrzeć na mój kod poniżej. Właśnie tego używam w aplikacji produkcyjnej. – memmons

+0

Możesz znaleźć mój kompletny kod do mearging: https://stackoverflow.com/a/49136633/2244094 –

Odpowiedz

1

Nie mam pełnego przykładu kodu, ale usługi plików rozszerzonego dźwięku mogą pomóc w łączeniu dwóch plików audio. Wyszukaj rozszerzone usługi plików audio w Xcode lub odwiedź poniższy link.

Apple documentation

+0

Nic w tej dokumentacji nie odnosi się do dołączania plików audio. – memmons

+0

szczerze mówiąc to interesujący ref, a jego prace, jeśli nie chcesz łączyć się z gotowymi plikami, ale chcesz napisać do istniejącego pliku i jego niesamowite (jak w rejestratorze jabłek!) – KostiaZzz

4

można dołączyć dwa pliki audio, tworząc AVMutableCompositionTrack po dodaniu dwóch plików i eksportowanie kompozycji przy użyciu exportAsynchronouslyWithCompletionHandler metodę AVAssetExportSession.

Proszę odnieść się do poniższych linków, aby uzyskać więcej informacji.

AVAssetExportSession Class Reference

Creating New Assets

Nadzieja to pomaga rozwiązać problem.

+0

Ta odpowiedź, choć nie jest kompletna, zdecydowanie postaw mi właściwą drogę, kiedy wymyśliłem ten sam problem. – kermitology

+0

Dodałem pełny kod poniżej, ale to właśnie ta odpowiedź wskazała mi właściwy kierunek. – memmons

+0

@siddharth Skąd masz dokumentację @ disanji.net? Wygląda jak kopia dokumentacji Apple, ale nie widzę tej sekcji w oficjalnych dokumentach Apple. – memmons

6

Można to zrobić dość łatwo za pomocą AVMutableComposionTrack insertTimeRange:ofTrack:atTime:error. Kod jest nieco wydłużony, ale tak naprawdę wygląda jak 4 kroki:

// Create a new audio track we can append to 
AVMutableComposition* composition = [AVMutableComposition composition]; 
AVMutableCompositionTrack* appendedAudioTrack = 
    [composition addMutableTrackWithMediaType:AVMediaTypeAudio 
          preferredTrackID:kCMPersistentTrackID_Invalid]; 

// Grab the two audio tracks that need to be appended 
AVURLAsset* originalAsset = [[AVURLAsset alloc] 
    initWithURL:[NSURL fileURLWithPath:originalAudioPath] options:nil]; 
AVURLAsset* newAsset = [[AVURLAsset alloc] 
    initWithURL:[NSURL fileURLWithPath:newAudioPath] options:nil]; 

NSError* error = nil; 

// Grab the first audio track and insert it into our appendedAudioTrack 
AVAssetTrack *originalTrack = [originalAsset tracksWithMediaType:AVMediaTypeAudio]; 
CMTimeRange timeRange = CMTimeRangeMake(kCMTimeZero, originalAsset.duration); 
[appendedAudioTrack insertTimeRange:timeRange 
          ofTrack:[originalTrack objectAtIndex:0] 
          atTime:kCMTimeZero 
           error:&error]; 
if (error) 
{ 
    // do something 
    return; 
} 

// Grab the second audio track and insert it at the end of the first one 
AVAssetTrack *newTrack = [newAsset tracksWithMediaType:AVMediaTypeAudio]; 
timeRange = CMTimeRangeMake(kCMTimeZero, newAsset.duration); 
[appendedAudioTrack insertTimeRange:timeRange 
          ofTrack:[newTrack objectAtIndex:0] 
          atTime:originalAsset.duration 
           error:&error]; 

if (error) 
{ 
    // do something 
    return; 
} 

// Create a new audio file using the appendedAudioTrack  
AVAssetExportSession* exportSession = [AVAssetExportSession 
             exportSessionWithAsset:composition 
             presetName:AVAssetExportPresetAppleM4A]; 
if (!exportSession) 
{ 
    // do something 
    return; 
} 


NSString* appendedAudioPath= @""; // make sure to fill this value in  
exportSession.outputURL = [NSURL fileURLWithPath:appendedAudioPath]; 
exportSession.outputFileType = AVFileTypeAppleM4A; 
[exportSession exportAsynchronouslyWithCompletionHandler:^{ 

    // exported successfully? 
    switch (exportSession.status) 
    { 
     case AVAssetExportSessionStatusFailed: 
      break; 
     case AVAssetExportSessionStatusCompleted: 
      // you should now have the appended audio file 
      break; 
     case AVAssetExportSessionStatusWaiting: 
      break; 
     default: 
      break; 
    } 
    NSError* error = nil; 

}]; 
Powiązane problemy