AVAudioRecorder / AVAudioPlayer – Ajout de l'logging au file

Y at-il un moyen d'save sur la fin d'un file audio? Nous ne pouvons pas simplement mettre l'logging en pause au lieu de l'arrêter, car l'user doit pouvoir revenir plus tard sur l'application et append plus d'audio à son logging. Actuellement, l'audio est stocké dans CoreData en tant que NSData. Le paramètre AppendData de AppendData ne fonctionne pas car le file audio résultant indique toujours qu'il est seulement aussi long que datatables d'origine.

Une autre possibilité serait de prendre le file audio original, avec le nouveau, et de les concaténer en un seul file audio, s'il y a un moyen de le faire.

Cela peut être fait assez facilement en utilisant AVMutableComposionTrack insertTimeRange:ofTrack:atTime:error . Le code est un peu long, mais c'est vraiment comme 4 étapes:

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

Vous pouvez append deux files audio en créant AVMutableCompositionTrack après avoir ajouté les deux files et exporté la composition à l'aide de la méthode AVAssetExportSession de AVAssetExportSession .

S'il vous plaît se référer ci-dessous des liens pour plus de détails.

Référence de la class AVAssetExportSession

Créer de nouveaux actifs

J'espère que cela aidera à résoudre votre problème.

Je n'ai pas un exemple de code complet mais les services de files audio étendus peuvent vous aider à concaténer deux files audio. Recherchez les services de files audio étendus dans Xcode ou visitez le lien ci-dessous.

Documentation Apple