2

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

我在使用 AVframework 方面不是很有经验。所以作为一个基础使用的AVCam 项目,并根据我的功能对其进行修改。我现在需要解决这样的问题。我正在寻找一种方法如何录制每个 2mb 左右的短视频文件,然后将它们上传到服务器。我遇到的主要问题 - 连接后视频部分之间的延迟。以及如何在不停止录像机的情况下获取此视频部分。

尝试很少的东西。首先 - 使用计时器记录 20 秒片段,按计时器停止,并开始新的记录周期。第二。我的想法是使用 AVURLAsset(用于在临时目录中获取当前录制的视频文件)并通过 AVAssetExportSession 获取最后未保存的视频数据。它似乎有效,我可以录制一些视频,但它们之间再次出现冻结,每个视频的最后 1-2 秒 - 只有一张图片。所以连接后它看起来不像一部电影。

-(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 长的部分视频,然后上传它们。

4

0 回答 0