OGeek|极客世界-中国程序员成长平台

标题: iphone - 如何在 iphone sdk 中合并实时流媒体视频和音频 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 09:26
标题: iphone - 如何在 iphone sdk 中合并实时流媒体视频和音频

我正在 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 optionsptions];
    AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL: audiopath optionsptions];
    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 performSelectorselector(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);
    }

请一些人帮助我



Best Answer-推荐答案


您没有提供正确的实时视频 URL 来播放。

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

例如

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

关于iphone - 如何在 iphone sdk 中合并实时流媒体视频和音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15244041/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4