日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS:app直播---采集篇

發布時間:2025/4/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS:app直播---采集篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【如何快速的開發一個完整的iOS直播app】(采集篇)

轉載自簡書@袁崢Seemygo:http://www.jianshu.com/p/c71bfda055fa

前言

  開發一款直播app,首先需要采集主播的視頻和音頻,然后傳入流媒體服務器,本篇主要講解如何采集主播的視頻和音頻,當前可以切換前置后置攝像頭和焦點坐標。

基本知識介紹

  • AVFoundation:音視頻數據采集需要用AVFoundation框架.

  • AVCaptureDevice:硬件設備,包括麥克風、攝像頭,通過該對象可以設置物理設備的一些屬性(例如相機聚焦、白平衡等)

  • AVCaptureDeviceInput:硬件輸入對象,可以根據AVCaptureDevice創建對應的AVCaptureDeviceInput對象,用于管理硬件輸入數據。
  • AVCaptureOutput:硬件輸出對象,用于接收各類輸出數據,通常使用對應的子類AVCaptureAudioDataOutput(聲音數據輸出對象)、  AVCaptureVideoDataOutput(視頻數據輸出對象)
  • AVCaptureConnection:當把一個輸入和輸出添加到AVCaptureSession之后,AVCaptureSession就會在輸入、輸出設備之間建立連接,而且通過AVCaptureOutput可以獲取這個連接對象。
  • AVCaptureVideoPreviewLayer:相機拍攝預覽圖層,能實時查看拍照或視頻錄制效果,創建該對象需要指定對應的AVCaptureSession對象,因為AVCaptureSession包含視頻輸入數據,有視頻數據才能展示。
  • AVCaptureSession:協調輸入和輸出之間傳遞數據?
    • 系統作用:可以操作硬件設備
    • 工作原理:讓App與系統之間產生一個捕獲會話,相當于App與硬件設備有聯系了, 我們只需要把硬件輸入對象和輸出對象添加到會話中,會話就會自動把硬件輸入對象和輸出產生連接,這樣硬件輸入與輸出設備就能傳輸音視頻數據。
    • 現實生活場景:租客(輸入錢),中介(會話),房東(輸出房),租客和房東都在中介登記,中介就會讓租客與房東之間產生聯系,以后租客就能直接和房東聯系了。

捕獲音視頻步驟:官方文檔

  • 1.創建AVCaptureSession對象
  • 2.獲取AVCaptureDevicel錄像設備(攝像頭),錄音設備(麥克風),注意不具備輸入數據功能,只是用來調節硬件設備的配置。
  • 3.根據音頻/視頻硬件設備(AVCaptureDevice)創建音頻/視頻硬件輸入數據對象(AVCaptureDeviceInput),專門管理數據輸入。
  • 4.創建視頻輸出數據管理對象(AVCaptureVideoDataOutput),并且設置樣品緩存代理(setSampleBufferDelegate)就可以通過它拿到采集到的視頻數據
  • 5.創建音頻輸出數據管理對象(AVCaptureAudioDataOutput),并且設置樣品緩存代理(setSampleBufferDelegate)就可以通過它拿到采集到的音頻數據
  • 6.將數據輸入對象AVCaptureDeviceInput、數據輸出對象AVCaptureOutput添加到媒體會話管理對象AVCaptureSession中,就會自動讓音頻輸入與輸出和視頻輸入與輸出產生連接.
  • 7.創建視頻預覽圖層AVCaptureVideoPreviewLayer并指定媒體會話,添加圖層到顯示容器layer中
  • 8.啟動AVCaptureSession,只有開啟,才會開始輸入到輸出數據流傳輸。
// 捕獲音視頻 - (void)setupCaputureVideo {// 1.創建捕獲會話,必須要強引用,否則會被釋放AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];_captureSession = captureSession;// 2.獲取攝像頭設備,默認是后置攝像頭AVCaptureDevice *videoDevice = [self getVideoDevice:AVCaptureDevicePositionFront];// 3.獲取聲音設備AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];// 4.創建對應視頻設備輸入對象AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];_currentVideoDeviceInput = videoDeviceInput;// 5.創建對應音頻設備輸入對象AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];// 6.添加到會話中// 注意“最好要判斷是否能添加輸入,會話不能添加空的// 6.1 添加視頻if ([captureSession canAddInput:videoDeviceInput]) {[captureSession addInput:videoDeviceInput];}// 6.2 添加音頻if ([captureSession canAddInput:audioDeviceInput]) {[captureSession addInput:audioDeviceInput];}// 7.獲取視頻數據輸出設備AVCaptureVideoDataOutput *videoOutput = [[AVCaptureVideoDataOutput alloc] init];// 7.1 設置代理,捕獲視頻樣品數據// 注意:隊列必須是串行隊列,才能獲取到數據,而且不能為空dispatch_queue_t videoQueue = dispatch_queue_create("Video Capture Queue", DISPATCH_QUEUE_SERIAL);[videoOutput setSampleBufferDelegate:self queue:videoQueue];if ([captureSession canAddOutput:videoOutput]) {[captureSession addOutput:videoOutput];}// 8.獲取音頻數據輸出設備AVCaptureAudioDataOutput *audioOutput = [[AVCaptureAudioDataOutput alloc] init];// 8.2 設置代理,捕獲視頻樣品數據// 注意:隊列必須是串行隊列,才能獲取到數據,而且不能為空dispatch_queue_t audioQueue = dispatch_queue_create("Audio Capture Queue", DISPATCH_QUEUE_SERIAL);[audioOutput setSampleBufferDelegate:self queue:audioQueue];if ([captureSession canAddOutput:audioOutput]) {[captureSession addOutput:audioOutput];}// 9.獲取視頻輸入與輸出連接,用于分辨音視頻數據_videoConnection = [videoOutput connectionWithMediaType:AVMediaTypeVideo];// 10.添加視頻預覽圖層AVCaptureVideoPreviewLayer *previedLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession];previedLayer.frame = [UIScreen mainScreen].bounds;[self.view.layer insertSublayer:previedLayer atIndex:0];_previedLayer = previedLayer;// 11.啟動會話 [captureSession startRunning]; }// 指定攝像頭方向獲取攝像頭 - (AVCaptureDevice *)getVideoDevice:(AVCaptureDevicePosition)position {NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];for (AVCaptureDevice *device in devices) {if (device.position == position) {return device;}}return nil; }#pragma mark - AVCaptureVideoDataOutputSampleBufferDelegate // 獲取輸入設備數據,有可能是音頻有可能是視頻 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {if (_videoConnection == connection) {NSLog(@"采集到視頻數據");} else {NSLog(@"采集到音頻數據");} }

