2011-02-23 14 views
5

Görüntüleri ve ses dosyalarını kullanarak bir film dosyası (mp4) oluşturmak için AVFoundation kullanıyorum.iOS4'te AVFoundation kullanarak filmde ses dosyası içerikleri nasıl eklenir?

Film dosyasında CVPixelBufferRef (UIImage nesnelerinden atılan) ekleyen AVAssetWriterInputPixelBufferAdaptor kullanarak film dosyasını başarıyla oluşturdum.

Şimdi, bu filmdeki bir dosyadan ses içeriği eklemek istiyorum. Cihaz mikrofonundan veri almak, burada düşündüğüm şey değil. Ve AVAssetWriterInputPixelBufferAdaptor'a benzer bir şey bu film dosyasına ses verilerinin yazılmasına yardımcı olabilecek bir şey bulamadım.

Burada bir şey mi özlüyorum?

+0

Çok benzer bir sorunum var. Uygulamamda, kamera rulo dizininde saklanan video dosyasına (doğrudan piksel erişimi kullanılarak yapılan bazı değişikliklerle) dayalı bir film oluşturdum. Bunun için AVAsset/AVAssetReader/AVAssetWriter sınıflarını ve ilgili kullanmıştım. Şu an sahip olduğum tek sorun, filmimin yalnızca video verileri olmak üzere herhangi bir ses parçası içermiyor olmasıdır. Orijinal video dosyasından gelen filmime ses parçasını "eklemek" istiyorum. Bazı nedenlerden dolayı video yazarken bunu yapamadım, şimdi video dönüştürme işlemi tamamlandıktan sonra bunu yapmanın bir yolunu arıyorum. – peter

cevap

5

En azından benim için çözüm AVMutableComposition sınıfını kullanmaktı.

1)) AVMutableComposition sınıf nesnesi
2 oluşturmak 2 AVURLAsset sınıf nesneleri oluşturmak, ilk video dosyasını temel ve
3'ten ses ayıklamak istediğiniz dosyanın dayalı ikinci) AVMutableCompositionTrack 2 oluşturmak ses parçasıyla biri önce, video izinin ile ikincisi gibi sınıf nesneleri,

oturumunuz ihracat 1'den kompozisyon nesne)
5) dayalı AVAssetExportSession sınıf oluşturmak)
4) (uygun varlıklara dayalı 2'den nesneleri)

Saygılarımızla

0

Teşekkür ederiz @peter. İşte kod çözüm.

-(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; 
} 
İlgili konular