【问题标题】:How To merge Audio and Video in ios如何在ios中合并音频和视频
【发布时间】:2013-03-01 04:31:17
【问题描述】:

我喜欢使用 AVMutableComposition 在应用程序中合并音频和视频,并且我在应用程序中使用了以下代码,但我能够获取输出数据。

-(void) playerFunction
{
    NSString  *fileNamePath = @"mexicanDance.mp3";//myaudio
    NSArray   *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString  *documentsDirectory = [paths  objectAtIndex:0];
    NSString  *oldappSettingsPath = [documentsDirectory stringByAppendingPathComponent:fileNamePath];
    NSURL *audioUrl = [NSURL fileURLWithPath:oldappSettingsPath];
    NSString  *fileNamePath1 = @"Egg_break.mov";//my video
    NSArray   *paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString  *documentsDirectory1 = [paths1  objectAtIndex:0];
    NSString  *oldappSettingsPath1 = [documentsDirectory1 stringByAppendingPathComponent:fileNamePath1];
    NSLog(@"oldpath=%@",oldappSettingsPath);
    NSURL *videoUrl = [NSURL fileURLWithPath:oldappSettingsPath1];
//    if (avPlayer.duration >0.00000)
//    {
        NSLog(@"SOMEDATA     IS THERE ");
        AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audioUrl options:nil];
        AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoUrl options:nil];

        AVMutableComposition* mixComposition = [AVMutableComposition composition];

        NSLog(@"audio =%@",[audioAsset tracksWithMediaType:AVMediaTypeAudio]);
    NSLog(@"Video =%@",[videoAsset tracksWithMediaType:AVMediaTypeVideo]);

        AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    NSLog(@"%@",compositionCommentaryTrack);
        [compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.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];


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

        NSString* videoName = @"output.mp4";//outputdata

        NSString *exportPath = [NSTemporaryDirectory() stringByAppendingPathComponent:videoName];
        NSURL    *exportUrl = [NSURL fileURLWithPath:exportPath];

        if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath])
        {
            [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
        }

        _assetExport.outputFileType = @"com.apple.quicktime-movie";
        NSLog(@"file type %@",_assetExport.outputFileType);
        _assetExport.outputURL = exportUrl;
        _assetExport.shouldOptimizeForNetworkUse = YES;



        [_assetExport exportAsynchronouslyWithCompletionHandler:
         ^(void )
         {

             NSString  *fileNamePath = @"sound_record.mov";
             NSArray   *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
             NSString  *documentsDirectory = [paths  objectAtIndex:0];
             NSString  *oldappSettingsPath = [documentsDirectory stringByAppendingPathComponent:fileNamePath];


             //             if ([[NSFileManager defaultManager] fileExistsAtPath:oldappSettingsPath]) {
             //
             //                 NSFileManager *fileManager = [NSFileManager defaultManager];
             //                 [fileManager removeItemAtPath: oldappSettingsPath error:NULL];
             //
             //             }
             NSURL *documentDirectoryURL = [NSURL fileURLWithPath:oldappSettingsPath];
             [[NSFileManager defaultManager] copyItemAtURL:exportUrl toURL:documentDirectoryURL error:nil];
             [audioAsset release];
             [videoAsset release];
             [_assetExport release];
         }       
         ];

//}
    video = [[MPMoviePlayerController alloc] init];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        video.view.frame = CGRectMake(0, 0, 768, 1004);
    else
        video.view.frame = CGRectMake(0, 0, 320, 460);

    NSString * audioPath=[[NSBundle mainBundle] pathForResource:@"output" ofType:@"mp4"];
    [video setContentURL:[NSURL fileURLWithPath:audioPath]];

    [video prepareToPlay];
    [video play];
    [self.view addSubview:video.view];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stopAudio)
                                                 name:MPMoviePlayerPlaybackDidFinishNotification object:video];

    [video setFullscreen:YES];
}

但是这段代码对我不起作用,因为 AVURLAsset 都给我丢了空集。我不知道是什么错误。有人可以帮助解决这个问题

提前致谢

【问题讨论】:

  • 或许可以试试[AVURLAsset URLAssetWithURL: ... ]?文件路径打印正确吗?
  • 感谢您的回复先生。如何在文档目录sir中添加输出
  • 貌似你把AVAssetExporter的输出URL设置为临时目录,直接设置到documents目录就好了!无需将其写入临时目录,然后尝试将其复制到 docs 目录。
  • 如果我尝试播放 output.mp4 就会崩溃,先生
  • 如果AVAssetExportSessionoutputURL 设置为output.mp4,请确保该文件实际上有数据。还要确保在尝试写入之前擦除该文件路径中的所有文件,因为AVAssetExportSession 不会覆盖。

标签: ios ios4 avmutablecomposition avasset


【解决方案1】:

确保您的两个(音频和视频)文件都有正确的扩展名,并且它的持续时间不应为空,我们可以在使用之前检查一下

if ([[_videoAsset tracksWithMediaType:AVMediaTypeVideo]count]!=0)
{
 // write code here to add video in composition. you can check same for audio too.
}

【讨论】:

    【解决方案2】:

    @btmanikandan 用于从服务器加载文件,请将文件数据(NSdata)保存到临时。来自服务器的文档目录,然后从那里合并。合并从文档目录中删除文件后。希望对你有帮助!!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多