2011-11-11 30 views
1

最後の数日私はユーザーのオーディオを録音し、その中にバックグラウンドミュージックを保存する必要があるiphoneアプリケーションで作業しています2つのオーディオファイルを追加することで簡単な言葉で3番目のオーディオファイルを生成します 私はそれをやろうとしますAudioToolBox APIを使用していますが、その中で成功していないと、いずれかの提案が私に正しい方向を示唆しています。バックグラウンドミュージックでオーディオを録音するには?

おかげで、

答えて

1

あなたはこれを行うための任意の事前圧延ツールを見つけることができませんが、あなたがダウンして記録ビットを得れば、それはあまりにも難しいことではありません。その後、生のサンプルを一緒に追加するだけで、ファイルをバックグラウンドミュージックとミックスする必要があります。

この部分が機能するには、使用している圧縮形式からバックグラウンドミュージックをデコードして、PCMを生かす必要があるため、サンプルを直接操作できます。私はiOSの開発を行って以来長い間経っていますので、iOS SDKがこれを直接行うことができるのか、libffmpegをあなたのコード(またはそれに似たもの)と共にバンドルする必要があるのか​​どうかはわかりません。しかしIIRCでは、iPhoneは圧縮されたオーディオのPCMへのデコードをサポートしていますが、エンコードはしていません。

そうでなければ、圧縮された(zip形式、mp3/aac/ogg/whateverの)生のPCMファイルをあなたのアプリに配布し、それらを解凍してサンプルデータを直接取得することができます。

最終的なミックスダウンが完了したら、生のPCMとして再生デバイスに直接戻すことができます。保存またはエクスポートする必要がある場合は、再度デコード/エンコードライブラリを参照する必要があります。

この問題の経験から言えば、背景音楽とミキシングする前に、基本的な処理をボーカルに施したいと思うかもしれません。まず、バックグラウンドトラックを-3dB(またはそれ以上)に正規化して、ユーザーの声が音楽に耳を傾けるようにします。次に、ハイパスフィルタをボーカルに適用して、60Hz以下の周波数をすべて除去してください。風やその他のバックグラウンドノイズは、iPhoneのマイクで拾うことができます。最後に、ボーカルサンプルにcompression + limiterを適用して、静かなストレッチの間にボーカルを少し聴きやすくしたい場合があります。

あなたが聞いた質問は、単に「mixdownTracksTogether()関数を使用する」とは単純ではありませんが、他のツールや関数を連鎖させることで間違いなく機能します。これが正しい軌道に乗ることを願っています!

2

あなたは

- (BOOL) combineVoices1 
{ 
    NSError *error = nil; 
    BOOL ok = NO; 


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 


    CMTime nextClipStartTime = kCMTimeZero; 
    //Create AVMutableComposition Object.This object will hold our multiple AVMutableCompositionTrack. 
    AVMutableComposition *composition = [[AVMutableComposition alloc] init]; 

    AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [compositionAudioTrack setPreferredVolume:0.8]; 
    NSString *soundOne =[[NSBundle mainBundle]pathForResource:@"test1" ofType:@"caf"]; 
    NSURL *url = [NSURL fileURLWithPath:soundOne]; 
    AVAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil]; 
    NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeAudio]; 
    AVAssetTrack *clipAudioTrack = [[avAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:clipAudioTrack atTime:kCMTimeZero error:nil]; 

    AVMutableCompositionTrack *compositionAudioTrack1 = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [compositionAudioTrack setPreferredVolume:0.3]; 
    NSString *soundOne1 =[[NSBundle mainBundle]pathForResource:@"test" ofType:@"caf"]; 
    NSURL *url1 = [NSURL fileURLWithPath:soundOne1]; 
    AVAsset *avAsset1 = [AVURLAsset URLAssetWithURL:url1 options:nil]; 
    NSArray *tracks1 = [avAsset1 tracksWithMediaType:AVMediaTypeAudio]; 
    AVAssetTrack *clipAudioTrack1 = [[avAsset1 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    [compositionAudioTrack1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset.duration) ofTrack:clipAudioTrack1 atTime:kCMTimeZero error:nil]; 


    AVMutableCompositionTrack *compositionAudioTrack2 = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
    [compositionAudioTrack2 setPreferredVolume:1.0]; 
    NSString *soundOne2 =[[NSBundle mainBundle]pathForResource:@"song" ofType:@"caf"]; 
    NSURL *url2 = [NSURL fileURLWithPath:soundOne2]; 
    AVAsset *avAsset2 = [AVURLAsset URLAssetWithURL:url2 options:nil]; 
    NSArray *tracks2 = [avAsset2 tracksWithMediaType:AVMediaTypeAudio]; 
    AVAssetTrack *clipAudioTrack2 = [[avAsset2 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 
    [compositionAudioTrack1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset2.duration) ofTrack:clipAudioTrack2 atTime:kCMTimeZero error:nil]; 



    AVAssetExportSession *exportSession = [AVAssetExportSession 
              exportSessionWithAsset:composition 
              presetName:AVAssetExportPresetAppleM4A]; 
    if (nil == exportSession) return NO; 

    NSString *soundOneNew = [documentsDirectory stringByAppendingPathComponent:@"combined10.m4a"]; 
    //NSLog(@"Output file path - %@",soundOneNew); 

    // configure export session output with all our parameters 
    exportSession.outputURL = [NSURL fileURLWithPath:soundOneNew]; // output path 
    exportSession.outputFileType = AVFileTypeAppleM4A; // output file type 

    // perform the export 
    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 

     if (AVAssetExportSessionStatusCompleted == exportSession.status) { 
      NSLog(@"AVAssetExportSessionStatusCompleted"); 
     } else if (AVAssetExportSessionStatusFailed == exportSession.status) { 
      // a failure may happen because of an event out of your control 
      // for example, an interruption like a phone call comming in 
      // make sure and handle this case appropriately 
      NSLog(@"AVAssetExportSessionStatusFailed"); 
     } else { 
      NSLog(@"Export Session Status: %d", exportSession.status); 
     } 
    }]; 


    return YES; 


} 
によってこれを行うことができます
関連する問題