草庐IT

ios - 在文档中写入视频时出错

coder 2024-01-12 原文

您好,我正在捕捉屏幕并制作成视频。它在模拟器中运行良好。当我在设备中运行它时。应用程序崩溃。下面我把我的代码和错误

 - (void)stopRecording
    {

    [self.displayLink invalidate];
    startTimestamp = 0.0;
    dispatch_async(queue, ^
                   {

                       //if (deferImageprocess) {
                           if (self.writer.status != AVAssetWriterStatusCompleted && self.writer.status != AVAssetWriterStatusUnknown) {
                               [self.writerInput markAsFinished];

                           }

                           if ([self.writer respondsToSelector:@selector(finishWritingWithCompletionHandler:)]) {
                               [self.writer finishWritingWithCompletionHandler:^
                                {

                                    ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
                                    [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:self.pathStr]
                                                                completionBlock:^(NSURL *assetURL, NSError *error){
                                                                    if (!error)
                                                                    {
                                                                        NSLog(@"Saved Successfully");
                                                                        [self finishBackgroundTask];
                                                                        [self.delegate recordingFinished:[NSString stringWithFormat:@"%@", self.pathStr]];
                                                                    }
                                                                }];
                                }];

                           }
                           else {
                               [self.writer finishWriting];
                               ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
                               [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:self.pathStr]
                                                           completionBlock:^(NSURL *assetURL, NSError *error){
                                                           }];
                               [self finishBackgroundTask];
                               [self restartRecordingIfNeeded];

                           }
                        });

}


**This above to Wirte the video file in Document as well as gallery**

- (void)captureFrame:(CADisplayLink *)displayLink
    {
        dispatch_async(queue, ^
                       {
                           if (self.writerInput.readyForMoreMediaData) {
                               CVReturn status = kCVReturnSuccess;
                               CVPixelBufferRef buffer = NULL;
                               CFTypeRef backingData;

    #if APPSTORE_SAFE || TARGET_IPHONE_SIMULATOR  || TARGET_OS_IPHONE


                               __block UIImage *screenshot = nil;
                               dispatch_sync(dispatch_get_main_queue(), ^{
                                   screenshot = [self screenshot];
                               });
                               CGImageRef image = [[self screenshot] CGImage];
                               CGDataProviderRef dataProvider = CGImageGetDataProvider(image);
                               CFDataRef data = CGDataProviderCopyData(dataProvider);
                               backingData = CFDataCreateMutableCopy(kCFAllocatorDefault, CFDataGetLength(data), data);
                               CFRelease(data);

                               const UInt8 *bytePtr = CFDataGetBytePtr(backingData);

                               status = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
                                                                     CGImageGetWidth(image),
                                                                     CGImageGetHeight(image),
                                                                     kCVPixelFormatType_32BGRA,
                                                                     (void *)bytePtr,
                                                                     CGImageGetBytesPerRow(image),
                                                                     NULL,
                                                                     NULL,
                                                                     NULL,
                                                                     &buffer);
                               NSLog(@"%d", status);
                               NSParameterAssert(status == kCVReturnSuccess && buffer);
    #else
                               CFTypeRef surface = [UIWindow createScreenIOSurface];
                               backingData = surface;

                               NSDictionary *pixelBufferAttributes = @{(NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA)};
                               status = CVPixelBufferCreateWithIOSurface(NULL, surface, (__bridge CFDictionaryRef)(pixelBufferAttributes), &buffer);
                               NSLog(@"%d", status);
                               NSParameterAssert(status == kCVReturnSuccess && buffer);

    #endif
                               if (buffer) {
                                   CFAbsoluteTime currentTime = CFAbsoluteTimeGetCurrent();
                                   CFTimeInterval elapsedTime = currentTime - firstFrameTime;

                                   CMTime presentTime =  CMTimeMake(elapsedTime * TIME_SCALE, TIME_SCALE);

                                   if(![self.writerInputPixelBufferAdaptor appendPixelBuffer:buffer withPresentationTime:presentTime]) {
                                       [self stopRecording];
                                       NSLog(@"Failed");
                                   }

                                   CVPixelBufferRelease(buffer);
                               }

                               CFRelease(backingData);
                           }
                       });

        if (startTimestamp == 0.0) {
            startTimestamp = displayLink.timestamp;
        }

        NSTimeInterval dalta = displayLink.timestamp - startTimestamp;

        if (self.autosaveDuration > 0 && dalta > self.autosaveDuration) {
            startTimestamp = 0.0;
            [self rotateFile];
        }
    }

在上面捕捉帧。

现在我在停止录制时遇到了这个错误。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[AVAssetWriterInput markAsFinished] Cannot call method when status is 2'.

我不知道这里有什么问题。请告诉我任何建议

最佳答案

这个错误是因为

  1. 当状态为 2 时将 writer 标记为已完成。

  2. 尝试重用您的 AVAssetWriter 实例。请记得在需要开始录制时始终创建一个新实例。

  3. 线程问题,请创建您的队列,因为 sdk 提供的默认队列是并发的,它们以并发方式而不是串行方式工作。

关于ios - 在文档中写入视频时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19809416/

有关ios - 在文档中写入视频时出错的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  3. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  4. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  5. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  6. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  7. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. ruby - 使用 postgres.app 在 rvm 下要求 pg 时出错 - 2

    我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension

  10. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

随机推荐