1

ファイルにバッファを追加するために AVAssetWriterVideoInput を使用しています。私はこのコードを持っています:

 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]) {

すべてのAppleドキュメントで予想されるように、明らかにどのドキュメントにも見つからないunknown errorコードで失敗します。-12738

また、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 0x170443210 [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

問題を確認したい場合は、ここにサンプルコードがあります。そのコードは、4K でビデオを撮影する準備ができています。デバイスでそれができない場合は、行AVCaptureSessionPreset3840x2160を AVCaptureSessionPresetHigh ProcessadorVideo.m` に変更します。insideサンプル コードは、ビデオ ストリームから四角形をトリミングし、それにコミック効果を適用します。ありがとう

4

1 に答える 1