【问题标题】:How to Put Slider that increase decrease brightness of camera in AVCaptureSession如何在 AVCaptureSession 中放置增加相机亮度的滑块
【发布时间】:2013-07-30 11:05:55
【问题描述】:

到目前为止,我已经展示了相机在其中放置了一个滑块,现在可以缩小相机但现在我想放置另一个滑块来增加和降低我搜索过的相机的亮度,我需要使用 AVCaptureVideoDataOutput 并拍摄单帧我可以使用委托方法并处理它并使用该框架做你想做的事情我在下面发布我的代码并解释其中的其他内容

    AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
   // AVCaptureVideoDataOutput
    if (videoDevice) {
        NSError *error;
        AVCaptureDeviceInput *videoIn = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
        if (!error) {
            if ([[self captureSession] canAddInput:videoIn])
                [[self captureSession] addInput:videoIn];
            else
                NSLog(@"Couldn't add video input");     
        }
        else
            NSLog(@"Couldn't create video input");
    }
    else
        NSLog(@"Couldn't create video capture device");

    AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];
    /*
     RosyWriter prefers to discard late video frames early in the capture pipeline, since its
     processing can take longer than real-time on some platforms (such as iPhone 3GS).
     Clients whose image processing is faster than real-time should consider setting AVCaptureVideoDataOutput's
     alwaysDiscardsLateVideoFrames property to NO.
     */
    [videoOut setAlwaysDiscardsLateVideoFrames:YES];
    [videoOut setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
    dispatch_queue_t videoCaptureQueue = dispatch_queue_create("Video Capture Queue", DISPATCH_QUEUE_SERIAL);
    [videoOut setSampleBufferDelegate:self queue:videoCaptureQueue];
    dispatch_release(videoCaptureQueue);
    if ([captureSession canAddOutput:videoOut])
        [captureSession addOutput:videoOut];
}

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{

      I HAVE READ THAT NEED TO PROCESS FRAME AND THEN SEND IT BACK TO SESSION BUT HOW I DONT KNOW 
        THIS IS THE DELEGATE METHOD WHERE I GET FRAME NOW I DONT UNDERSTAND HOW TO PROCESS THIS 
FRAME WHAT SHOULD I DO SO I CAN INCREASE AND DECREASE BRIGHTNESS OF CAMERA PLEASE HELP ME IF YOU KNOW 
  }

【问题讨论】:

标签: iphone ios avcapturesession


【解决方案1】:

为此,只需使用以下代码设置 mainScreen 的亮度..

[[UIScreen mainScreen] setBrightness:sliderValue];

在滑块值设置值从 0 到 1 如下所示..

yourSlider.minimumValue = 0.f;
yourSlider.maximumValue = 1.0f;

及其UIControlEventValueChanged 调用任何类似波纹管的方法并更改值,请参见下面的示例..

- (void)Brightness_Changed:(UISlider *)sender
{
    [[UIScreen mainScreen] setBrightness:sender.value];
}

【讨论】:

  • 我的兄弟帕拉什不想改变 mainScreen 的亮度,需要从相机中获取帧并对其进行处理,然后将其点亮并返回到 AVCaptureSession。该委托方法被当前相机帧连续调用
  • 你写的是增加减少相机,所以这是你可以做到的一种方式,所以我发布这个答案并且它也可以工作:)
  • 我已经尝试过了,但是它改变了我们不想要的设备亮度。而它只有0到1之间,只能通过帧处理来实现像太阳一样的亮度和像夜晚一样的黑暗:(
  • 是的,它的工作方式是这样的,例如 alpha 或 sun and night 但在这里您只想在一个视图或此主屏幕的一部分中执行此过程,对吗??
  • 当我们按照你说的方式做事时,又做了一件事,所以是的,设备亮度正在增加和减少,所以当用户按下主页按钮时,我们应该将亮度改回正常,对吗?所以为此我尝试了 applicationinbackground 应用程序委托方法,我将亮度设置为 1 并且没有工作,然后我尝试了默认通知,但它没有任何想法
【解决方案2】:

@Paras Joshi 的回答非常完美

我只是为 swift 用户更新答案

@IBOutlet weak var slider : UISlider!

将滑块最小值设置为 0,最大值设置为 1,然后在视图中加载只是将滑块的当前值设置为主屏幕。

UIScreen.main.brightness = CGFloat(slider.value)

最终创建滑块值变化的动作并赋予主屏幕值

@IBAction func slider_value_changed(_ sender: UISlider) {
    UIScreen.main.brightness = CGFloat(sender.value)
}

您已准备好构建并运行您的项目

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-17
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多