2012-06-24 48 views
0

我正在開發一個ios音頻應用程序在xcode上,我試圖使用2個音頻文件我記錄 - 這是在同一時間播放並將其導出到一個音頻文件。 我所做的一切都是將2個音頻文件合併爲一個音頻文件,但是這兩個音頻播放的是一個接一個,而不是同時播放。 有沒有人有線索我怎麼能解決它? 謝謝導出2個音軌(同時運行)到一個文件m4a)

回答

1

你應該看看這個AAC轉換(http://atastypixel.com/blog/easy-aac-compressed-audio-conversion-on-ios/)。這是非常有用的。

您可能想要考慮的另一件事是......將兩個音頻信號合併在一起很容易。所以你可以做什麼是:

打開兩個錄音,並獲得一個數組爲每個錄音保存音頻樣本。

使一個for()循環,增加了每個樣品,並將其放在一個輸出陣列

for(int i = 0; i<numberOfSamples; i++) { 
    exportBuffer[i] = firstTrack[i] + secondTrack[i]; 
} 

然後寫exportBuffer到M4A文件。

如果兩個文件的長度完全相同,則此代碼僅適用於您的需要。如果您已達到其中一個數組的末尾,則需要添加一個條件。在這種情況下,只需加0即可。

+0

謝謝@Kpmuphy您的評論實際上拯救了我! – Papito

+0

沒問題!我應該添加的一件事是...如果兩個音頻文件都足夠大,你可能會在結果文件上產生失真,所以你可能想做類似這樣的事情:exportBuffer [i] = firstTrack [i] * 0.5 + secondTrack [i] * 0.5 我認爲這只是一個有效的擔憂,如果您使用整數來表示音頻樣本,但需要考慮的事項。 – Kpmurphy91

+0

感謝隊友我們實際上最終使用了Michael Tylor的API(您提供給我們的那個人),他非常棒,我們最終成功完成了2個音頻的在線導出。現在我們正試圖弄清楚我們該如何讓它脫機。 – Papito

1

嘗試Apple的MixerHost示例應用程序。

+0

感謝您feedback.I做管理的同時播放兩個音頻文件實現此方法。我無法設法將其導出到一個文件。在「Mixerhost」上找不到任何關於導出的內容 – Papito

+0

看看是否有幫助: http://stackoverflow.com/questions/7118429/how-to-record-sound-produced-by-mixer-unit-output-ios- core-audio-audio-graph – user523234

+0

謝謝。這可能有助於 – Papito

-1

/*如果您已經保存您錄製的音頻文件*/

-(void)mixAudio{ 
AVMutableComposition *composition = [[AVMutableComposition alloc] init]; 

AVMutableCompositionTrack *compositionAudioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 
[compositionAudioTrack setPreferredVolume:0.8]; 
NSString *soundOne =[[NSBundle mainBundle]pathForResource:@"RecordAudio1" ofType:@"wav"]; 
NSURL *url = [NSURL fileURLWithPath:soundOne]; 
AVAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil]; 
NSArray *tracks = [avAsset tracksWithMediaType:AVMediaTypeAudio]; 
AVAssetTrack *clipAudioTrack = [tracks 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.8]; 
NSString *soundOne1 =[[NSBundle mainBundle]pathForResource:@"RecordAudio2" ofType:@"wav"]; 
NSURL *url1 = [NSURL fileURLWithPath:soundOne1]; 
AVAsset *avAsset1 = [AVURLAsset URLAssetWithURL:url1 options:nil]; 
NSArray *tracks1 = [avAsset1 tracksWithMediaType:AVMediaTypeAudio]; 
AVAssetTrack *clipAudioTrack1 = [tracks1 objectAtIndex:0]; 
[compositionAudioTrack1 insertTimeRange:CMTimeRangeMake(kCMTimeZero, avAsset1.duration) ofTrack:clipAudioTrack1 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); 
    } 
}]; 
}