Ich bin neu in iOS-Programmierung und Multimedia und ich ging durch ein Beispielprojekt namens RosyWriter von Apple zur Verfügung gestellt unter this link. Hier sah ich, dass im Code gibt es eine Funktion captureOutput:didOutputSampleBuffer:fromConnection
im Code angegebenen Namen unter:Convert CVImageBufferRef in CVPixelBufferRef
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);
if (connection == videoConnection) {
// Get framerate
CMTime timestamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
[self calculateFramerateAtTimestamp:timestamp];
// Get frame dimensions (for onscreen display)
if (self.videoDimensions.width == 0 && self.videoDimensions.height == 0)
self.videoDimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);
// Get buffer type
if (self.videoType == 0)
self.videoType = CMFormatDescriptionGetMediaSubType(formatDescription);
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// Synchronously process the pixel buffer to de-green it.
[self processPixelBuffer:pixelBuffer];
// Enqueue it for preview. This is a shallow queue, so if image processing is taking too long,
// we'll drop this frame for preview (this keeps preview latency low).
OSStatus err = CMBufferQueueEnqueue(previewBufferQueue, sampleBuffer);
if (!err) {
dispatch_async(dispatch_get_main_queue(), ^{
CMSampleBufferRef sbuf = (CMSampleBufferRef)CMBufferQueueDequeueAndRetain(previewBufferQueue);
if (sbuf) {
CVImageBufferRef pixBuf = CMSampleBufferGetImageBuffer(sbuf);
[self.delegate pixelBufferReadyForDisplay:pixBuf];
CFRelease(sbuf);
}
});
}
}
CFRetain(sampleBuffer);
CFRetain(formatDescription);
dispatch_async(movieWritingQueue, ^{
if (assetWriter) {
BOOL wasReadyToRecord = (readyToRecordAudio && readyToRecordVideo);
if (connection == videoConnection) {
// Initialize the video input if this is not done yet
if (!readyToRecordVideo)
readyToRecordVideo = [self setupAssetWriterVideoInput:formatDescription];
// Write video data to file
if (readyToRecordVideo && readyToRecordAudio)
[self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo];
}
else if (connection == audioConnection) {
// Initialize the audio input if this is not done yet
if (!readyToRecordAudio)
readyToRecordAudio = [self setupAssetWriterAudioInput:formatDescription];
// Write audio data to file
if (readyToRecordAudio && readyToRecordVideo)
[self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeAudio];
}
BOOL isReadyToRecord = (readyToRecordAudio && readyToRecordVideo);
if (!wasReadyToRecord && isReadyToRecord) {
recordingWillBeStarted = NO;
self.recording = YES;
[self.delegate recordingDidStart];
}
}
CFRelease(sampleBuffer);
CFRelease(formatDescription);
});
}
hier eine Funktion pixelBufferReadyForDisplay
genannt wird aufgerufen, die einen Parameter vom Typ CVPixelBufferRef
Prototyp pixelBufferReadyForDisplay erwartet
- (void)pixelBufferReadyForDisplay:(CVPixelBufferRef)pixelBuffer;
Aber im obigen Code beim Aufruf dieser Funktion übergibt es die Variable pixBuf
wh Ich bin vom Typ
Also meine Frage ist, dass es nicht erforderlich ist, eine Funktion oder Typumwandlung zu verwenden, um eine CVImageBufferRef in CVPixelBufferRef zu konvertieren oder wird dies implizit durch den Compiler getan?
Danke.
Warum können Sie einen CImage von einem CVPixelBuffer auf iOS, aber nicht auf OSX erstellen? CIImage (CVPixelBuffer: currPixelBuffer) funktioniert auf iOS, aber nicht auf OSX. CIImage (CVImageBuffer: currPixelBuffer) funktioniert unter OSX. – Adam
Zwischen den Plattformen gibt es einige Unterschiede beim Datentyp. Manchmal gibt es keinen guten Grund dafür. –