2012-01-22 24 views
3

私は、USB顕微鏡から静止画像をキャプチャし、画像ファイルに保存する前に後処理を行うためのCocoaアプリを持っています。現時点では、私はブロックNSImageに渡されたCMSampleBufferRefから取得しようとしている、または私は親しみのあるCocoa APIを使用して操作して保存することができる他の表現をしようとしています。-captureStillImageAsynchronouslyFromConnection:completionHandler:から取得したCMSampleBufferからNSImageを取得するにはどうすればいいですか?

Iは、UIImage(ため息)にCMSampleBufferを変換するために主張する機能AVFoundationドキュメントにimageFromSampleBuffer()を発見し、NSImageを返すために適切に修正しました。しかし、CMSampleBufferGetImageBuffer()への呼び出しがnilを返すので、この場合は機能しません。ここで

は私の完了ブロックに渡さCMSampleBufferを示すログです:

2012-01-21 19:38:36.293 LabCam[1402:cb0f] CMSampleBuffer 0x100335390 retainCount: 1 allocator: 0x7fff8c78620c 
    invalid = NO 
    dataReady = YES 
    makeDataReadyCallback = 0x0 
    makeDataReadyRefcon = 0x0 
    buffer-level attachments: 
      com.apple.cmio.buffer_attachment.discontinuity_flags(P) = 0 
      com.apple.cmio.buffer_attachment.hosttime(P) = 79631546824089 
      com.apple.cmio.buffer_attachment.sequence_number(P) = 42 
    formatDescription = <CMVideoFormatDescription 0x100335220 [0x7fff782fff40]> { 
    mediaType:'vide' 
    mediaSubType:'jpeg' 
    mediaSpecific: { 
      codecType: 'jpeg'   dimensions: 640 x 480 
    } 
    extensions: {<CFBasicHash 0x100335160 [0x7fff782fff40]>{type = immutable dict, count = 5, 
entries => 
    1 : <CFString 0x7fff773dff48 [0x7fff782fff40]>{contents = "Version"} = <CFNumber 0x183 [0x7fff782fff40]>{value = +1, type = kCFNumberSInt32Type} 
    2 : <CFString 0x7fff773dff68 [0x7fff782fff40]>{contents = "RevisionLevel"} = <CFNumber 0x183 [0x7fff782fff40]>{value = +1, type = kCFNumberSInt32Type} 
    3 : <CFString 0x7fff7781ab08 [0x7fff782fff40]>{contents = "CVFieldCount"} = <CFNumber 0x183 [0x7fff782fff40]>{value = +1, type = kCFNumberSInt32Type} 
    4 : <CFString 0x7fff773dfdc8 [0x7fff782fff40]>{contents = "FormatName"} = <CFString 0x7fff76d35fb0 [0x7fff782fff40]>{contents = Photo - JPEG"} 
    5 : <CFString 0x7fff773dff88 [0x7fff782fff40]>{contents = "Vendor"} = <CFString 0x7fff773dffa8 [0x7fff782fff40]>{contents = "appl"} 
} 
} 
} 
    sbufToTrackReadiness = 0x0 
    numSamples = 1 
    sampleTimingArray[1] = { 
      {PTS = {2388943236/30000 = 79631.441, rounded}, DTS = {INVALID}, duration = {3698/30000 = 0.123}}, 
    } 
    sampleSizeArray[1] = { 
      sampleSize = 55911, 
    } 
    dataBuffer = 0x100335300 

明らかに、JPEGデータが含まれているように見えますが、どのように私はそれを得るのですか? (好ましくは、関連するメタデータを乗車のために維持する...)

+0

imageFromSampleBuffer()を適切に改訂してNSImageを返す方法を共有することはできますか? –

答えて

7

私は最終的に別のコード例の助けを借りてこれを解決しました。 CMSampleBufferGetImageBufferは、カメラから入手可能な非圧縮のネイティブイメージ形式に対してのみ有効な結果を返します。私のプログラムを動作させるためには、AVCaptureStillImageOutputインスタンスをデフォルトの(JPEG)圧縮形式の代わりにk32BGRAPixelFormatに設定する必要がありました。

session = [[AVCaptureSession alloc] init]; 
session.sessionPreset = AVCaptureSessionPresetPhoto; 
imageOutput = [[AVCaptureStillImageOutput alloc] init]; 
// Configure imageOutput for BGRA pixel format [#2]. 
NSNumber * pixelFormat = [NSNumber numberWithInt:k32BGRAPixelFormat]; 
[imageOutput setOutputSettings:[NSDictionary dictionaryWithObject:pixelFormat 
                  forKey:(id)kCVPixelBufferPixelFormatTypeKey]]; 
[session addOutput:imageOutput]; 
+0

これを共有していただきありがとうございます。これを考え出したのは永遠にかかりましたか? – windson

関連する問題