【发布时间】:2011-12-19 12:34:45
【问题描述】:
我正在尝试根据用户的输入裁剪和缩放CMSampleBufferRef,在ratio 上,以下代码采用 CMSampleBufferRef,将其转换为 CVImageBufferRef 并使用 CVPixelBuffer 根据其字节裁剪内部图像。这个过程的目标是有一个裁剪和缩放的 CVPixelBufferRef 来写入视频
- (CVPixelBufferRef)modifyImage:(CMSampleBufferRef) sampleBuffer {
@synchronized (self) {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// Lock the image buffer
CVPixelBufferLockBaseAddress(imageBuffer,0);
// Get information about the image
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CVPixelBufferRef pxbuffer;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey,
[NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey,
[NSNumber numberWithInt:720], kCVPixelBufferWidthKey,
[NSNumber numberWithInt:1280], kCVPixelBufferHeightKey,
nil];
NSInteger tempWidth = (NSInteger) (width / ratio);
NSInteger tempHeight = (NSInteger) (height / ratio);
NSInteger baseAddressStart = 100 + 100 * bytesPerRow;
CVReturn status = CVPixelBufferCreateWithBytes(kCFAllocatorDefault, tempWidth, tempHeight, kCVPixelFormatType_32BGRA, &baseAddress[baseAddressStart], bytesPerRow, MyPixelBufferReleaseCallback, NULL, (CFDictionaryRef)options, &pxbuffer);
if (status != 0) {
CKLog(@"%d", status);
return NULL;
}
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
return pxbuffer;
}
}
一切正常,除了当我尝试使用此方法将其写入视频输出时,它不断收到内存警告。如果我保持相同的比例就可以了
- (void)writeBufferFrame:(CMSampleBufferRef)sampleBuffer pixelBuffer:(CVPixelBufferRef)pixelBuffer {
CMTime lastSampleTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
if(self.videoWriter.status != AVAssetWriterStatusWriting)
{
CKLog(@"%d", self.videoWriter.status);
[self.videoWriter startWriting];
[self.videoWriter startSessionAtSourceTime:lastSampleTime];
}
CVPixelBufferRef pxbuffer = [self modifyImage:sampleBuffer];
BOOL success = [self.avAdaptor appendPixelBuffer:pxbuffer withPresentationTime:lastSampleTime];
if (!success)
NSLog(@"Warning: Unable to write buffer to video");
}
我还尝试了使用CMSampleBufferRef 和CGContext 的不同方法。如果您可以在这里为任何方法提供解决方案,我可以给您满分
【问题讨论】:
-
我只是想调整 CVpixcelbuffer 的大小。哪个是可能的?我刚刚使用了你的代码。但无法得到它预期的 o/p.in 选项 dic 我已经添加了原始大小和临时大小我已经指出了我的预期大小但它不起作用
标签: iphone objective-c ios avfoundation cmsamplebufferref