jjzjj

ios - 此媒体所需的编码器正忙

coder 2024-01-11 原文

尝试通过 AVAssetWriter 和 AVAssetWriterInput 方法将多个视频连接成一个时。在第 3 个视频之后,我收到来自 AVAssetWriter.error 的“无法编码”错误。

此外,我可以通过控制台看到成功读取缓冲区,但只有最后一次成功读取的视频才会出现在串联的 mov 中。对其中一个或两个问题的任何见解表示赞赏,来源和日志如下。谢谢

+(void)doWriteWithVideoWriter:(AVAssetWriter *)videoWriter withIndex:(int)index withWriterInputArray:(NSMutableArray *)writersArray withInstance:(VideoCombinerManager *)theInstance{
if ([writersArray count] > 0)
{
    int newIndex = index+1;

    NSError *readerError;
    NSDictionary *videoOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange] forKey:(id)kCVPixelBufferPixelFormatTypeKey];

    AVAsset *sourceAsset = [theInstance.loadedAssetsForCompilationDictionary objectForKey:[theInstance.sortedKeysArray objectAtIndex:index]];
    AVAssetTrack *videoTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    AVAssetReaderTrackOutput *currentReaderTrackOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack outputSettings:videoOptions];
    AVAssetReader *currentReader = [[AVAssetReader alloc] initWithAsset:sourceAsset error:&readerError];
    [currentReader addOutput:currentReaderTrackOutput];
    [currentReader startReading];

    AVAssetWriterInput *writerInput = [[writersArray objectAtIndex:0] retain];

    dispatch_queue_t _processingQueue = dispatch_queue_create("asdf", NULL);
    [writerInput requestMediaDataWhenReadyOnQueue:_processingQueue usingBlock:^{
    if ([writerInput isReadyForMoreMediaData])
    {
        CMSampleBufferRef nextSampleBuffer;

        if ([currentReader status] == AVAssetReaderStatusReading &&
        (nextSampleBuffer = [currentReaderTrackOutput copyNextSampleBuffer])) {

        if (nextSampleBuffer)
        {
            BOOL result = [writerInput appendSampleBuffer:nextSampleBuffer];
            if (!result)
            {
            NSLog(@"videoWriter.error.userInfo: %@", videoWriter.error.userInfo);
            }
            CFRelease(nextSampleBuffer);
        }
        }
        else
        {
        NSLog(@"writer done: %d", index);
        dispatch_release(_processingQueue);

        [writersArray removeObjectAtIndex:0];

        [writerInput markAsFinished];
        [writerInput release];

        [currentReader release];
        [currentReaderTrackOutput release];

        [VideoCombinerManager doWriteWithVideoWriter:videoWriter withIndex:newIndex withWriterInputArray:writersArray withInstance:theInstance];
        }
    }
    }];
}
else
    [videoWriter finishWriting];

}

作家完成:0

作者完成:1

作家完成:2

videoWriter.error.userInfo: {
    NSLocalizedDescription = "Cannot Encode";
    NSLocalizedFailureReason = "The encoder required for this media is busy.";
    NSLocalizedRecoverySuggestion = "Stop any other actions that encode media and try again.";
    NSUnderlyingError = "Error Domain=NSOSStatusErrorDomain Code=-12915 \"The operation couldn\U2019t be completed. (OSStatus error -12915.)\"";
}

videoWriter.error.userInfo: {
    NSLocalizedDescription = "Cannot Encode";
    NSLocalizedFailureReason = "The encoder required for this media is busy.";
    NSLocalizedRecoverySuggestion = "Stop any other actions that encode media and try again.";
    NSUnderlyingError = "Error Domain=NSOSStatusErrorDomain Code=-12915 \"The operation couldn\U2019t be completed. (OSStatus error -12915.)\"";
}

最佳答案

至于 Cannot Encode 错误,您同时存在的 writer 和/或 writerInputs 太多。当我遇到同样的错误时,我意识到我必须释放所有以前使用的 writer 和 writerInputs 才能摆脱它。 由于您确实释放了它们,您的问题可能是您同时拥有许多它们。

关于ios - 此媒体所需的编码器正忙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12647725/

有关ios - 此媒体所需的编码器正忙的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  3. 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返回它复制的字节数,但是当我还没有下

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

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

  5. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  6. 怎样用一台手机做自媒体? - 2

    其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时

  7. 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使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  9. 即使安装了 gem,Ruby 也找不到所需的库 - 2

    我花了几天时间尝试安装ruby​​1.9.2并让它与gems一起工作:-/我最终放弃了我的MacOSX10.6机器,下面是我的Ubuntu机器上的当前状态。任何建议将不胜感激!#rubytest.rb:29:in`require':nosuchfiletoload--mongo(LoadError)from:29:in`require'fromtest.rb:1:in`'#cattest.rbrequire'mongo'db=Mongo::Connection.new.db("mydb")#gemwhichmongo/usr/local/rvm/gems/ruby-1.9.2-p0/g

  10. ruby - Rails -- :id attribute? 所需的数据库索引 - 2

    因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration

随机推荐