- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 AVCaptureVideoDataOutput
从相机检索图像并显示在 iPhone
显示屏上。我在使用 iOS8.4
的 iPhone 6 plus
上运行代码,效果很好。图像全屏显示。但是当我使用iPhone4 with iOS 7.1
和iPad mini with iOS 8.3
时,图像无法全屏显示,并且左右有空白(没有图像)显示)的屏幕。这个问题的原因可能是什么?我的代码如下所示。
- (void)viewDidLoad {
dispatch_async(sessionQueue, ^{
[self setBackgroundRecordingID:UIBackgroundTaskInvalid];
NSError *error = nil;
AVCaptureDevice *videoDevice = [RecordViewController deviceWithMediaType:AVMediaTypeVideo preferringPosition:AVCaptureDevicePositionBack];
AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
if (error)
{
NSLog(@"%@", error);
}
if ([session canAddInput:videoDeviceInput])
{
[session addInput:videoDeviceInput];
[self setVideoDeviceInput:videoDeviceInput];
dispatch_async(dispatch_get_main_queue(), ^{
// Why are we dispatching this to the main queue?
// Because AVCaptureVideoPreviewLayer is the backing layer for AVCamPreviewView and UIView can only be manipulated on main thread.
// Note: As an exception to the above rule, it is not necessary to serialize video orientation changes on the AVCaptureVideoPreviewLayer’s connection with other session manipulation.
//[self previewView] layer
[[(AVCaptureVideoPreviewLayer *)[[self previewView] layer] connection] setVideoOrientation:(AVCaptureVideoOrientation)[[UIApplication sharedApplication] statusBarOrientation]];
});
}
AVCaptureDevice *audioDevice = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeAudio] firstObject];
AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error];
if (error)
{
NSLog(@"%@", error);
}
if ([session canAddInput:audioDeviceInput])
{
[session addInput:audioDeviceInput];
}
AVCaptureVideoDataOutput *vid_Output = [[AVCaptureVideoDataOutput alloc] init];
[vid_Output setSampleBufferDelegate:self queue:im_processingQueue];
vid_Output.alwaysDiscardsLateVideoFrames = YES;
// Set the video output to store frame in BGRA (It is supposed to be faster)
NSDictionary* videoSettings = @{(__bridge NSString*)kCVPixelBufferPixelFormatTypeKey: [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]};
[vid_Output setVideoSettings:videoSettings];
if ([session canAddOutput:vid_Output])
{
[session addOutput:vid_Output];
AVCaptureConnection *connection = [vid_Output connectionWithMediaType:AVMediaTypeVideo];
if ([connection isVideoStabilizationSupported])
//[connection setEnablesVideoStabilizationWhenAvailable:YES];
connection.preferredVideoStabilizationMode = AVCaptureVideoStabilizationModeAuto;
[self setVid_Output:vid_Output];
}
});
}
- (void)viewWillAppear:(BOOL)animated
{
//[super viewWillAppear:YES];
dispatch_async([self sessionQueue], ^{
[self addObserver:self forKeyPath:@"sessionRunningAndDeviceAuthorized" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:SessionRunningAndDeviceAuthorizedContext];
[self addObserver:self forKeyPath:@"vid_Output.recording" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:RecordingContext];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(subjectAreaDidChange:) name:AVCaptureDeviceSubjectAreaDidChangeNotification object:[[self videoDeviceInput] device]];
__weak RecordViewController *weakSelf = self;
[self setRuntimeErrorHandlingObserver:[[NSNotificationCenter defaultCenter] addObserverForName:AVCaptureSessionRuntimeErrorNotification object:[self session] queue:nil usingBlock:^(NSNotification *note) {
RecordViewController *strongSelf = weakSelf;
dispatch_async([strongSelf sessionQueue], ^{
// Manually restarting the session since it must have been stopped due to an error.
[[strongSelf session] startRunning];
});
}]];
[[self session] startRunning];
});
}
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer // Create a CGImageRef from sample buffer data
{
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0); // Lock the image buffer
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
//uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0); // Get information of the image
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGImageRef newImage = CGBitmapContextCreateImage(newContext);
UIImage *image= [UIImage imageWithCGImage:newImage scale:1.0 orientation:UIImageOrientationUp];//UIImageOrientationRight
self.videoOrientation = UIImageOrientationUp;
CGContextRelease(newContext);
CGImageRelease(newImage);
CGColorSpaceRelease(colorSpace);
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
/* CVBufferRelease(imageBuffer); */ // do not call this!
return image;
}
最佳答案
尝试添加
[[(AVCaptureVideoPreviewLayer *)[[self previewView] layer] setVideoGravity:AVLayerVideoGravityResizeAspectFill];
这将确保预览层填满整个屏幕
关于ios - AVCaptureVideoDataOutput 和图像在屏幕上的显示大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33503575/
我使用 AVCaptureVideoDataOutput 从相机检索图像并显示在 iPhone 显示屏上。我在使用 iOS8.4 的 iPhone 6 plus 上运行代码,效果很好。图像全屏显示。但
我正在使用 AVFoundation 框架用 iPhone 摄像头捕捉视频,我的代码: self.session = [[AVCaptureSession alloc] init]; ... s
我正在捕获视频并将其转换为 CGImage 来对其进行处理。它将工作约 10 秒,收到内存警告,然后崩溃(通常表示数据格式化程序暂时不可用)。有人可以帮我解决这个问题吗? - (void) captu
我正在编写一个应用程序,它对从 AVCaptureSession 中的 AVCaptureVideoDataOutput 获取的图像数据进行一些实时处理。 我目前能够启动 session ,添加输入和
无论如何使用 AVCaptureVideoDataOutput (或其他方式?)以每秒至少 30 帧的速度在 10 位 P3 颜色空间中获取 CMSampleBuffers?我可以将 AVCaptur
我有一个 layerRect 显示我的相机的图像是这样的: CGRect layerRect = [[videoStreamView layer] bounds]; [[[self captureMa
背景: 我使用 AVCaptureVideoDataOutput 与 AVCaptureSession 和其他各种 AV 工具配合来创建视频 session ,以便我可以创建相机 session 。我
如果我们使用 AVCaptureMovieFileOutput,我们有 recordedDuration 属性,它给出了录制视频的长度。 但是,对于使用 AVCaptureVideoDataOutpu
借助 iOS4 中包含的 AVFoundation 中的新视频功能,可以使用 AVCaptureVideoDataOutput 访问相机捕获的原始视频帧。 我想在这些帧上叠加文本和其他信息,然后将它们
我不确定我应该在方法中放入什么 - (void) captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSam
我正在使用 AVCaptureScreenInput 在 Mac 上尝试屏幕捕获,但从未调用 AVCaptureVideoDataOutput 委托(delegate) captureOutput,我
这就是问题所在。我正在使用 AVCaptureVideoDataOutput 从相机获取视频帧并使用 AVAssetWriter 从中制作视频。它工作正常,但我得到的视频是颠倒的,因为我的应用程序的设
我正在使用 AVCaptureSession 获取相机输出并成功添加了音频和视频输入和输出。 { var captureDevice = AVCaptureDevice.defaultDevi
根据this documentation ,AVCaptureVideoDataOutput 应该允许通过像素格式选项kCVPixelFormatType_128RGBAFloat 将图像捕获为 fl
我运行了一个 AVCaptureVideoDataOutput session ,设置如下,效果很好,并将缓冲区记录到文件中。 我还想录制音频,但缓冲区中似乎没有任何音频,即使我已将麦克风添加为 ca
Apple 最近的示例代码之一使用相同的串行队列从 AVCaptureVideoDataOutput 和 AVCaptureAudioDataOutput 委托(delegate)接收示例。我需要知道
我想保存视频流中的图像,我已将 session 预设设置为 AVCaptureSessionPresetPhoto,但我在设备上获得的分辨率非常低。我在 3GS 上进行测试,此预设返回 512x384
我正在使用 AVFoundation 从后置摄像头捕获视频,并希望在按下开始按钮时处理帧。问题是,在我按下开始按钮的那一刻,我从样本缓冲区中抓取帧并对其进行处理,但我得到的帧似乎是过去的帧,这意味着不
我正在向我的 AVCaptureVideoDataOutput 添加 key 。添加 key 时 AVVideoProfileLevelKey 系统抛出我 -> Failed to set (cont
我正在尝试通过设置 kCVPixelBufferWidthKey 和 kCVPixelBufferHeightKey 从 AVCaptureVideoDataOutput 捕获特定大小的帧。 问题是缓
我是一名优秀的程序员,十分优秀!