gpt4 book ai didi

ios - 使用 AVAssetReaderVideoCompositionOutput 导出进行到一半,然后以 AVFoundationErrorDomain Code=-11800 退出

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:40:42 25 4
gpt4 key购买 nike

我已经从 AVAssets 构建了一个 AVMutableComposition 和 VideoComposition 并且能够播放它。我也可以使用 AVAssetExportSession 导出它,但是 AVAssetExportSession 不提供对设置的太多控制,所以我使用 AVAssetReader/AVAssetWriter 导出它,但不幸的是我遇到了一个我不理解的错误并且只写了部分输出文件。

这是我目前的代码。我已经省略了编写器和尽可能多的其他内容(包括一些错误检查),我认为这些内容与使代码更易于阅读无关,因为它很多。请注意,我还没有处理音轨——我正在尝试一次一个步骤地执行此操作,但也许这是我的问题?

变量 asset 是 AVMutableComposition。

// ------- reader
_assetReader = [AVAssetReader assetReaderWithAsset:asset error:error];

_assetReader.timeRange = CMTimeRangeMake(kCMTimeZero, asset.duration);
_duration = asset.duration;

// --- video reader
NSArray *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo];

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

_assetReaderOutput = [AVAssetReaderVideoCompositionOutput assetReaderVideoCompositionOutputWithVideoTracks:videoTracks
videoSettings:videoOptions];
((AVAssetReaderVideoCompositionOutput *)_assetReaderOutput).videoComposition = composition;
[_assetReader addOutput:_assetReaderOutput];


// -- leaving out the export settings and construction
// of the assetWriter since that doesn't seem to be the issue


// -- here's the actual export:

[self.assetWriter startWriting];
[self.assetWriter startSessionAtSourceTime:kCMTimeZero];
[self.assetReader startReading];


CMSampleBufferRef buffer;


while ( [self.assetReader status]==AVAssetReaderStatusReading )
{
if(![self.assetWriterInput isReadyForMoreMediaData])
continue;

buffer = [self.assetReaderOutput copyNextSampleBuffer];


NSLog(@"READING");

if(buffer)
[self.assetWriterInput appendSampleBuffer:buffer];

NSLog(@"WRITTING...");


}
if( self.assetReader.status == AVAssetReaderStatusFailed ) {
NSLog( @"%@", self.assetReader.error ); //<--------- I get a problem here
}


//Finish the session:
[self.assetWriterInput markAsFinished];
[self.assetWriter finishWriting];
NSLog(@"Write Ended");

问题是循环在短时间后退出,我得到这个输出:

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x17f1dfa0 {NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x191617f0 "The operation couldn’t be completed. (OSStatus error -308.)", NSLocalizedFailureReason=An unknown error occurred (-308)}

最佳答案

似乎我遵循了一些错误的示例代码,而不是苹果提供的正确示例代码,关于如何执行此操作非常清楚,即使非常冗长:

https://developer.apple.com/library/Mac/DOCUMENTATION/AudioVideo/Conceptual/AVFoundationPG/Articles/05_Export.html#//apple_ref/doc/uid/TP40010188-CH9-SW2

虽然我已经完全重写了我的代码,但我认为我遇到的具体问题是没有在从 [self.assetReaderOutput copyNextSampleBuffer] 返回的 CMSampleBufferRef 上调用 CFRelease。您需要在循环内执行此操作。

关于ios - 使用 AVAssetReaderVideoCompositionOutput 导出进行到一半,然后以 AVFoundationErrorDomain Code=-11800 退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20498769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com