EasyRTMP是什麼?
EasyRTMP是一個EasyDarwin配套使用,也可以單獨使用的RTMP推送庫,通過EasyRTMP我們就可以避免接觸到稍顯複雜的RTMP推送流程,隻需要調用EasyRTMP的幾個API接口,就能輕松、穩定地把流媒體音視訊資料推送給Red5、Ngnix、crtmpserver等RTMP伺服器.
我們有專門的使用EasyRTMP library 實作的安卓版本的EasyRTMP,可直接将手機攝像頭或者桌面以RTMP協定推送到相關伺服器,簡單易用,易于內建.EasyRTMP的APP界面如圖所示:
可以看到,在首頁有如下的功能元素
- 切換分辨率
- 錄像
- 切換攝像頭
- 幀率碼率顯示
- 開啟,關閉攝像頭推送
- 開啟,關閉螢幕推送
- 設定
在此逐一介紹下:
切換分辨率
切換分辨率,即切換攝像頭的預覽分辨率.首先需要擷取到攝像頭支援的分辨率.通過如下方式擷取到攝像頭支援的分辨率:
通過如下方式設定預覽分辨率:
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(width, height);
...
mCamera.setParameters(parameters);
切換分辨率時,先關閉預覽,重新設定分辨率,再開啟預覽即可:
mCamera.stopPreview();
// 設定新分辨率
...
mCamera.startPreview();
錄像
錄像是通過EasyMuxer來進行錄像的.EasyMuxer是對MediaMuxer進行的一個封裝,通過簡單的一些接口即可進行便捷錄像\更換檔案\關閉錄像等功能.同時,EasyMuxer可對PCM音頻格式進行錄像,這樣任何類型的音頻編碼資料都可以在先解碼後,再編成AAC來錄像成.MP4格式.EasyMuxer的介紹見部落格文章:http://blog.csdn.net/jyt0551/article/details/72787095
切換攝像頭
切換攝像頭跟切換分辨率類似,都是先要把目前預覽關閉,再重新打開.不同的是,切換攝像頭時,需要将攝像頭release再重新open,而切換分辨率隻用stopPreview再startPreview即可.
stopPreview();
destroyCamera();
if (mCameraId == Camera.CameraInfo.CAMERA_FACING_FRONT) {
//現在是後置,變更為前置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//代表攝像頭的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK後置
mCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
createCamera();
startPreview();
break;
}
} else {
//現在是前置, 變更為後置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {//代表攝像頭的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK後置
mCameraId = Camera.CameraInfo.CAMERA_FACING_FRONT;
createCamera();
startPreview();
break;
}
}
顯示幀率碼率
為了友善處理,幀率碼率的統計放在了推送端.即統計某一時間段内發送的視訊幀數和位元組數,然後除以時間段得出結果.這裡使用EventBus POST出去即可.上層捕獲到該Event後,進行展示.
mTotal += length;
if (type == ){
mTotalFrms++;
}
long interval = System.currentTimeMillis() - pPreviewTS;
if (interval >= ){
long bps = mTotal * / (interval);
long fps = mTotalFrms * / (interval);
Log.i(TAG, String.format("bps:%d, fps:%d", fps, bps));
pPreviewTS = System.currentTimeMillis();
mTotal = ;
mTotalFrms = ;
BUS.post(new StreamStat((int)fps, (int)bps));
}
上層捕獲并顯示:
@Subscribe
public void onStreamStat(final StreamStat stat) {
streamStat.post(new Runnable() {
@Override
public void run() {
streamStat.setText(getString(R.string.stream_stat, stat.fps, stat.bps / ));
}
});
}
開啟,關閉攝像頭推送
當未推送的時候,點選按鈕即可發起推送.這時候,初始化Pusher庫,初始化成功後,得到Pusher句柄,後續的Push接口裡會根據該值來判斷是否進行真正的推送動作.
當推送開始時,點選按鈕可關閉推送.相應地進行反初始化,這樣在Push接口就不會進行推送了.
開啟,關閉螢幕推送
推送螢幕主要在RecordService服務裡進行的.點選推送按鈕時,先開啟服務:
Intent intent = new Intent(getApplicationContext(), RecordService.class);
startService(intent);
具體來說,MediaProjection 類可以将目前螢幕畫面采集到一個surface裡面,而MediaCodec可以從一個surface裡面擷取視訊資料源。我們讓MediaProjection投射到MediaCodec建立的Surface,MediaCodec就可以擷取到MediaProjection投射的視訊了.
關閉螢幕推送時,停止伺服器,在服務内部 onDestory時,反初始化相關資源.
有關螢幕推送更詳細的描述,見:
http://blog.csdn.net/jyt0551/article/details/72787095
設定
設定裡面的功能如下圖所示:
- URL可以設定要推送的流位址,用戶端亦可用改位址進行播放;
- 是否使能攝像頭背景采集.如果使能的話,推送将在APP轉到背景時繼續.
- 是否使用軟編碼?如果使能,那麼app會使用x264軟編碼推送
- 疊加水印 如果使能, 那麼視訊上面會疊加一些水印資訊.目前可現實文字水印,文字内容在APP内可以設定
- 僅推送音頻 如果使能,那則不會推送視訊,僅推送聲音.
- 打開錄像檔案夾 點選後會打開在APP内産生的錄像片段,可以進行便捷檢視
- 版本号顯示
- 儲存設定并推出設定界面
EasyRTMP項目介紹
EasyRTMP是EasyDarwin團隊開發的一套RTMP直播推送功能元件,内部內建了包括:基本RTMP協定、斷線重連、異步推送、環形緩沖區、推送網絡擁塞自動丢幀、緩沖區關鍵幀檢索、事件回調(斷線、音視訊資料回調),通過EasyRTMP我們就可以避免接觸到稍顯複雜的RTMP推送或者用戶端流程,隻需要調用EasyRTMP的幾個API接口,就能輕松、穩定地進行流媒體音視訊資料的推送,支援市面上絕大部分的RTMP流媒體伺服器,包括Red5、Ngnix_rtmp、crtmpserver等主流RTMP伺服器,全平台支援:Windows、Linux、ARM(各種交叉編譯工具鍊)、Android、iOS;
EasyRTMP項目位址:https://github.com/EasyDarwin/EasyRTMP
擷取更多資訊
郵件:[email protected]
WEB:www.EasyDarwin.org
Copyright © EasyDarwin.org 2012-2017