視頻采集額外功能一(切換攝像頭)

  • 切換攝像頭步驟
    • 1.獲取當前視頻設備輸入對象
    • 2.判斷當前視頻設備是前置還是后置
    • 3.確定切換攝像頭的方向
    • 4.根據攝像頭方向獲取對應的攝像頭設備
    • 5.創建對應的攝像頭輸入對象
    • 6.從會話中移除之前的視頻輸入對象
    • 7.添加新的視頻輸入對象到會話中
// 切換攝像頭 - (IBAction)toggleCapture:(id)sender {// 獲取當前設備方向AVCaptureDevicePosition curPosition = _currentVideoDeviceInput.device.position;// 獲取需要改變的方向AVCaptureDevicePosition togglePosition = curPosition == AVCaptureDevicePositionFront?AVCaptureDevicePositionBack:AVCaptureDevicePositionFront;// 獲取改變的攝像頭設備AVCaptureDevice *toggleDevice = [self getVideoDevice:togglePosition];// 獲取改變的攝像頭輸入設備AVCaptureDeviceInput *toggleDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:toggleDevice error:nil];// 移除之前攝像頭輸入設備 [_captureSession removeInput:_currentVideoDeviceInput];// 添加新的攝像頭輸入設備 [_captureSession addInput:toggleDeviceInput];// 記錄當前攝像頭輸入設備_currentVideoDeviceInput = toggleDeviceInput;}

視頻采集額外功能二(聚焦光標)

  • 聚焦光標步驟
    • 1.監聽屏幕的點擊
    • 2.獲取點擊的點位置,轉換為攝像頭上的點,必須通過視頻預覽圖層(AVCaptureVideoPreviewLayer)轉
    • 3.設置聚焦光標圖片的位置,并做動畫
    • 4.設置攝像頭設備聚焦模式和曝光模式(注意:這里設置一定要鎖定配置lockForConfiguration,否則報錯)
// 點擊屏幕,出現聚焦視圖 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {// 獲取點擊位置UITouch *touch = [touches anyObject];CGPoint point = [touch locationInView:self.view];// 把當前位置轉換為攝像頭點上的位置CGPoint cameraPoint = [_previedLayer captureDevicePointOfInterestForPoint:point];// 設置聚焦點光標位置 [self setFocusCursorWithPoint:point];// 設置聚焦 [self focusWithMode:AVCaptureFocusModeAutoFocus exposureMode:AVCaptureExposureModeAutoExpose atPoint:cameraPoint]; }/*** 設置聚焦光標位置** @param point 光標位置*/ -(void)setFocusCursorWithPoint:(CGPoint)point{self.focusCursorImageView.center=point;self.focusCursorImageView.transform=CGAffineTransformMakeScale(1.5, 1.5);self.focusCursorImageView.alpha=1.0;[UIView animateWithDuration:1.0 animations:^{self.focusCursorImageView.transform=CGAffineTransformIdentity;} completion:^(BOOL finished) {self.focusCursorImageView.alpha=0;}]; }/*** 設置聚焦*/ -(void)focusWithMode:(AVCaptureFocusMode)focusMode exposureMode:(AVCaptureExposureMode)exposureMode atPoint:(CGPoint)point{AVCaptureDevice *captureDevice = _currentVideoDeviceInput.device;// 鎖定配置 [captureDevice lockForConfiguration:nil];// 設置聚焦if ([captureDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {[captureDevice setFocusMode:AVCaptureFocusModeAutoFocus];}if ([captureDevice isFocusPointOfInterestSupported]) {[captureDevice setFocusPointOfInterest:point];}// 設置曝光if ([captureDevice isExposureModeSupported:AVCaptureExposureModeAutoExpose]) {[captureDevice setExposureMode:AVCaptureExposureModeAutoExpose];}if ([captureDevice isExposurePointOfInterestSupported]) {[captureDevice setExposurePointOfInterest:point];}// 解鎖配置 [captureDevice unlockForConfiguration]; }

?

?

?

?

轉載于:https://www.cnblogs.com/XYQ-208910/p/5859337.html

總結

以上是生活随笔為你收集整理的iOS:app直播---采集篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。