直播中攝像頭切換功能實現

目前我知道有兩種實現方法.
1.基于 AVFoundation 實現
2.利用 GPUImage 框架實現

一.利用 AVFoundation 實現攝像頭切換

步驟分析:

1.獲取當前的攝像頭位置狀態

  • 是前置攝像頭還是后置攝像頭

2.設置我們需要改變的攝像頭的位置狀態.

  • 如果是前置,那么就改成后置;如果是后置.那么就改成前置

3.根據我們新設置的攝像頭位置狀態來獲取改變后的攝像頭設備及輸入設備

4.移除之前的攝像頭設備.

5.添加新的攝像頭設備到會話中.

6.并跟新記錄

代碼示例

#pragma mark - 切換攝像頭
- (IBAction)SWAPMethod:(UIButton *)sender {
    
    [self.avCaptureSession beginConfiguration];
    
    // 1.獲取當前設備攝像頭位置
    AVCaptureDevicePosition currentPosition = self.currentVideoDeviceInput.device.position;
    // 2.獲取需要改變的方向
    AVCaptureDevicePosition needChangePosition = currentPosition == AVCaptureDevicePositionFront ? AVCaptureDevicePositionBack : AVCaptureDevicePositionFront;
    // 3.根據需要改變的方向來獲取攝像頭設備
    AVCaptureDevice *needChangeDevice = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInWideAngleCamera mediaType:AVMediaTypeVideo position:needChangePosition];
    // 4.獲取新的攝像頭輸入設備
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:needChangeDevice error:nil];
    // 5.移除之前的攝像頭輸入設備
    [self.avCaptureSession removeInput:self.currentVideoDeviceInput];
    // 6.添加新的攝像頭輸入設備
    [self.avCaptureSession addInput:deviceInput];
    // 7.記錄當前攝像頭輸入設備
    self.currentVideoDeviceInput = deviceInput;

    [self.avCaptureSession commitConfiguration];
    
}

二.利用 GPUImage 框架實現攝像頭切換功能

只需調用一個方法

  • -(void)rotateCamera;
// 譯 : 切換前后攝像頭
/** This flips between the front and rear cameras
 */
- (void)rotateCamera;

用這個方法就可以非常方便的切換攝像頭了!
下面是這個方法的實現:

- (void)rotateCamera
{
    if (self.frontFacingCameraPresent == NO)
        return;
    
    NSError *error;
    AVCaptureDeviceInput *newVideoInput;
    AVCaptureDevicePosition currentCameraPosition = [[videoInput device] position];
    
    if (currentCameraPosition == AVCaptureDevicePositionBack)
    {
        currentCameraPosition = AVCaptureDevicePositionFront;
    }
    else
    {
        currentCameraPosition = AVCaptureDevicePositionBack;
    }
    
    AVCaptureDevice *backFacingCamera = nil;
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    for (AVCaptureDevice *device in devices) 
    {
        if ([device position] == currentCameraPosition)
        {
            backFacingCamera = device;
        }
    }
    newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:backFacingCamera error:&error];
    
    if (newVideoInput != nil)
    {
        [_captureSession beginConfiguration];
        
        [_captureSession removeInput:videoInput];
        if ([_captureSession canAddInput:newVideoInput])
        {
            [_captureSession addInput:newVideoInput];
            videoInput = newVideoInput;
        }
        else
        {
            [_captureSession addInput:videoInput];
        }
        //captureSession.sessionPreset = oriPreset;
        [_captureSession commitConfiguration];
    }
    
    _inputCamera = backFacingCamera;
    [self setOutputImageOrientation:_outputImageOrientation];
}

其實和我們用 AVFoundation 實現幾乎一樣.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容