書き出した動画ファイル(.mov/.mp4)に.音声(.mp3)をミックスしようと考えており、以下のようなコードで作成しましたが、うまくいきませんでした。動画を書き出してフォトライブラリに保存するところまでは確認済ですが、以下のようにミックスしたものをフォトライブラリに保存しようとするとうまくいきません。
具体的な結果としては、"writeVideoAtPathToSavedPhotosAlbum: completionBlock:^"のassetURLとerrorが両方nilになってしまいます。おそらくうまくミックスしたものがフォトライブラリに保存された場合はこれらの変数がnilになることはないと思いますが、私のコードのミス、またはうまく保存する方法が分かる方はぜひご教示願います。
Objective
1+ (void)saveMixedMovieInPhotoLibrary { 2 NSString *videoPath = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp/movie.mov"]; 3 NSURL *exportURL = [NSURL fileURLWithPath:videoPath]; 4 NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"music" ofType:@"mp3"]; 5 NSURL *soundURL = [NSURL fileURLWithPath:soundPath]; 6 7 AVMutableComposition *composition = [[AVMutableComposition alloc]init]; 8 AVURLAsset *video = [[AVURLAsset alloc]initWithURL:exportURL options:nil]; 9 AVAsset *audioAsset = [AVAsset assetWithURL:soundURL]; 10 11 // Merge movie and audio 12 AVMutableCompositionTrack *audioTrack = [composition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 13 14 [audioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, video.duration) 15 ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; 16 17 AVMutableCompositionTrack *composedTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 18 [composedTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, video.duration) 19 ofTrack:[[video tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] 20 atTime:kCMTimeZero error:nil]; 21 NSLog(@"%f", CMTimeGetSeconds(video.duration)); 22 23 // Export 24 AVAssetExportSession *assetExport = [[AVAssetExportSession alloc] initWithAsset:[AVAsset assetWithURL:exportURL] presetName:AVAssetExportPresetHighestQuality]; 25 if ([[NSFileManager defaultManager] fileExistsAtPath:videoPath]) { 26 [[NSFileManager defaultManager] removeItemAtPath:videoPath error:nil]; 27 } 28 29 assetExport.outputFileType = @"com.apple.quicktime-movie"; 30 assetExport.outputURL = exportURL; 31 assetExport.shouldOptimizeForNetworkUse = YES; 32 33 [assetExport exportAsynchronouslyWithCompletionHandler:^(void) { 34 NSLog(@"EXPORT STATUS == %@", assetExport.outputURL); 35 36 // Save to Library 37 ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init]; 38 [assetLibrary writeVideoAtPathToSavedPhotosAlbum:exportURL 39 completionBlock:^(NSURL *assetURL, NSError *assetError) { 40 if (assetError) { 41 NSLog(@"export error!!!!"); 42 }else { 43 BOOL isDirectory; 44 NSFileManager *manager = [NSFileManager defaultManager]; 45 if ([manager fileExistsAtPath:assetURL.absoluteString isDirectory: &isDirectory]) { 46 [manager removeItemAtPath:assetURL.absoluteString error:nil]; 47 NSLog(@"AssetURL is Already Exist."); 48 }else { 49 NSLog(@"AssetURL == %@", assetURL); 50 NSLog(@"Class == %@", [assetURL class]); 51 } 52 } 53 }]; 54 }]; 55}
あなたの回答
tips
プレビュー