1

这很奇怪,超出了我的范围。如果我从 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 的 AVCAM 中,而不是将 Apple 的代码粘贴到我的应用程序中,看看这是否可行。在移动大量文件并基本上将 AVCAM 变成我的实验应用程序后,一切正常。两个项目(1-Apple 的 AVCAM 和我添加的代码和 2-我的 AVCAM 添加代码的原始项目)具有完全相同的文件和完全相同的代码。可不是闹着玩的。两个项目的类头文件和实现文件是相同的。但是,在我的原始项目中,预览层冻结并保持冻结状态。但在 AVCAM 原始项目上,预览层有效。所以我正在检查框架、构建和链接选项、SDK 版本等......我怀疑这是某个地方的项目设置,但我无法弄清楚。我真的不

有人遇到过这个吗?预览层在视图加载后立即冻结在第一帧。

有什么线索吗?(顺便说一句,我在 SDK 5.1,armv7,在设备上运行)。

提前致谢!!

4

2 回答 2

0

明白了...放在这里以防有人需要...问题是MainWindow.xib中的连接。

  • 解决方案第 1 部分

如果您打开 MainWindow.xib,您应该会看到至少 2 个对象:

“App View Controller”(其中 App 是您的应用名称)

和“窗口”对象。

单击窗口对象。查看“Connections Inspector”,在 OUTLETS 部分下有一个“rootViewController”插座。我的没有映射到任何东西。因此,我单击了该插座连接并将其一直拖到对象列表中的“App View Controller”对象。现在“WINDOW”对象有一个从 rootViewController 到 App View Controller 的连接。如果我单击“App View Controller”对象并查看连接检查器,我还会看到从“引用插座”rootViewController 到 Window 对象的反向连接。

  • 解决方案第 2 部分

并非所有应用程序在 MainWINdow.xib 的对象列表中都有 App Delegate。如果您的应用程序没有视图控制器的委托,那么您就完成了。如果您的应用确实有视图控制器的委托,那么您还有一步:仍然查看 MainWindow.xib,单击您的 App Delegate 对象并查看 Connections Inspector。在“OUTLETS”部分下,如果您看到从 viewController 到 App View Controller 的连接,请删除该连接(单击小 x 将其删除)。这应该就是全部了。其他替代方案,如果您根本不使用委托,您可以删除它。

完成上述步骤后,我的应用程序就像一个魅力。预览图层实时显示而不会冻结。

注意:此解决方案禁用委托。所以像 applicationDidEnterBackground 这样的一些方法将不再对你的视图控制器产生任何影响。如果您需要在不冻结 videopreviewlayer 的情况下让 Delegate 方法再次工作,您可能需要更多地使用连接。也许为您的视频项目创建第二个视图控制器。谁知道...出于我的需要,我刚刚删除了委托。

我希望这有帮助。

于 2012-10-25T08:36:33.990 回答
0

我遇到了类似的问题。我正在使用 AVAudioPlayer 与我的 AVCaptureManager 一起播放声音。我最初将 AVAudioPlayer AVAudioSessionCategory 设置为 AVAudioSessionCategoryPlayback。当我将其更改为 AVAudioSessionCategoryPlayAndRecord 时,冻结停止了。

于 2013-10-22T04:54:49.327 回答