这很奇怪而且超出我的范围。如果我从Apple获取AVCAM示例并将其粘贴到我的应用程序(以及所有文件,声明等),我可以使用相机就好了。应用程序捕获静态图像,视频,保存,自动对焦等。一切都很好,但有一点,预览图层(看看相机指向的是什么)在加载并保持冻结的第一帧时冻结。 这是来自Apple的代码,它进入我主控制器的viewDidLoad:
if ([self captureManager] == nil) {
AVCamCaptureManager *manager = [[AVCamCaptureManager alloc] init];
[self setCaptureManager:manager];
[manager release];
[[self captureManager] setDelegate:self];
if ([[self captureManager] setupSession]) {
// Create video preview layer and add it to the UI
AVCaptureVideoPreviewLayer *newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:[[self captureManager] session]];
UIView *view = [self videoPreviewView];
CALayer *viewLayer = [view layer];
[viewLayer setMasksToBounds:YES];
CGRect bounds = [view bounds];
[newCaptureVideoPreviewLayer setFrame:bounds];
if ([newCaptureVideoPreviewLayer isOrientationSupported]) {
[newCaptureVideoPreviewLayer setOrientation:AVCaptureVideoOrientationPortrait];
}
[newCaptureVideoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[viewLayer insertSublayer:newCaptureVideoPreviewLayer below:[[viewLayer sublayers] objectAtIndex:0]];
[self setCaptureVideoPreviewLayer:newCaptureVideoPreviewLayer];
[newCaptureVideoPreviewLayer release];
// Start the session. This is done asychronously since
// -startRunning doesn't return until the session is running.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[[self captureManager] session] startRunning]; });
}
}
现在得到这个:相反,我没有将Apple的代码粘贴到我的应用程序中,而是决定将我的代码粘贴到Apple的AVCAM中以查看是否可行。移动大量文件并基本上将AVCAM转换为我的实验应用程序后,一切正常。这两个项目(1- Apple的AVCAM与我添加的代码和2 - 我的原始项目与AVCAM添加代码)具有完全相同的文件和完全相同的代码。可不是闹着玩的。两个项目的类头和实现文件是相同的。但是,在我的原始项目中,预览图层冻结并保持冻结状态。但是在AVCAM原创项目中,预览层可以工作。所以我正在检查框架,构建和链接选项,SDK版本等......我怀疑这是一个项目设置,但我无法弄明白。每次我需要时,我真的不想从AVCAM开始。
有没有人碰到这个?在视图加载后立即冻结第一帧的预览图层。
任何线索? (顺便说一下,我在SDK 5.1上,armv7,在设备上运行)。
提前致谢!!
答案 0 :(得分:0)
知道了......如果有人需要它,请放在这里...... 问题是MainWindow.xib中的连接。
如果您打开MainWindow.xib,您应该看到至少2个对象:
“App View Controller”(其中App是您的应用名称)
和“Window”对象。
单击Window对象。 查看“Connections Inspector”, 在OUTLETS部分下面有一个“rootViewController”插座。 我没有映射到任何东西。因此,我单击该出口连接并将其一直拖动到对象列表中的“App View Controller”对象。 现在,“WINDOW”对象具有从rootViewController到App View Controller的连接。 如果我单击“App View Controller”对象并查看连接检查器,我还会看到从“引用插座”rootViewController到Window对象的反向连接。
并非所有应用程序在MainWIndow.xib的对象列表中都有一个App Delegate。 如果您的应用程序没有视图控制器的委托,那么您就完成了。 如果您的应用程序确实有视图控制器的委托,那么您还有一个步骤: 仍然在查看MainWindow.xib,单击您的App Delegate对象并查看Connections Inspector。在“OUTLETS”部分下,如果您看到从viewController到App View Controller的连接,请删除该连接(单击小x将其删除)。 这应该是全部。其他替代方案,如果你根本不使用委托,你可以删除它。
完成上述步骤后,我的应用就像一个魅力。 预览图层实时显示而不会冻结。
注意:此解决方案禁用委托。所以像applicationDidEnterBackground这样的一些方法将不再对你的视图控制器产生任何影响。如果需要让Delegate方法再次工作而不冻结videopreviewlayer,则可能需要更多地使用连接。也许为你的项目为视频创建第二个viewcontroller。谁知道......根据我的需要,我刚刚删除了代表。
我希望这会有所帮助。
答案 1 :(得分:0)
我遇到了类似的问题。 我正在使用AVAudioPlayer与我的AVCaptureManager一起播放声音。 我最初将AVAudioPlayer AVAudioSessionCategory设置为AVAudioSessionCategoryPlayback。 当我将其更改为AVAudioSessionCategoryPlayAndRecord时,冻结停止了。