使用AVCaptureManager在iPhone上录制时创建短视频文件序列

时间:2013-04-08 13:31:02

标签: iphone objective-c avcapturesession

这是我的第一个问题,对于错误和不清楚的描述感到抱歉。 我正在开发一个在循环中捕获视频并在后台将它们发送到服务器的应用程序。 我想将它发送为单独的文件(post-request),然后将它们连接到服务器端的1。

我在使用AVframework方面不是很有经验。所以作为基础 - 使用AVCam project,并为我的功能修改它。 我现在需要解决这类问题。 我正在寻找一种方法如何记录每个2mb附近的短视频文件,然后将它们上传到服务器中。我得到的主要问题 - 连接后视频部分之间的延迟。以及如何在不停止录音机的情况下获得这些视频组件。

尝试一些事情。首先 - 使用定时器记录20秒片段,停止计时器,并打造新的记录周期。 第二。我的想法是使用AVURLAsset(用于获取临时目录中的当前录制视频文件),并通过AVAssetExportSession获取最后未保存的视频数据的持续时间。它似乎有效,我可以录制几个视频,但它们之间又有冻结,每个视频持续1-2秒 - 只有1张图片。因此,连接后看起来不像是一部电影。

-(void) startRecording
            {
                self.videoCounter=0;
                self.videoTimer=[NSTimer scheduledTimerWithTimeInterval:lenghtTimer target:self selector:@selector(endRecoringVideo) userInfo:nil repeats:YES] ;
                NSLog(@"timer started");
            }
            if ([[UIDevice currentDevice] isMultitaskingSupported]) {
                [self setBackgroundRecordingID:[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]];
            }
            [self removeFile:[[self recorder] outputFileURL]];
            [[self recorder] startRecordingWithOrientation:orientation];
        }

-(void)saveVideoPart
    {
        NSUInteger count = 0;
        NSString *filePath = nil;
        do {
            NSString *fileName = [NSString stringWithFormat:@"buf-%@-%u", AVAssetExportPresetLowQuality, count];
            filePath = NSTemporaryDirectory();
            filePath = [filePath stringByAppendingPathComponent:fileName];
            filePath = [filePath stringByAppendingPathExtension:@"mov"];
            count++;

        } while ([[NSFileManager defaultManager] fileExistsAtPath:filePath]);

        NSURL *outputURL = [NSURL fileURLWithPath:filePath];

        AVURLAsset *videoAsset = [AVURLAsset URLAssetWithURL:[self tempFileURL] options:nil];

        AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:videoAsset presetName:AVAssetExportPresetHighestQuality];
        exportSession.outputURL = outputURL;
        exportSession.outputFileType = AVFileTypeQuickTimeMovie;


        Float64 durationSeconds = CMTimeGetSeconds([videoAsset duration]);


        CMTime start;
        CMTime duration;

        start = CMTimeMakeWithSeconds(self.videoCounter, 1);
        duration = CMTimeMakeWithSeconds(durationSeconds-self.videoCounter, 1);
        self.videoCounter+=durationSeconds-self.videoCounter;
         NSLog(@"duration video %f,recorded %f",durationSeconds,self.videoCounter);

        CMTimeRange range = CMTimeRangeMake(start, duration);
        exportSession.timeRange = range;

        [exportSession exportAsynchronouslyWithCompletionHandler:^{
            switch (exportSession.status) {
                case AVAssetExportSessionStatusCompleted:
                     NSLog(@"Exported");
                     break;
                case AVAssetExportSessionStatusFailed:
                    //
                    NSLog(@"Failed:%@",exportSession.error);
                    break;
                case AVAssetExportSessionStatusCancelled:
                    //
                    NSLog(@"Canceled:%@",exportSession.error);
                    break;
                default:
                    break;
            }
        }];
    }

所以如果你提出算法或向我展示正确的方向,我会很高兴。主要适用于我 - 在录制时将视频分割为部分。作为一个例子,视频可能接近10分钟而没有暂停,我需要在背景中制作一些2mb长的部分,然后上传它们。

0 个答案:

没有答案