1

I am developing an application which has a feature of recording. Now I need to edit it with another clip at specific time location. i.e I have recording of 20 secs, now want to replace it with another audio file at 10th sec with the duration of 5 secs, so my exported audio file will be like first 10sec is my recorded audio, 10th - 15th sec is the clip which I have to replace with original one, and then 15th - 20th sec is again my recorded file.

please help me to find any nearby solution

Thanks in advance.

Here is my code ` -(void)mergeAndSaveWithVideoURLAtFirstOffset:(CMTime)offset1 andSecondOffset:(CMTime)offset2 {

NSURL *video_url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Source" ofType:@"mp4"]];

AVMutableComposition* mixComposition = [AVMutableComposition composition];

NSURL *source_audio_url=[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Source" ofType:@"mp3"]];

NSURL *audio_url=[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Asteroid_Sound" ofType:@"mp3"]];

audioAsset = [[AVURLAsset alloc]initWithURL:audio_url options:nil];

source_audioAsset = [[AVURLAsset alloc]initWithURL:source_audio_url options:nil];

CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, source_audioAsset.duration);

AVMutableCompositionTrack *b_compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];

[b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[source_audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil];

audio_timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration);

[b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:offset1 error:nil];

[b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:offset2 error:nil];

videoAsset = [[AVURLAsset alloc]initWithURL:video_url options:nil];

CMTimeRange video_timeRange = CMTimeRangeMake(kCMTimeZero,videoAsset.duration);

AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

[a_compositionVideoTrack insertTimeRange:video_timeRange ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
NSString *outputFilePath = [docsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"FinalVideo.mov"]];
NSURL *outputFileUrl = [NSURL fileURLWithPath:outputFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath])
    [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil];

AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
_assetExport.outputFileType = @"com.apple.quicktime-movie";
_assetExport.outputURL = outputFileUrl;

[_assetExport exportAsynchronouslyWithCompletionHandler:
 ^(void ) {
     dispatch_async(dispatch_get_main_queue(), ^{
         [self exportDidFinish:_assetExport];
     });
 }];

}`

Maulik D
  • 17
  • 3
  • Could you please elaborate what exactly you have done to solve the problem on your own behalf and in which way the expected outcome differs from the actual? It's really hard to tell from just some tossed-in code. – Paul Kertscher Feb 06 '17 at 10:59

1 Answers1

0

You have to first trim audio from particular offset may be this url will be helpfull you.

iOS Audio Trimming

After then merge your another audio.

Community
  • 1
  • 1
saurabh rathod
  • 1,090
  • 7
  • 7