IOS AVFoundation - avcapturevideopreviewlayer预览在第一帧冻结

时间:2012-10-24 09:38:16

标签: ios avfoundation freeze preview

这很奇怪而且超出我的范围。如果我从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,在设备上运行)。

提前致谢!!

2 个答案:

答案 0 :(得分:0)

知道了......如果有人需要它,请放在这里...... 问题是MainWindow.xib中的连接。

  • 解决方案第1部分

如果您打开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对象的反向连接。

  • 解决方案第2部分

并非所有应用程序在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时,冻结停止了。