Как записать аудио с фоновой музыкой? - PullRequest
1 голос
/ 11 ноября 2011

из последних нескольких дней я работаю над приложением для iphone, которое должно записывать аудио пользователя и сохранять его с фоновой музыкой, в простых словах путем добавления двух аудиофайлов генерировать третий аудиофайл, Я пытаюсь сделать это, используя AudioToolBox api, но безуспешно, может ли кто-нибудь подсказать мне правильное направление, куда можно обратиться за этим предложением, ???

Спасибо

Ответы [ 2 ]

2 голосов
/ 11 апреля 2013

Вы можете сделать это

- (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;


}
1 голос
/ 11 ноября 2011

Вы не найдете никакого готового инструмента для этого, но это не так сложно, как только вы закончите запись.После этого вам нужно будет смешать файл с фоновой музыкой, что можно сделать, просто добавив необработанные сэмплы вместе.

Чтобы эта часть работала, вам нужно будет либо декодировать фоновую музыку из чего угодносжатый формат, который вы используете для необработанного PCM, чтобы вы могли напрямую управлять сэмплами.Прошло много времени с тех пор, как я занимался разработкой для iOS, поэтому я не знаю, сможет ли iOS SDK сделать это напрямую или вам нужно будет связать libffmpeg с вашим кодом (или чем-то подобным).Но IIRC, iPhone поддерживает декодирование сжатого аудио в PCM, но не кодирует его (подробнее об этом в секунду).

В противном случае вы можете распространять сжатые файлы (в формате zip, а не в формате mp3 / aac / ogg / любой другой)) сырые файлы PCM с приложением и разархивируйте их для непосредственного получения данных сэмпла.

Как только вы получите окончательное сведение, вы можете передать его прямо через устройство воспроизведения в виде необработанного PCM.Если вам нужно сохранить или экспортировать его, вам нужно снова заглянуть в библиотеку декодирования / кодирования.

Если говорить об опыте по этому вопросу, вы, вероятно, захотите немного поработать над вокаломперед сведением с фоновой музыкой.Во-первых, вы хотите, чтобы фоновые дорожки были нормализованы до -3 дБ (или около того), чтобы голос пользователя был слышен поверх музыки.Во-вторых, вы должны применить фильтр высоких частот к вокалу, чтобы удалить все частоты ниже 60 Гц, так как микрофон iPhone может улавливать шум ветра или другие фоновые шумы.Наконец, вы, вероятно, захотите применить компрессию + лимитер к сэмплу вокала, чтобы во время тихих растяжек немного легче было слышать вокал.

К сожалению, вопрос, который вы задали, не так прост, как «просто используйте функцию».mixdownTracksTogether () ", но вы определенно можете добиться этого, соединяя вместе другие инструменты и функции.Надеюсь, что вы попадете на правильный путь!

...