2015-04-22 7 views
0

У меня есть приложение, которое воспроизводит аудио, а также записывает видео + аудио во время воспроизведения этого звука. Я хотел бы выяснить способ обработки видео, чтобы звук, который был выбран микрофоном, удаляется из полученного видео.iOS Удалить конкретный звук из видео

Например, если я играю audioA, а затем записываю видео B с аудиовходом (от микрофона), я хочу как-то отменить audioA из результирующего аудио B, так что audioB - это только окружающий шум, а не шум от громкоговорителей устройства.

Любая идея, если есть способ сделать это?

Бонусные баллы, если это можно сделать без какой-либо автономной обработки.

ответ

0

Вы должны иметь дело с частью воспроизведения. Но вот код для смешивания выбранного аудио в записанное видео.

- (void)mixAudio:(AVAsset*)audioAsset startTime:(CMTime)startTime withVideo:(NSURL*)inputUrl affineTransform:(CGAffineTransform)affineTransform toUrl:(NSURL*)outputUrl outputFileType:(NSString*)outputFileType withMaxDuration:(CMTime)maxDuration withCompletionBlock:(void(^)(NSError *))completionBlock { 
    NSError * error = nil; 
    AVMutableComposition * composition = [[AVMutableComposition alloc] init]; 

    AVMutableCompositionTrack * videoTrackComposition = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 

    AVMutableCompositionTrack * audioTrackComposition = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

    AVURLAsset * fileAsset = [AVURLAsset URLAssetWithURL:inputUrl options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:AVURLAssetPreferPreciseDurationAndTimingKey]]; 

    NSArray * videoTracks = [fileAsset tracksWithMediaType:AVMediaTypeVideo]; 

    CMTime duration = ((AVAssetTrack*)[videoTracks objectAtIndex:0]).timeRange.duration; 

    if (CMTIME_COMPARE_INLINE(duration, >, maxDuration)) { 
     duration = maxDuration; 
    } 

    for (AVAssetTrack * track in [audioAsset tracksWithMediaType:AVMediaTypeAudio]) { 
     [audioTrackComposition insertTimeRange:CMTimeRangeMake(startTime, duration) ofTrack:track atTime:kCMTimeZero error:&error]; 

     if (error != nil) { 
      completionBlock(error); 
      return; 
     } 
    } 

    for (AVAssetTrack * track in videoTracks) { 
     [videoTrackComposition insertTimeRange:CMTimeRangeMake(kCMTimeZero, duration) ofTrack:track atTime:kCMTimeZero error:&error]; 

     if (error != nil) { 
      completionBlock(error); 
      return; 
     } 
    } 

    videoTrackComposition.preferredTransform = affineTransform; 

    AVAssetExportSession * exportSession = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetPassthrough]; 
    exportSession.outputFileType = outputFileType; 
    exportSession.shouldOptimizeForNetworkUse = YES; 
    exportSession.outputURL = outputUrl; 

    [exportSession exportAsynchronouslyWithCompletionHandler:^ { 
     NSError * error = nil; 
     if (exportSession.error != nil) { 
      NSMutableDictionary * userInfo = [NSMutableDictionary dictionaryWithDictionary:exportSession.error.userInfo]; 
      NSString * subLocalizedDescription = [userInfo objectForKey:NSLocalizedDescriptionKey]; 
      [userInfo removeObjectForKey:NSLocalizedDescriptionKey]; 
      [userInfo setObject:@"Failed to mix audio and video" forKey:NSLocalizedDescriptionKey]; 
      [userInfo setObject:exportSession.outputFileType forKey:@"OutputFileType"]; 
      [userInfo setObject:exportSession.outputURL forKey:@"OutputUrl"]; 
      [userInfo setObject:subLocalizedDescription forKey:@"CauseLocalizedDescription"]; 

      [userInfo setObject:[AVAssetExportSession allExportPresets] forKey:@"AllExportSessions"]; 

      error = [NSError errorWithDomain:@"Error" code:500 userInfo:userInfo]; 
     } 

     completionBlock(error); 
    }]; 
} 
+0

Похоже, классный проект, но я не вижу на первый взгляд, как делать то, что я предлагаю. – Liron

+0

Я не думаю, что вы понимаете мой вопрос. У меня есть совместное видео и аудио. Проблема заключается в том, что запись также включает в себя окружающий шум, выходящий из динамиков (который является звуком, который я воспроизвожу в приложении). Я хочу, чтобы какой-то способ шумоподавлять этот звук из окончательной записи. – Liron

+0

Так сказать, другими словами. Представьте, что мое приложение воспроизводит Моцарт у динамиков и в то же время записывает пользователь, говорящий что-то. Я хочу, чтобы эта запись каким-то образом не включала Mozart, хотя микрофон подбирает ее. – Liron