目錄:
RTMP(一)錄屏直播理論入門
RTMP(二)搭建推流服務(wù)
RTMP (三)音視頻采集與數(shù)據(jù)封包
RTMP(四)交叉編譯與CameraX
RTMP (五)攝像頭數(shù)據(jù)處理
RTMP (六)音視頻編碼推流
RTMP
Real Time Messaging Protocol(實(shí)時(shí)消息傳輸協(xié)議)
基于TCP的應(yīng)用層協(xié)議
FFmpeg 之前相關(guān)文章
FFmpeg: 引擎哗魂,集成第三方的編解碼 協(xié)議庫(kù)
我們借助的librtmp.a 庫(kù)
FFmpeg 只能播放>>>> rtmp://域名/xxxx
librtmp.a 可以播放>>>> rtmp://ip:port/xxxx
LIBRTMP
C語(yǔ)言開源RTMP庫(kù),封裝 Socket 建立TCP通信漓雅,
并實(shí)現(xiàn)了RTMP數(shù)據(jù)的收發(fā)录别。
正如 OKHTTP 封裝了Socket完成HTTP數(shù)據(jù)的收發(fā)!
RTMPDump
主頁(yè)
引入:
預(yù)編譯: 預(yù)編譯出庫(kù)
以源碼的方式引入:如果類似ffmpeg就不適合源碼太多邻吞。RTMPDump 源碼少 都可以
RTMP直播實(shí)現(xiàn)流程
MediaProjection 視頻采集 AndroidSDK中的接口
Camera 獲取手機(jī)圖像數(shù)據(jù)
- 怎么創(chuàng)建Surface(離屏幕畫布)
- 怎么從Surface 中獲取圖像數(shù)據(jù)
virtualDisplay
獲得MediaProjection后調(diào)用createVirtualDisplay創(chuàng)建虛擬顯示器VirtualDisplay 组题,即會(huì)將手機(jī)屏幕鏡像到虛擬顯示器上。
在createVirtualDisplay時(shí)抱冷,需要傳遞一個(gè)Surface(畫布)崔列。需要獲取圖像數(shù)據(jù)即可從這個(gè)Surface中讀取。
MediaCodec 編碼
// 從編碼器創(chuàng)建一個(gè)畫布, 畫布上的圖像會(huì)被編碼器自動(dòng)編碼
Surface surface = mediaCodec.createInputSurface();
MediaCodec
MediaFormat mediaFormat =
MediaFormat.createVideoFormat(
MediaFormat.MIMETYPE_VIDEO_AVC,
360, 640);
//碼率旺遮,幀率赵讯,分辨率,關(guān)鍵幀間隔
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 400_000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);//FPS
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2);
//編碼數(shù)據(jù)源格式
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
try {
mediaCodec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
mediaCodec.configure(mediaFormat, null, null,
MediaCodec.CONFIGURE_FLAG_ENCODE);
Surface inputSurface = mediaCodec.createInputSurface();
virtualDisplay = mediaProjection.createVirtualDisplay("abc"
, 360, 640, 1, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,
inputSurface, null, null);
} catch (IOException e) {
e.printStackTrace();
}
碼率耿眉,幀率边翼,分辨率,關(guān)鍵幀間隔
碼率:?jiǎn)挝皇情g內(nèi)視頻數(shù)據(jù)的大小
幀率: 單位是間內(nèi)切換圖片數(shù)量
分辨率:平時(shí)所說(shuō)的類1080x720等
I: 能夠表示一張完整的圖像
P: 向前預(yù)測(cè)鸣剪,需要參考前面的I/P
B: 雙向组底,需要參考前面好后面的I/P
一組: gop (group)
I P P P P I P P P P 必須到第二個(gè)I幀才能播放出來(lái)丈积,也就是我們直播出來(lái)的時(shí)候有一個(gè)開屏,一般設(shè)置間隔時(shí)間(0-3s)