2017-11-15 6 views
0

ビデオカラーアプリケーション用のAVFoundationでビデオをエンコードしようとしています(hereをご覧ください)。私の問題の解決に役立つ場合、エクスポートコーデックはH264またはProResまたはHEVC(ユーザーの選択に応じて)になります。 Make movie file with picture Array and song file, using AVAssetAVFoundationビデオのエクスポート - 理由なしでエラーが発生しました[Objective-C]

そしてgithubのからこのコード::私は答えに基づいて私のコードを書かれている

ここhttps://github.com/caferrara/img-to-video/blob/master/img-to-video/ViewController.m#L29

は、一部の外国の変数と関数呼び出しがあります(私が持っているものだが、私はそれはかなりだと思います明確なものを)起こっている:

NSURL * outURL = [NSURL fileURLWithPath:[NSString stringWithFormat: @"%s", path]]; 

NSLog(outURL.absoluteString); 

NSError * error = nil; 
AVAssetWriter * videoWriter = [[AVAssetWriter alloc] initWithURL: outURL 
           fileType:AVFileTypeQuickTimeMovie 
                  error:&error]; 

NSDictionary * videoSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
           encoder->codec, AVVideoCodecKey, 
           [NSNumber numberWithInt:encoder->width], AVVideoWidthKey, 
           [NSNumber numberWithInt:encoder->height], AVVideoHeightKey, 
           nil ]; 

AVAssetWriterInput * videoWriterInput = [AVAssetWriterInput 
             assetWriterInputWithMediaType:AVMediaTypeVideo 
             outputSettings:videoSettings]; 


AVAssetWriterInputPixelBufferAdaptor * adaptor = [AVAssetWriterInputPixelBufferAdaptor 
               assetWriterInputPixelBufferAdaptorWithAssetWriterInput:videoWriterInput 
               sourcePixelBufferAttributes:nil]; 

videoWriterInput.expectsMediaDataInRealTime = YES; 
[videoWriter addInput:videoWriterInput]; 

//Start a session: 
[videoWriter startWriting]; 
NSLog(@"Write Started"); 
[videoWriter startSessionAtSourceTime:kCMTimeZero]; 


//Video encoding 

CVPixelBufferRef buffer = NULL; 

setMlvAlwaysUseAmaze(App->videoMLV); 

for(uint64_t f = 0; f < getMlvFrames(App->videoMLV); ++f) 
{ 
    getMlvProcessedFrame16(App->videoMLV, f, encoder->data); 
    CVReturn success = CVPixelBufferCreateWithBytes(kCFAllocatorDefault, 
                encoder->width, 
                encoder->height, 
                kCVPixelFormatType_48RGB, 
                encoder->data, 
                sizeof(uint16_t) * encoder->width * 3, 
                NULL, 
                NULL, 
                NULL, 
                &buffer); 
    if (success != kCVReturnSuccess || buffer == NULL) NSLog(@"Failed to create pixel buffer."); 
    NSDictionary * colour_attachment = @{(id)kCVImageBufferICCProfileKey : (id)encoder->colour_profile_data}; 
    CVBufferSetAttachments(buffer, (CFDictionaryRef)colour_attachment, kCVAttachmentMode_ShouldPropagate); 

    BOOL append_ok = NO; 
    int j = 0; 
    while (!append_ok && j < 30) { 
     if (adaptor.assetWriterInput.readyForMoreMediaData) { 
      //print out status: 
      NSLog(@"Processing video frame (%d, attempt %d)", (int)f, j); 

      CMTime frameTime = CMTimeMake(f * 5000.0, (int32_t)(encoder->fps * 1000.0)); 
      append_ok = [adaptor appendPixelBuffer:buffer withPresentationTime:frameTime]; 
      if(!append_ok){ 
       NSError *error = videoWriter.error; 
       if(error!=nil) { 
        NSLog(@"Unresolved error %@,%@.", error, [error userInfo]); 
       } 
      } 
      while(!adaptor.assetWriterInput.readyForMoreMediaData) [NSThread sleepForTimeInterval:0.0001]; 
     } 
     else { 
      printf("adaptor not ready %d, %d\n", (int)f, j); 
      while(!adaptor.assetWriterInput.readyForMoreMediaData) [NSThread sleepForTimeInterval:0.0001]; 
     } 
     j++; 
    } 
    if (!append_ok) { 
     printf("error appending image %d times %d\n, with error.", (int)f, j); 
    } 
} 

[videoWriterInput markAsFinished]; 
[videoWriter finishWriting]; 

[videoWriterInput release]; 
[videoWriter release]; 

NSLog(@"Write Ended"); 

しかし、私はそれを実行しようとするたびに、それは次のようなエラーが出力されます。

2017-11-15 20:54:40.532 MLV App[21801:3488295] Unresolved error Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedFailureReason=An unknown error occurred (-12905), NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x7fd446adeb70 {Error Domain=NSOSStatusErrorDomain Code=-12905 "(null)"}},{ 
NSLocalizedDescription = "The operation could not be completed"; 
NSLocalizedFailureReason = "An unknown error occurred (-12905)"; 
NSUnderlyingError = "Error Domain=NSOSStatusErrorDomain Code=-12905 \"(null)\""; }. 

私はインターネット上でこのエラーコードの意味を見てきましたが、それはまったく役に立たないものでした。

AVFoundationの使用方法に大きな問題がありますか? 私は8ビットRGBフレームへの切り替えも試みましたが、問題を修正しませんでした。

+0

は推測:多分 'AVFoundation'はRGBをやったときにRGBAが好き、または多分ピクセルバッファ属性は 'kCVPixelBufferPixelFormatTypeKey'を指定する必要があります。実行可能なスニペットがここで多く役立ちます。 –

+0

https://osstatus.com/search/results?platform=all&framework=all&search=-12905 – seth

答えて

0

リストされているすべてのピクセル形式が実際にフレームワークでサポートされているわけではありません。選択したものはサポートされていません。あなたが実行したいことがあり https://developer.apple.com/library/content/qa/qa1501/_index.html

注:https://www.osstatus.com/

テックQ &コアビデオでサポートされているに関するピクセルフォーマットを経由して

kVTPixelTransferNotSupportedErr = -12905 など、kCVPixelFormatType_32ARGB、kCVPixelFormatType_422YpCbCr8などの標準形式にこだわります特定のOSバージョンでサポートされているフォーマットの最新リストを見つけるためのコード。また、すべてのフォーマットがすべてのフレームワークのすべてのパスでサポートされるわけではありません。つまり、ピクセル形式の変換を行うVideoToolboxは、その形式でCVPixelBufferを作成することはできますが、形式Xをサポートしていない可能性があります。あなたのケースでは

、それらは、少なくともデコード側でサポートしているとして、kCVPixelFormatType_4444AYpCbCr16kCVPixelFormatType_422YpCbCr16kCVPixelFormatType_422YpCbCr10、またはkCVPixelFormatType_64ARGBを試してみてください。 https://developer.apple.com/documentation/avfoundation/avassetreadertrackoutput

+0

ありがとうございました!私は実際に数日前に起こっているようなことがあることに気付き、答えを更新することを忘れてしまっただけです。 –

+0

これは8ビットRGBで動作しますが、これはprores 4444コーデックの10ビット機能を使用していないため、16ビットデータを供給できるピクセル形式はわかりますか? –

+0

答えをもう一度見てください。 – seth

関連する問題