【问题标题】:Objective-c Changing UIImagePickerController to video modeObjective-c 将 UIImagePickerController 更改为视频模式
【发布时间】:2011-09-22 14:02:17
【问题描述】:

我有一个应用程序,我希望它在后台显示来自摄像机的视频源。我的视图控制器中有以下代码:

#if !TARGET_IPHONE_SIMULATOR
    imagePickerController = [[UIImagePickerController alloc] initWithRootViewController:self];
    imagePickerController.delegate = self;
    imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;

    imagePickerController.navigationBarHidden = YES;
    imagePickerController.toolbarHidden = NO;
    imagePickerController.showsCameraControls = NO;
    //...
    [self.view addSubview:self.imagePickerController.view];
    [imagePickerController viewWillAppear:YES];
    [imagePickerController viewDidAppear:YES];
 #endif 
   //...
  [self.view addSubview:otherthings];

然后我在顶部添加其他视图,我也有声音。但是,我将图像选择器模式更改为视频,但在播放声音时它会冻结。这是我改变的:

#if !TARGET_IPHONE_SIMULATOR
    imagePickerController = [[UIImagePickerController alloc] init];//initWithRootViewController:self];
    imagePickerController.delegate = self;
    imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;

    NSArray *mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
    NSArray *videoMediaTypesOnly = [mediaTypes filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(SELF contains %@)", @"movie"]];
    BOOL movieOutputPossible = (videoMediaTypesOnly != nil);

    if (movieOutputPossible) {
        imagePickerController.mediaTypes = videoMediaTypesOnly;
        imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;
        imagePickerController.navigationBarHidden = YES;
        imagePickerController.toolbarHidden = YES;
        imagePickerController.showsCameraControls = NO;                      
    }


#endif 

谁知道为什么当声音播放时相机选择器会冻结?顺便说一下,声音是一个 AVAudioPlayer。

【问题讨论】:

  • 为什么在alloc的时候把rootViewController的定义去掉了?
  • 不知道,试过之后它只会在我播放声音时冻结。为什么?
  • 很可能你有一些东西在做自动释放,你应该分配你自己的东西来保存。具体来说,我将从这两行开始:(NSArray *mediaTypes =) 和 (NSArray *videoMediaTypesOnly =)。这些都是在您无法控制的情况下自动释放的,可能会导致问题。
  • 即使我删除它并添加 imagePickerController.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];播放声音时它仍然冻结。当声音结束时,相机并没有解冻。
  • 不确定我明白了...您是说在播放 AVAudioPlayer 声音时电影播放冻结,然后在声音播放完毕后恢复播放?

标签: objective-c video uiimagepickercontroller


【解决方案1】:

解决方案:使用 AVFOundation 代替 UIImagePickerController。

    videoBackground = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480.0)];

    AVCaptureSession *session = [[AVCaptureSession alloc] init];
    session.sessionPreset = AVCaptureSessionPresetMedium;


    CALayer *viewLayer = videoBackground.layer;
    NSLog(@"viewLayer = %@", viewLayer);

    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];

    captureVideoPreviewLayer.frame = videoBackground.bounds;
    [videoBackground.layer addSublayer:captureVideoPreviewLayer];

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    NSError *error = nil;
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
    if (!input) {
        // Handle the error appropriately.
        NSLog(@"ERROR: trying to open camera: %@", error);
    }
    [session addInput:input];
    [session startRunning];
    [self.view addSubview:videoBackground];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多