Как добавить аудиофайл в фильм с помощью AVFoundation на iOS4? - PullRequest
5 голосов
/ 23 февраля 2011

Я использую AVFoundation для создания файла фильма (mp4) с использованием изображений и звуковых файлов.

Я успешно создал файл фильма, используя AVAssetWriterInputPixelBufferAdaptor, который добавляет CVPixelBufferRef (извлеченный из объектов UIImage) в файл фильма.

Теперь я хочу добавить звуковое содержимое из файла в этом фильме. Получение данных с микрофона устройства - это не то, о чем я думаю. И я не смог найти ничего похожего на AVAssetWriterInputPixelBufferAdaptor, который мог бы помочь записать аудиоданные в этот файл фильма.

Я что-то здесь упускаю?

Ответы [ 2 ]

5 голосов
/ 06 марта 2011

По крайней мере, для меня решение было использовать класс AVMutableComposition.

1) создать объект класса AVMutableComposition
2) создать 2 объекта класса AVURLAsset, первый на основе вашего видеофайла, а второй на основе файла, из которого вы хотите извлечь звуковую дорожку из
3) создать 2 объекта класса AVMutableCompositionTrack, как раньше, один с аудио дорожкой, второй с видео дорожкой (на основе соответствующих объектов активов из 2))
4) создать класс AVAssetExportSession на основе составного объекта из 1)
5) экспортировать вашу сессию

С уважением

2 голосов
/ 17 января 2018

Спасибо @peter.Вот решение в коде.

-(BOOL)compositeVideo{
    //Record cur video
    NSURL *curAudio = [[NSBundle mainBundle]URLForResource:@"a" withExtension:@".pcm"];
    NSURL *curVideo = [[NSBundle mainBundle]URLForResource:@"v" withExtension:@".mp4"];
    AVAsset *video = [AVAsset assetWithURL:curVideo];
    AVAsset *audio = [AVAsset assetWithURL:curAudio];
    AVAssetTrack *vTrack = [[video tracksWithMediaType:AVMediaTypeVideo] firstObject];
    NSArray *arr = [audio tracksWithMediaType:AVMediaTypeAudio];
    AVAssetTrack *aTrack = [arr firstObject];

    AVMutableComposition *composition = [AVMutableComposition composition];
    AVMutableCompositionTrack *visualTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:1];
    AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    NSError *error;
    [visualTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, video.duration) ofTrack:vTrack atTime:kCMTimeZero error:&error];
    if (error) {
        NSLog(@"video composition failed! error:%@", error);
        return NO;
    }
    [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audio.duration) ofTrack:aTrack atTime:kCMTimeZero error:&error];
    if (error) {
        NSLog(@"audio composition failed! error:%@", error);
        return NO;
    }

    AVAssetExportSession *exporter = [AVAssetExportSession exportSessionWithAsset:composition presetName:AVAssetExportPresetHighestQuality];
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    exporter.outputURL = [NSURL fileURLWithPath:[path stringByAppendingPathComponent:@"compositedVideo.mp4"]];
    [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
    exporter.outputFileType = AVFileTypeQuickTimeMovie;
    [exporter exportAsynchronouslyWithCompletionHandler:^{
        if (exporter.error) {
            NSLog(@"exporter synthesization failed! error:%@", error);
            [self.delegate compositeDidFinishAtURL:nil duration:-1];
        }else{
            [self.delegate compositeDidFinishAtURL:exporter.outputURL duration:CMTimeGetSeconds(video.duration)];
        }
    }];
    return YES;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...