将选定的音乐文件集成到视频中

发布于 2024-11-09 12:04:41 字数 76 浏览 0 评论 0原文

我正在开发一个视频录制应用程序,我希望能够集成用户从 iPod 库中选择的音乐文件。请分享您对我如何实现这一要求的意见。示例代码很有帮助。

I am developing a video recording application and I would like to be able to integrate a music file selected by the user from the iPod library. Please share your inputs as to how I can achieve this requirement. Sample code is helpful.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

娇柔作态 2024-11-16 12:04:41

最终成功将选定的音乐文件集成到视频中

使用 AVAssetExportSession 我们可以使用 AVMutableComposition 将视频和音频合并在一起。

谢谢大家更新!!

//该方法合并音频和视频。

- (void)mergeAudioAtUrl:(NSURL *)audioUrl withVideoAtUrl:(NSURL *)videoUrl toUrl:(NSURL *)outputUrl
  {

//_imageCaptureCount = [_imagesArray count]*100;

AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil];
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];

AVMutableComposition* mixComposition = [AVMutableComposition composition];


if([[audioAsset tracksWithMediaType:AVMediaTypeAudio] count])
{
    AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio 
                                                                                        preferredTrackID:kCMPersistentTrackID_Invalid];

    [compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
                                        ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] 
                                         atTime:kCMTimeZero error:nil];
}
AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo 
                                                                               preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
                               ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] 
                                atTime:kCMTimeZero error:nil];

[audioAsset release];
[videoAsset release];

AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition 
                                                                      presetName:AVAssetExportPresetPassthrough];   

NSURL    *exportUrl = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/Documents/%@Video.mp4", NSHomeDirectory(),pcNameString]];

if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithFormat:@"%@/Documents/%@Video.mp4", NSHomeDirectory(),pcNameString]]) 
{
    [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@/Documents/%@Video.mp4", NSHomeDirectory(),pcNameString] error:nil];
}

_assetExport.outputFileType = @"com.apple.quicktime-movie"; //com.apple.m4v-video
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;

[_assetExport exportAsynchronouslyWithCompletionHandler:
 ^(void ) {      
     // your completion code here
    // NSLog(@"completed");

     removeProgresBarFlag = YES;


    /* NSString* savedVideoFilePath = [NSString stringWithFormat:@"%@/Documents/PC%d.mp4", NSHomeDirectory(),[videosListArray count]];

     if(UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(savedVideoFilePath))
     {
         [[UIApplication sharedApplication]beginIgnoringInteractionEvents];
         UISaveVideoAtPathToSavedPhotosAlbum(savedVideoFilePath, self, nil, nil);
         [[UIApplication sharedApplication]endIgnoringInteractionEvents];

     } */


     NSMutableDictionary* videoDetailDict = [[NSMutableDictionary alloc] initWithCapacity:0];

     NSStringEncoding encoding;
     NSError* error;

     NSString * persistentID;
     NSFileManager* fileManager = [NSFileManager defaultManager];

     if([fileManager fileExistsAtPath:PRESENTSONGS_FILE_PATH])
         persistentID = [NSString stringWithContentsOfFile:PRESENTSONGS_FILE_PATH usedEncoding:&encoding error:&error];
     else 
         persistentID = @"";

     [videoDetailDict setObject:persistentID forKey:KSong];

     if([fileManager fileExistsAtPath:PRESENTIMAGES_FILE])
     {

         NSMutableArray* currentImagesArray = [[NSMutableArray alloc] initWithContentsOfFile:IMAGESDATA_FILE_PATH];
         NSMutableArray* durationArray = [[NSMutableArray alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/videoduration.plist", [[NSBundle mainBundle] resourcePath]]];
         [videoDetailDict setObject:[durationArray objectAtIndex:[currentImagesArray count]-1] forKey:KfileSize];
         [durationArray release];


         [videoDetailDict setObject:currentImagesArray forKey:KImagesList];
         if([fileManager fileExistsAtPath:TEMPVIDEO_FILE_PATH])
         [fileManager removeItemAtPath:TEMPVIDEO_FILE_PATH error:nil];

         NSString* mainPath;

             mainPath = [NSString stringWithFormat:@"%@/Documents/%@File",NSHomeDirectory(),pcNameString];

         if([fileManager fileExistsAtPath:mainPath])
             [fileManager removeItemAtPath:mainPath error:nil];

         [fileManager createDirectoryAtPath:mainPath withIntermediateDirectories:NO attributes:nil error:nil];


         for(int i=0;i<[currentImagesArray count];i++)
         {
             [fileManager copyItemAtPath:[NSString stringWithFormat:@"%@%@",PRESENTIMAGES_FILE,[currentImagesArray objectAtIndex:i]] toPath:[NSString stringWithFormat:@"%@/%@",mainPath,[currentImagesArray objectAtIndex:i]] error:nil];
         }
         [currentImagesArray release];

     }

     if([fileManager fileExistsAtPath:KMESSAGE_FILEPATH])
     {
         NSMutableDictionary* currentMessageDictioanry = [[NSMutableDictionary alloc] initWithContentsOfFile:KMESSAGE_FILEPATH];
         [videoDetailDict setObject:currentMessageDictioanry forKey:Kmessage];
         [currentMessageDictioanry release];
     }

     [videoDetailDict setObject:pcNameString forKey:KPostCardName]; //[NSString stringWithFormat:@"PostCard Video%d",[videosListArray count]]
     //[videosListArray insertObject:videoDetailDict atIndex:0];
     [videosListArray addObject:videoDetailDict];
     [videoDetailDict release];
     [videosListArray writeToFile:VIDEOS_FILE_PATH atomically:YES];

 }       
 ];
}

Finally succeeded Integrate a selected music file into video

Using AVAssetExportSession we can merge Video and audio together using AVMutableComposition.

Thanks for update all of you!!

//This method merges the audio and video.

- (void)mergeAudioAtUrl:(NSURL *)audioUrl withVideoAtUrl:(NSURL *)videoUrl toUrl:(NSURL *)outputUrl
  {

//_imageCaptureCount = [_imagesArray count]*100;

AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil];
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];

AVMutableComposition* mixComposition = [AVMutableComposition composition];


if([[audioAsset tracksWithMediaType:AVMediaTypeAudio] count])
{
    AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio 
                                                                                        preferredTrackID:kCMPersistentTrackID_Invalid];

    [compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
                                        ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] 
                                         atTime:kCMTimeZero error:nil];
}
AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo 
                                                                               preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
                               ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] 
                                atTime:kCMTimeZero error:nil];

