使用 AVCaptureMovieFileOutput 在视频录制期间创建块文件

问题描述

我的项目中有一个功能,我必须在其中创建一个文件并在录制期间上传文件。但是,在视频录制过程中,当我从录制视频路径中提取块时,我发现在合并视频块时块文件已损坏,但录制的视频工作正常。

我正在设置视频录制

    -(void)setMovieFileOutput
    {
        _videoConnection = [movieFileOutput connectionWithMediaType:AVMediaTypeVideo];;
        NSDictionary *outputSetings  = [NSDictionary dictionaryWithObjectsAndKeys:
                                        AVVideoCodecTypeH264,AVVideoCodecKey,[NSDictionary dictionaryWithObjectsAndKeys:
                                         [NSNumber numberWithInteger:_capturingBitRate],AVVideoAverageBitRateKey,[NSNumber numberWithInteger:frameRate],AVVideoMaxKeyFrameIntervalKey,nil],AVVideoCompressionPropertiesKey,nil];
        [movieFileOutput setoutputSettings:outputSetings forConnection:_videoConnection];
        [self startRecordingChunkFile];
    }

-(void)startRecordingChunkFile {
    dispatch_async(dispatch_get_main_queue(),^{
         [movieFileOutput startRecordingToOutputFileURL:_capturedFileURL recordingDelegate:self];
   });
}

-(void)stopRecording{
    if(movieFileOutput.isRecording){
        [movieFileOutput stopRecording];
    }
   
 }

这里是创建块文件代码

-(int)createRecordedVideoParts:(Nsstring*)videoPath chunkCounter:(int)chunkCounter andClipNo:(int)clipNo andChildobj:(ChildVideo *)childVideoObj andVideoObj:(Video *)videoObj huddleID:(int)huddleID isObservation:(BOOL)isObservtion andUploadToHuddle:(BOOL)isHuddleUpload skipReachablilityCheck:(BOOL)skipReachablilityCheck {
    Reachability * reach = [Reachability reachabilityForInternetConnection];
    if(reach.isReachable || skipReachablilityCheck ){
        Nsstring *newVideoPath =    [[[SibmeVideoLibrary getLibrary] getSibmegalleryFolderPath] stringByAppendingPathComponent:childVideoObj.videoPath.lastPathComponent];
        if([[NSFileManager defaultManager] fileExistsAtPath:newVideoPath]){
            NSLog(@"file exist");
        }
        NSError* error = nil;
        NSData *fileContent = [NSData dataWithContentsOfFile:newVideoPath options: 0 error: &error];
        signed long long chunkOffset =  chunkCounter * kChunkSizeSmall;
        signed long long difference = (fileContent.length - chunkOffset);
        
        if (difference >= kChunkSizeSmall) {
            NSData *subData = [fileContent subdataWithRange:NSMakeRange(chunkOffset,kChunkSizeSmall)];
            Nsstring *chunkFilePath = [Utils writeChunkToFile:subData startPosition:chunkOffset chunkNo:chunkCounter videoClipNo:clipNo andVideoId:videoObj.videoID chunkSizetoRead:kChunkSizeSmall fileHandler:[NSFileHandle fileHandleForReadingAtPath:newVideoPath]];
            [self saveChunkObject:chunkFilePath chunkNo:chunkCounter andChunkFileSize:kChunkSizeSmall andChildobj:childVideoObj andVideoObj:videoObj andClipNo:clipNo huddleID:huddleID isObservation:isObservtion andUploadToHuddle:isHuddleUpload chunkOffset:chunkOffset];
            chunkCounter += 1;
        }
        else {
            NSData *subData = [fileContent subdataWithRange:NSMakeRange(chunkOffset,difference)];
            Nsstring *chunkFilePath = [Utils writeChunkToFile:subData startPosition:chunkOffset chunkNo:chunkCounter videoClipNo:clipNo andVideoId:videoObj.videoID chunkSizetoRead:difference fileHandler:[NSFileHandle fileHandleForReadingAtPath:newVideoPath]];
            [self saveChunkObject:chunkFilePath chunkNo:chunkCounter andChunkFileSize:difference andChildobj:childVideoObj andVideoObj:videoObj andClipNo:clipNo huddleID:huddleID isObservation:isObservtion andUploadToHuddle:isHuddleUpload chunkOffset:chunkOffset];
        }
    }
    
    return chunkCounter;
}

任何人都可以建议代码中的问题所在

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)