2

AVAssets에서 AVMutableComposition 및 VideoComposition을 빌드하고 재생할 수 있습니다. 또한 AVAssetExportSession을 사용하여 내보낼 수도 있지만 AVAssetExportSession은 설정에 대한 많은 제어를 제공하지 않으므로 AVAssetReader/AVAssetWriter를 사용하여 내보내는 중입니다.하지만 불행히도 내가 이해하지 못하고 부분적으로 만 작성된 오류가 발생합니다. 결과물 파일.AVAssetReaderVideoCompositionOutput으로 내보내기가 끝나고 AVFoundationErrorDomain을 종료합니다. Code = -11800

여기에 제가 지금까지 가지고있는 코드가 있습니다. 필자는 필자와 필자가 가능한 많은 다른 것들을 생략했다. (오류 검사를 포함하여) 코드가 읽기 쉽도록 만드는 것은 중요하지 않기 때문에 필자는 그것을 많이 읽었습니다. 오디오 트랙을 아직 다루지 않았 음을 유의하십시오. 한 번에 한 단계 씩 진행하려고하지만, 아마도 이것이 내 문제입니까?

변수 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)} 

답변

0

을하는 이 수행하는 방법에 대한 매우 자세한 경우, 아주 분명하다 : 나는 완전히 내 코드를 다시 작성했습니다 있지만

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

을, 나는 SP 생각 echip 문제는 [self.assetReaderOutput copyNextSampleBuffer]에서 반환 된 CMSampleBufferRef에서 CFRelease를 호출하지 않는 것입니다. 루프 안에서 그렇게해야합니다.