我正在使用AVAssetWriterVideoInput將緩衝區追加到文件。我有這樣的代碼:未能使用AVAssetWriterVideoInput向視頻文件添加幀。失敗,未記錄在最後的錯誤-12738
if (_assetWriter.status == AVAssetWriterStatusWriting) {
// If the asset writer status is writing, append sample buffer to its corresponding asset writer input
if (mediaType == AVMediaTypeVideo) {
if (_assetWriterVideoInput.readyForMoreMediaData) {
if (![_assetWriterVideoInput appendSampleBuffer:sampleBuffer]) {
NSLog(@"error: %@", [_assetWriter.error localizedFailureReason]);
NSLog(@"error: %@", [_assetWriter.error localizedRecoveryOptions]);
NSLog(@"error: %@", [_assetWriter.error localizedDescription]);
NSLog(@"error: %@", [_assetWriter.error domain]);
NSLog(@"error: %@", [_assetWriter.error userInfo]);
} else
NSLog(@"frame saved");
}
}
此行
if (![_assetWriterVideoInput appendSampleBuffer:sampleBuffer]) {
失敗,unknown error
和代碼-12738
,很顯然未在任何documentation發現,與所有蘋果文檔的預期。
另外,我懷疑這是一個未知的錯誤,原因很簡單,AVFoundation中存在大量未知錯誤的代碼,並且系統正在挑選代碼-12738
它顯然知道的不僅僅是說它是未知的。
看着正在保存的文件,它保持0兆字節,因爲沒有保存緩衝區/幀。
這AVAssetWriterVideoInput
創建這樣的:
CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(currentFormatDescription);
NSUInteger numPixels = dimensions.width * dimensions.height;
NSUInteger bitsPerSecond;
// Assume that lower-than-SD resolutions are intended for streaming, and use a lower bitrate
NSUInteger bitsPerPixel = 11.4; // This bitrate matches the quality produced by AVCaptureSessionPresetHigh.
bitsPerSecond = numPixels * bitsPerPixel;
NSDictionary *videoCompressionSettings = @{AVVideoCodecKey : AVVideoCodecH264,
AVVideoWidthKey : @(dimensions.width),
AVVideoHeightKey : @(dimensions.height),
AVVideoCompressionPropertiesKey : @{ AVVideoAverageBitRateKey : @(bitsPerSecond),
AVVideoMaxKeyFrameIntervalKey : @(30)} };
if ([_assetWriter canApplyOutputSettings:videoCompressionSettings forMediaType:AVMediaTypeVideo])
{
// Intialize asset writer video input with the above created settings dictionary
_assetWriterVideoInput = [AVAssetWriterInput assetWriterInputWithMediaType:AVMediaTypeVideo outputSettings:videoCompressionSettings];
_assetWriterVideoInput.expectsMediaDataInRealTime = YES;
和緩衝,當它被附加有以下特點:
CMSampleBuffer 0x1009e12a0 retainCount: 1 allocator: 0x1b762cbb8
invalid = NO
dataReady = YES
makeDataReadyCallback = 0x0
makeDataReadyRefcon = 0x0
formatDescription = <CMVideoFormatDescription 0x[0x1b762cbb8]> {
mediaType:'vide'
mediaSubType:'BGRA'
mediaSpecific: {
codecType: 'BGRA' dimensions: 1920 x 1080
}
extensions: {<CFBasicHash 0x17087c2c0 [0x1b762cbb8]>{type = immutable dict, count = 2,
entries =>
0 : <CFString 0x1b1c6d460 [0x1b762cbb8]>{contents = "Version"} = <CFNumber 0xb000000000000022 [0x1b762cbb8]>{value = +2, type = kCFNumberSInt32Type}
2 : <CFString 0x1b1c6d3e0 [0x1b762cbb8]>{contents = "CVBytesPerRow"} = <CFNumber 0xb00000000001e002 [0x1b762cbb8]>{value = +7680, type = kCFNumberSInt32Type}
}
}
}
sbufToTrackReadiness = 0x0
numSamples = 1
sampleTimingArray[1] = {
{PTS = {290309939228910/1000000000 = 290309.939}, DTS = {INVALID}, duration = {INVALID}},
}
imageBuffer = 0x170321180
I have a sample code here如果你想查詢的問題。該代碼準備以4K拍攝視頻。如果您的設備無法做到這一點,請將AVCaptureSessionPreset3840x2160
行更改爲AVCaptureSessionPresetHigh inside
ProcessadorVideo.m`。示例代碼從視頻流中裁剪出一個矩形,並對其應用漫畫效果。 謝謝
您是否調用'startSessionAtSourceTime'? –
這是一個類似於你的其他問題的問題http://stackoverflow.com/a/41207678/22147? –
抱歉,延遲迴答:不。試過了。問題依然存在。 – SpaceDog