[audioAsset release];
[videoAsset release];

AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition 
                                                                      presetName:AVAssetExportPresetPassthrough];   

NSURL    *exportUrl = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/Documents/%@Video.mp4", NSHomeDirectory(),pcNameString]];

if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithFormat:@"%@/Documents/%@Video.mp4", NSHomeDirectory(),pcNameString]]) 
{
    [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@/Documents/%@Video.mp4", NSHomeDirectory(),pcNameString] error:nil];
}

_assetExport.outputFileType = @"com.apple.quicktime-movie"; //com.apple.m4v-video
_assetExport.outputURL = exportUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;

[_assetExport exportAsynchronouslyWithCompletionHandler:
 ^(void ) {      
     // your completion code here
    // NSLog(@"completed");

     removeProgresBarFlag = YES;


    /* NSString* savedVideoFilePath = [NSString stringWithFormat:@"%@/Documents/PC%d.mp4", NSHomeDirectory(),[videosListArray count]];

     if(UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(savedVideoFilePath))
     {
         [[UIApplication sharedApplication]beginIgnoringInteractionEvents];
         UISaveVideoAtPathToSavedPhotosAlbum(savedVideoFilePath, self, nil, nil);
         [[UIApplication sharedApplication]endIgnoringInteractionEvents];

     } */


     NSMutableDictionary* videoDetailDict = [[NSMutableDictionary alloc] initWithCapacity:0];

     NSStringEncoding encoding;
     NSError* error;

     NSString * persistentID;
     NSFileManager* fileManager = [NSFileManager defaultManager];

     if([fileManager fileExistsAtPath:PRESENTSONGS_FILE_PATH])
         persistentID = [NSString stringWithContentsOfFile:PRESENTSONGS_FILE_PATH usedEncoding:&encoding error:&error];
     else 
         persistentID = @"";

     [videoDetailDict setObject:persistentID forKey:KSong];

     if([fileManager fileExistsAtPath:PRESENTIMAGES_FILE])
     {

         NSMutableArray* currentImagesArray = [[NSMutableArray alloc] initWithContentsOfFile:IMAGESDATA_FILE_PATH];
         NSMutableArray* durationArray = [[NSMutableArray alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/videoduration.plist", [[NSBundle mainBundle] resourcePath]]];
         [videoDetailDict setObject:[durationArray objectAtIndex:[currentImagesArray count]-1] forKey:KfileSize];
         [durationArray release];


         [videoDetailDict setObject:currentImagesArray forKey:KImagesList];
         if([fileManager fileExistsAtPath:TEMPVIDEO_FILE_PATH])
         [fileManager removeItemAtPath:TEMPVIDEO_FILE_PATH error:nil];

         NSString* mainPath;

             mainPath = [NSString stringWithFormat:@"%@/Documents/%@File",NSHomeDirectory(),pcNameString];

         if([fileManager fileExistsAtPath:mainPath])
             [fileManager removeItemAtPath:mainPath error:nil];

         [fileManager createDirectoryAtPath:mainPath withIntermediateDirectories:NO attributes:nil error:nil];


         for(int i=0;i<[currentImagesArray count];i++)
         {
             [fileManager copyItemAtPath:[NSString stringWithFormat:@"%@%@",PRESENTIMAGES_FILE,[currentImagesArray objectAtIndex:i]] toPath:[NSString stringWithFormat:@"%@/%@",mainPath,[currentImagesArray objectAtIndex:i]] error:nil];
         }
         [currentImagesArray release];

     }

     if([fileManager fileExistsAtPath:KMESSAGE_FILEPATH])
     {
         NSMutableDictionary* currentMessageDictioanry = [[NSMutableDictionary alloc] initWithContentsOfFile:KMESSAGE_FILEPATH];
         [videoDetailDict setObject:currentMessageDictioanry forKey:Kmessage];
         [currentMessageDictioanry release];
     }

     [videoDetailDict setObject:pcNameString forKey:KPostCardName]; //[NSString stringWithFormat:@"PostCard Video%d",[videosListArray count]]
     //[videosListArray insertObject:videoDetailDict atIndex:0];
     [videosListArray addObject:videoDetailDict];
     [videoDetailDict release];
     [videosListArray writeToFile:VIDEOS_FILE_PATH atomically:YES];

 }       
 ];
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文