天天看點

Android EasyRTMP 介紹

EasyRTMP是什麼?

EasyRTMP是一個EasyDarwin配套使用,也可以單獨使用的RTMP推送庫,通過EasyRTMP我們就可以避免接觸到稍顯複雜的RTMP推送流程,隻需要調用EasyRTMP的幾個API接口,就能輕松、穩定地把流媒體音視訊資料推送給Red5、Ngnix、crtmpserver等RTMP伺服器.

我們有專門的使用EasyRTMP library 實作的安卓版本的EasyRTMP,可直接将手機攝像頭或者桌面以RTMP協定推送到相關伺服器,簡單易用,易于內建.EasyRTMP的APP界面如圖所示:

Android EasyRTMP 介紹

可以看到,在首頁有如下的功能元素

- 切換分辨率

- 錄像

- 切換攝像頭

- 幀率碼率顯示

- 開啟,關閉攝像頭推送

- 開啟,關閉螢幕推送

- 設定

在此逐一介紹下:

切換分辨率

切換分辨率,即切換攝像頭的預覽分辨率.首先需要擷取到攝像頭支援的分辨率.通過如下方式擷取到攝像頭支援的分辨率:

通過如下方式設定預覽分辨率:

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

設定

設定裡面的功能如下圖所示:

Android EasyRTMP 介紹
  • 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

Android EasyRTMP 介紹