2012-09-27 7 views
5

Mam więc dwa pliki audio, ten sam format, potencjalnie inną długość. Chciałbym łączyć te pliki (nakładać dźwięk z jednego na drugi, NIE dołączać do nich na końcu).Jak mogę nakładać się na pliki audio i łączyć w iPhone'ie w Xcode?

Powiedzmy mam dwa pliki:

  1. pliku audio A, o długości 30 sekund, wielkość 220k
  2. pliku audio B, o długości 45 sekund, rozmiar 300k

co ja jak, łączy plik audio:

  1. Plik audio C, długość 45 sekund, rozmiar 300k (Rozumiem, że to może być więcej)

Doceńcie pomoc wszystkich!

+0

Witam @Beat, mam problem z tym, że rozmiar pliku audio C jest bardzo duży. Czy masz również ten problem? Jeśli tak, jak go rozwiązać? thx – Newbie

Odpowiedz

4

Oto, co zrobiłem w mojej aplikacji.

- (void) setUpAndAddAudioAtPath:(NSURL*)assetURL toComposition:(AVMutableComposition *)composition 
{ 
    AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL:assetURL options:nil]; 

    AVMutableCompositionTrack *track = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    AVAssetTrack *sourceAudioTrack = [[songAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 

    NSError *error = nil; 
    BOOL ok = NO; 

    CMTime startTime = CMTimeMakeWithSeconds(0, 1); 
    CMTime trackDuration = songAsset.duration; 
    //CMTime longestTime = CMTimeMake(848896, 44100); //(19.24 seconds) 
    CMTimeRange tRange = CMTimeRangeMake(startTime, trackDuration); 

    //Set Volume 
    AVMutableAudioMixInputParameters *trackMix = [AVMutableAudioMixInputParameters audioMixInputParametersWithTrack:track]; 
    [trackMix setVolume:0.8f atTime:startTime]; 
    [self.audioMixParams addObject:trackMix]; 

    //Insert audio into track 
    ok = [track insertTimeRange:tRange ofTrack:sourceAudioTrack atTime:CMTimeMake(0, 44100) error:&error]; 
} 


- (IBAction)saveRecording 
{ 
    AVMutableComposition *composition = [AVMutableComposition composition]; 
     audioMixParams = [[NSMutableArray alloc] initWithObjects:nil]; 

    //IMPLEMENT FOLLOWING CODE WHEN WANT TO MERGE ANOTHER AUDIO FILE 
    //Add Audio Tracks to Composition 
    NSString *URLPath1 = [[NSBundle mainBundle] pathForResource:@"mysound" ofType:@"mp3"]; 
    NSString *URLPath2 = [[NSBundle mainBundle] pathForResource:@"mysound2" ofType:@"mp3"]; 
    NSURL *assetURL1 = [NSURL fileURLWithPath:URLPath1]; 
    [self setUpAndAddAudioAtPath:assetURL1 toComposition:composition]; 

    NSURL *assetURL2 = [NSURL fileURLWithPath:URLPath2]; 
    [self setUpAndAddAudioAtPath:assetURL2 toComposition:composition]; 

    AVMutableAudioMix *audioMix = [AVMutableAudioMix audioMix]; 
    audioMix.inputParameters = [NSArray arrayWithArray:audioMixParams]; 

    //If you need to query what formats you can export to, here's a way to find out 
    NSLog (@"compatible presets for songAsset: %@", 
      [AVAssetExportSession exportPresetsCompatibleWithAsset:composition]); 

    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] 
             initWithAsset: composition 
             presetName: AVAssetExportPresetAppleM4A]; 
    exporter.audioMix = audioMix; 
    exporter.outputFileType = @"com.apple.m4a-audio"; 
    NSURL *exportURL = [NSURL fileURLWithPath:exportFile]; 
    exporter.outputURL = exportURL; 

// do the export 
     [exporter exportAsynchronouslyWithCompletionHandler:^{ 
      int exportStatus = exporter.status; 
      NSError *exportError = exporter.error; 

      switch (exportStatus) { 
       case AVAssetExportSessionStatusFailed: 

        break; 

       case AVAssetExportSessionStatusCompleted: NSLog (@"AVAssetExportSessionStatusCompleted"); 
        break; 
       case AVAssetExportSessionStatusUnknown: NSLog (@"AVAssetExportSessionStatusUnknown"); break; 
       case AVAssetExportSessionStatusExporting: NSLog (@"AVAssetExportSessionStatusExporting"); break; 
       case AVAssetExportSessionStatusCancelled: NSLog (@"AVAssetExportSessionStatusCancelled"); break; 
       case AVAssetExportSessionStatusWaiting: NSLog (@"AVAssetExportSessionStatusWaiting"); break; 
       default: NSLog (@"didn't get export status"); break; 
      } 
     }]; 
} 

Uwaga! Zrobiłem to już jakiś czas temu i być może trzeba będzie z nim trochę popracować, aby zadziałało. Ale w pewnym momencie zadziałało. Daj mi znać, jeśli masz problemy.

+0

hi @ gg13, Użyłem twojego sugerowanego sposobu miksowania audio. Ale moim problemem jest to, że eksportowany plik jest za dużo większy niż oryginalne. Czy istnieje sposób renderowania pliku w mniejszym filmie? – Newbie

+0

Próbowałem zmienić exporter.outputFileType na inny format pliku, taki jak AVFileTypeAIFC. Jednak powoduje błąd. Następnie czytam właściwość supportedFilesTypes eksportera i dowiaduję się, że obsługuje ona tylko AVFileTypeAppleM4A (tj. "Com.apple.m4a-audio" sugerowany typ pliku). Dlaczego? – Newbie

+0

Widzę, że ustawiasz głośność dla utworu na 0.8. Czy jest to jedyny krok konieczny, aby uniknąć uszkodzenia jakości? Niewiele wiem o miksowaniu dźwięku, a przy łączeniu plików uzyskuję złe wyniki, więc spróbuję tego, ale czy wiesz, czy to pomaga zwiększyć przepływność czy coś takiego? Na przykład, jeśli łączę dwa pliki audio na poziomie 44.1, czy wynik byłby lepszy, gdyby połączony plik był równy 88,2 (lub częściej 96), czy też nie byłoby powodu, aby to zrobić? – Sti

0

Jeśli ścieżka dźwiękowa nie została znaleziona w wybranym zasobie.Możesz użyć tej instrukcji, aby sprawdzić dźwięk konkretnego wideo.

if([[songAsset tracksWithMediaType:AVMediaTypeAudio] firstObject]==NULL) 
{ 
    NSLog(@"Sound is not Present"); 
} 
else 
{ 
    NSLog(@"Sound is Present"); 
    //You will initalise all things 
    AVAssetTrack *sourceAudioTrack = [[songAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 

} 
Powiązane problemy