天天看點

直播軟體開發推流過程詳解

直播過程

1.相機預覽及資料采集Camera — 取資料(onPreviewFrame(Byte[] rawFrameData, Camera camera)) 

2.原始幀處理(Rotate旋轉/Scale縮放:使用Libyuv/FFmpeg等工具庫) 

3.編碼器編碼得到相應的h24資料(openh264庫編碼) 

4.發送給流媒體伺服器 (librtmp庫推流) 

5.伺服器接受及轉發

原文位址:點選打開連結

一、資料采集及預覽

1.Surfaceview+Camera 

2.GLSurfaceView +SurfaceTexture (openglees 做濾鏡美顔功能)

二、原始幀處理

onPreviewFrame 預設得到的是NV21格式的資料,需要轉換程I420 

2.1轉換I420(YUV420P)

為什麼要使用轉I420 

1.Camera預覽格式:NV21、YV12 ,預設是NV21 格式 

2.H264編碼必須要用 I420格式的YUV420 

YUV420的幾種格式

NV12,NV21,YV12,I420都屬于YUV420,但是YUV420 又分為YUV420P,YUV420SP,P與SP差別就是,前者YUV420P UV順序存儲,而YUV420SP則是UV交錯存儲,這是最大的差別,具體的yuv排序就是這樣的: 

I420: YYYYYYYY UU VV ->YUV420P 

YV12: YYYYYYYY VV UU ->YUV420P 

NV12: YYYYYYYY UVUV ->YUV420SP 

NV21: YYYYYYYY VUVU ->YUV420SP

Libyuv庫是一個專門對YUV資料進行轉換縮放旋轉的庫

YUV是Google已經開源了專門用于YUV資料的處理的庫。它擁有如下特性 

1、libYUV是一個開源的實作各種YUV,RGB色彩之間的轉換、旋轉、縮放 

2、支援windows、linux系統,支援x86、arm架構 

3、支援SSE、AVX、NEON加速,在編譯時會根據硬體平台旋轉使用的實作方式 

源碼位址: 

https://chromium.googlesource.com/libyuv/libyuv/

三、視訊編碼

3.1.MediaCodec 

NV21 格式并不是所有機器的 MediaCodec 都支援這種格式作為編碼器的輸入格式。 是以,在初始化 MediaCodec 的時候,我們需要通過 codecInfo.getCapabilitiesForType 來查詢機器上的 MediaCodec 實作具體支援哪些 YUV 格式作為輸入格式。一般來說,起碼在 4.4+ 的系統上,這兩種格式在大部分機器上都有支援: 

MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar 

MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar 

兩種格式分别是 YUV420P 和 NV21,如果機器上隻支援 YUV420P 格式,則需要先将攝像頭輸出的 NV21 格式先轉換成 YUV420P,才能送入編碼器進行編碼,否則最終出來的視訊就會花屏,或者顔色出現錯亂。

3.2.FFMpeg+x264/openh264 

H264編碼必須要用 I420格式

3.3軟硬編對比 

從上面的分析來看,硬編的好處主要在于速度快,而且系統自帶,不需要引入外部的庫,但是特性支援有限,而且硬編的壓縮率一般偏低。對于軟編碼來說,雖然速度較慢,但是壓縮率比較高,而且支援的 H264 特性也會比寫死多很多,相對來說比較可控。就可用性而言,在 4.4+的系統上,MediaCodec 的可用性是能夠基本保證的,但是不同等級機器的編碼器能力會有不少差别,建議可以根據機器的配置,選擇不同的編碼器配置。

四、rtmp推流

使用librtmp庫推流

五、伺服器搭建

nginx-rtmp-module搭建rtmp流媒體伺服器

本文轉自

https://blog.csdn.net/jigetage/article/details/80813278?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160085322419195162109797%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160085322419195162109797&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduend~default-6-80813278.pc_v2_rank_blog_v1&utm_term=%E6%8E%A8%E6%B5%81&spm=1018.2118.3001.4187

,僅作分享用

繼續閱讀