如何合并iPhone中的实时流视频和音频sdk

问题描述:

我正在开发基于视频的应用程序在IOS中。在我的应用程序中,我需要合并视频和音频。我合并了本地视频和音频文件,但如果我尝试合并它们,则无法合并实时流式视频和音频,这意味着应用程序因持续时间而崩溃。对于合并我使用下面的代码如何合并iPhone中的实时流视频和音频sdk

-(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); 
    } 

请一些身体帮我

+0

尝试通过CMTimeRangeMake(kCMTimeZero,videoAsset.duration)在insetTimeRange compositionCommentaryTrack – BhushanVU 2013-03-06 10:05:13

+0

的应用程序,因为该行只有爵士崩溃的。该应用程序崩溃在下面的行[compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero,audioAsset.duration)ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0] atTime:kCMTimeZero error:nil]; – btmanikandan 2013-03-06 11:22:52

+0

原因虽然直播可能是我们没有得到正确的videoasset持续时间... – BhushanVU 2013-03-06 11:24:51

你是不是给正确的直播视频网址玩。

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

例如

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

[NSURL URLWithString:@“http://www.digdang.com/media/VideoFolde/017141.mp4”] AVURLAsset * videoAsset = [AVURLAsset URLAssetWithURL:url options:nil];虽然通过这也是我有同样的错误 – btmanikandan 2013-03-07 07:35:03

+0

有问题在网址你给...检查其中一个播放直播视频和检查你的链接的IOS教程... – BhushanVU 2013-03-07 07:47:23

+0

它在玩mpmovie球员和avplayer – btmanikandan 2013-03-07 08:16:21