如何在iphone sdk中合并直播视频和音频

时间:2013-03-06 09:56:48

标签: iphone ios avmutablecomposition

我正在开发IOS中基于视频的应用程序。在我的应用程序中,我需要合并视频和音频。我已合并本地视频和音频文件但我无法合并直播视频和音频,如果我尝试合并它们意味着应用程序因持续时间而崩溃。对于合并我使用以下代码

    -(void) playerFunction
    {
             NSURL *url = [NSURL URLWithString:@"http://www.digdang.com/media/VideoFolde/017141.mp4"];
    
//    NSURL *url = [NSURL URLWithString:@"http://www.educator.com:1935/mobile/mp4:testVideo.mp4/playlist.m3u8"];// these is totally not working
    
    
    
    NSString* audio_inputFileName = @"audio.mp3";
    NSString* audio_inputFilePath = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] resourcePath],audio_inputFileName];
    NSURL*    audiopath = [NSURL fileURLWithPath:audio_inputFilePath];

    NSString* videoName = @"output.mov";//outputdata
    NSString *savepath = [NSTemporaryDirectory() stringByAppendingPathComponent:videoName];
    
    NSFileManager *filemgr = [NSFileManager defaultManager];
    
    
    if ([filemgr fileExistsAtPath:savepath ] == YES){
        [[NSFileManager defaultManager] removeItemAtPath:savepath error:nil];
    }
    else
    {
        NSLog (@"File not found");
    }
    CMTime nextClipStartTime = kCMTimeZero;
    
    AVMutableComposition* mixComposition = [AVMutableComposition composition];
    NSDictionary *options = @{ AVURLAssetPreferPreciseDurationAndTimingKey : @YES };
    AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:url options:options];
    AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL: audiopath options:options];
    CMTimeRange video_timeRange = CMTimeRangeMake(kCMTimeZero,videoAsset.duration);
    AVMutableCompositionTrack *a_compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    NSLog(@"%@",[videoAsset tracksWithMediaType:AVMediaTypeVideo]);
    NSLog(@"%@",[audioAsset tracksWithMediaType:AVMediaTypeAudio]);
    NSLog(@"%f", CMTimeGetSeconds(videoAsset.duration));
    [a_compositionVideoTrack insertTimeRange:video_timeRange ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] atTime:kCMTimeZero error:nil];
    [a_compositionVideoTrack scaleTimeRange:video_timeRange toDuration:audioAsset.duration];
    
    CMTimeRange audio_timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration);
    AVMutableCompositionTrack *b_compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    [b_compositionAudioTrack insertTimeRange:audio_timeRange ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:nextClipStartTime error:nil];
    
    
    
    AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetLowQuality];
    _assetExport.shouldOptimizeForNetworkUse = YES;
    _assetExport.outputFileType = @"com.apple.quicktime-movie";
    
  
    NSURL    *savetUrl = [NSURL fileURLWithPath:savepath];

    _assetExport.outputURL = savetUrl;
    _assetExport.timeRange = CMTimeRangeMake(kCMTimeZero, audioAsset.duration);
    
    [_assetExport exportAsynchronouslyWithCompletionHandler:
     ^(void ) {
         switch (_assetExport.status)
         {
             case AVAssetExportSessionStatusCompleted:
                 //   export complete
                 
                 NSLog(@"Export Complete");
                 //------>>> // From Here I want play movie using MPMoviePlayerController.<<<---------
                 [self play];
//                 [self performSelector:@selector(play) withObject:nil afterDelay:2.0];
                 break;
             case AVAssetExportSessionStatusFailed:
                 NSLog(@"Export Failed");
                 NSLog(@"ExportSessionError: %@", [_assetExport.error localizedDescription]);
                 
                 //                export error (see exportSession.error)
                 break;
             case AVAssetExportSessionStatusCancelled:
                 NSLog(@"Export Failed");
                 NSLog(@"ExportSessionError: %@", [_assetExport.error localizedDescription]);
                 
                 //                export cancelled
                 break;
                 
         }
         
         
     }
     
     ];

    
    NSLog(@"savepath :%@",savepath);
    }

请一些人帮助我

1 个答案:

答案 0 :(得分:1)

您没有提供正确的直播视频网址。

在您的代码中,您已在文档目录中传递了本地视频URL。 NSString *fileNamePath1 = @"Egg_break.mov";而不是你应该从服务器传递一些URLString。

e.g。

AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL URLWithString:@"http://qtdevseed.apple.com/addemo/ad.m3u8"] options:nil];