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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

android gpuimage 直播,1小时学会:最简单的iOS直播推流(四)如何使用GPUImage,如何美颜...

發布時間:2024/3/13 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android gpuimage 直播,1小时学会:最简单的iOS直播推流(四)如何使用GPUImage,如何美颜... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最簡單的iOS 推流代碼,視頻捕獲,軟編碼(faac,x264),硬編碼(aac,h264),美顏,flv編碼,rtmp協議,陸續更新代碼解析,你想學的知識這里都有,愿意懂直播技術的同學快來看!!

上一篇文章介紹了如何使用系統方法捕獲視頻數據,但是更多的時候,為了使用美顏濾鏡,我們會選擇GPUImage來獲取視頻數據。

GPUImage是一個可以為錄制視頻添加實時濾鏡的一個著名第三方庫。

該框架大概原理是,使用OpenGL著色器對視頻圖像進行顏色處理,然后存到frameBuffer,之后可以對此數據再次處理。重復上述過程,即可達到多重濾鏡效果。

具體實現不細說,這里簡要介紹一下GPUImage的使用,如何美顏,如何獲取音視頻數據。

使用GPUImage

GPUImage的主要代碼在 AWGPUImageAVCapture 這個類中。

初始化AWAVCaptureManager對象時將captureType設為AWAVCaptureTypeGPUImage,就會自動調用AWGPUImageAVCapture類來捕獲視頻數據。

代碼在 onInit 方法中:

-(void)onInit{

//攝像頭初始化

// AWGPUImageVideoCamera 繼承自 GPUImageVideoCamera。繼承是為了獲取音頻數據,原代碼中,默認情況下音頻數據發送給了 audioEncodingTarget。

// 這個東西一看類型是GPUImageMovieWriter,應該是文件寫入功能。果斷覆蓋掉processAudioSampleBuffer方法,拿到音頻數據后自己處理。

// 音頻就這樣可以了,GPUImage主要工作還是在視頻處理這里。

// 設置預覽分辨率 self.captureSessionPreset是根據AWVideoConfig的設置,獲取的分辨率。設置前置、后置攝像頭。

_videoCamera = [[AWGPUImageVideoCamera alloc] initWithSessionPreset:self.captureSessionPreset cameraPosition:AVCaptureDevicePositionFront];

//開啟捕獲聲音

[_videoCamera addAudioInputsAndOutputs];

//設置輸出圖像方向,可用于橫屏推流。

_videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;

//鏡像策略,這里這樣設置是最自然的。跟系統相機默認一樣。

_videoCamera.horizontallyMirrorRearFacingCamera = NO;

_videoCamera.horizontallyMirrorFrontFacingCamera = YES;

//設置預覽view

_gpuImageView = [[GPUImageView alloc] initWithFrame:self.preview.bounds];

[self.preview addSubview:_gpuImageView];

//初始化美顏濾鏡

_beautifyFilter = [[GPUImageBeautifyFilter alloc] init];

//相機獲取視頻數據輸出至美顏濾鏡

[_videoCamera addTarget:_beautifyFilter];

//美顏后輸出至預覽

[_beautifyFilter addTarget:_gpuImageView];

// 到這里我們已經能夠打開相機并預覽了。

// 因為要推流,除了預覽之外,我們還要截取到視頻數據。這就需要使用GPUImage中的GPUImageRawDataOutput,它能將美顏后的數據輸出,便于我們處理后發送出去。

// AWGPUImageAVCaptureDataHandler繼承自GPUImageRawDataOutput,從 newFrameReadyAtTime 方法中就可以獲取到美顏后輸出的數據。

// 輸出的圖片格式為BGRA。

_dataHandler = [[AWGPUImageAVCaptureDataHandler alloc] initWithImageSize:CGSizeMake(self.videoConfig.width, self.videoConfig.height) resultsInBGRAFormat:YES capture:self];

[_beautifyFilter addTarget:_dataHandler];

// 令AWGPUImageAVCaptureDataHandler實現AWGPUImageVideoCameraDelegate協議,并且讓camera的awAudioDelegate指向_dataHandler對象。

// 將音頻數據轉到_dataHandler中處理。然后音視頻數據就可以都在_dataHandler中處理了。

_videoCamera.awAudioDelegate = _dataHandler;

//開始捕獲視頻

[self.videoCamera startCameraCapture];

//修改幀率

[self updateFps:self.videoConfig.fps];

}

AWGPUImageAVCaptureDataHandler中音視頻處理方法:

// 獲取到音頻數據,通過sendAudioSampleBuffer發送出去

-(void)processAudioSample:(CMSampleBufferRef)sampleBuffer{

if(!self.capture || !self.capture.isCapturing){

return;

}

[self.capture sendAudioSampleBuffer:sampleBuffer];

}

// 獲取到視頻數據,轉換格式后,使用sendVideoYuvData 發送出去。

-(void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex{

[super newFrameReadyAtTime:frameTime atIndex:textureIndex];

if(!self.capture || !self.capture.isCapturing){

return;

}

// GPUImage獲取到的數據是BGRA格式。

// 而各種編碼器最適合編碼的格式還是yuv(NV12格式)。

// 所以在此將BGRA格式的視頻數據轉成yuv格式。(后面會介紹yuv和pcm格式)

// 將bgra轉為yuv

int width = imageSize.width;

int height = imageSize.height;

int w_x_h = width * height;

// 1幀yuv數據長度為 寬x高 * 3 / 2

int yuv_len = w_x_h * 3 / 2;

uint8_t *yuv_bytes = malloc(yuv_len);

//使用libyuv庫,做格式轉換。libyuv中的格式都是大端(高位存高位,低位存低位),而iOS設備是小端(高位存低位,低位存高位),小端為BGRA,則大端為ARGB,所以這里使用ARGBToNV12。

//self.rawBytesForImage就是美顏后的圖片數據,格式是BGRA。

//關于大端小端,請自行baidu。

//NV12格式介紹請看下一篇文章:[1小時學會:最簡單的iOS直播推流(五)yuv、pcm數據的介紹和獲取](http://www.jianshu.com/p/d5489a8fe2a9)

[self lockFramebufferForReading];

ARGBToNV12(self.rawBytesForImage, width * 4, yuv_bytes, width, yuv_bytes + w_x_h, width, width, height);

[self unlockFramebufferAfterReading];

NSData *yuvData = [NSData dataWithBytesNoCopy:yuv_bytes length:yuv_len];

//將獲取到的yuv420數據發送出去

[self.capture sendVideoYuvData:yuvData];

}

至此,已經成功使用GPUImage獲取視頻,美顏,格式轉換,準備發送數據。還是很簡單的。

我們現在能夠使用2種方法來獲取音頻數據,接下來會介紹音視頻編碼相關內容。

文章列表

總結

以上是生活随笔為你收集整理的android gpuimage 直播,1小时学会:最简单的iOS直播推流(四)如何使用GPUImage,如何美颜...的全部內容,希望文章能夠幫你解決所遇到的問題。

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