網易雲直播 —— 會議系統開發推流

直播最主要的兩端:推流直播 和 拉流觀看。網易雲關於推流,提供了不錯的Demo 和 相應代碼。

爲了便於推流的管理和調用,我將推流功能放在了單獨Fragment中。這樣頁面中不管推流直播顯示窗口有多大,在哪個位置都不用擔心。而且,會議頁面同時會有推流 和 拉流功能,因此將推流 和 拉流分別放在Fragment中更有必要。

推流功能的,具體的集成步驟,還是建議參考官方步驟(官方有權威性和及時性,我說的是負責的官方)。Android網易雲推流集成步驟

一、libs 文件夾jar包, .so等相應文件的導入;
二、assets/filter下的濾鏡文件的導入(若使用sdk自帶濾鏡功能,必須導入);
三、AndroidManifest.xml 需要配置直播相關的權限,代碼中動態申請權限;
權限處理相關代碼:

/**   6.0權限處理     **/
private boolean bPermission = false;
private final int WRITE_PERMISSION_REQ_CODE = 100;
private boolean checkPublishPermission() {
    if (Build.VERSION.SDK_INT >= 23) {
        List<String> permissions = new ArrayList<>();
        if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(ConfigActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(ConfigActivity.this, Manifest.permission.CAMERA)) {
            permissions.add(Manifest.permission.CAMERA);
        }
        if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(ConfigActivity.this, Manifest.permission.RECORD_AUDIO)) {
            permissions.add(Manifest.permission.RECORD_AUDIO);
        }
        if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(ConfigActivity.this, Manifest.permission.READ_PHONE_STATE)) {
            permissions.add(Manifest.permission.READ_PHONE_STATE);
        }
        if (permissions.size() != 0) {
            ActivityCompat.requestPermissions(ConfigActivity.this,
                    (String[]) permissions.toArray(new String[0]),
                    WRITE_PERMISSION_REQ_CODE);
            return false;
        }
    }
    return true;
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case WRITE_PERMISSION_REQ_CODE:
            for (int ret : grantResults) {
                if (ret != PackageManager.PERMISSION_GRANTED) {
                    return;
                }
            }
            bPermission = true;
            break;
        default:
            break;
    }
}

四、在proguard-project.txt文件中 配置代碼混淆;
五、代碼編寫:
1.首先new lsMediaCapture創建推流實例


lsMediaCapture.LsMediaCapturePara lsMediaCapturePara = new lsMediaCapture.LsMediaCapturePara();
lsMediaCapturePara.setContext(getApplicationContext()); //設置SDK上下文(建議使用ApplicationContext)
lsMediaCapturePara.setMessageHandler(this); //設置SDK消息回調
lsMediaCapturePara.setLogLevel(lsLogUtil.LogLevel.INFO); //日誌級別
lsMediaCapturePara.setUploadLog(publishParam.uploadLog);//是否上傳SDK日誌
mLSMediaCapture = new lsMediaCapture(lsMediaCapturePara);

2.調用startVideoPreview打開預覽界面

NeteaseView videoView = (NeteaseView) findViewById(R.id.videoview);
boolean frontCamera = publishParam.frontCamera; // 是否前置攝像頭
boolean mScale_16x9 = publishParam.isScale_16x9; //是否強制16:9
lsMediaCapture.VideoQuality videoQuality = publishParam.videoQuality; //視頻模板(SUPER_HIGH 1280*720、SUPER 960*540、HIGH 640*480、MEDIUM 480*360、LOW 352*288)
mLSMediaCapture.startVideoPreview(videoView,frontCamera,mUseFilter,videoQuality,mScale_16x9);

// SDK 默認提供 /** 標清 480*360 */MEDIUM, /** 高清 640*480 */HIGH,
// /** 超清 960*540 */SUPER,/** 超高清 (1280*720) */SUPER_HIGH  四個模板,
// 用戶如果需要自定義分辨率可以調用startVideoPreviewEx 接口並參考以下參數
// 碼率計算公式爲 width * height * fps * 9 /100;

//        lsMediaCapture.VideoPara para = new lsMediaCapture.VideoPara();
//        para.setHeight(720);
//        para.setWidth(1280);
//        para.setFps(15);
//        para.setBitrate(1200*1024);
//        mLSMediaCapture.startVideoPreviewEx(videoView,frontCamera,mUseFilter,para);

注意:videoView 是NeteaseView ,如果畫面僅佔屏幕的局部,需要設置videoView .setFullScreen(false); 這裏默認是true,也就是畫面佔滿全屏。

3.initLiveStream初始化推流地址 及 推流參數說明LiveStreamingPara

mLiveStreamingPara = new lsMediaCapture.LiveStreamingPara();
mLiveStreamingPara.setStreamType(publishParam.streamType); // 推流類型 AV、AUDIO、VIDEO
mLiveStreamingPara.setFormatType(publishParam.formatType); // 推流格式 RTMP、MP4、RTMP_AND_MP4
mLiveStreamingPara.setRecordPath(publishParam.recordPath);//formatType 爲 MP4 或 RTMP_AND_MP4 時有效
mLiveStreamingPara.setQosOn(publishParam.qosEnable);
//mLiveStreamingPara.setSyncTimestamp(true,false);//(直播答題使用)網易雲透傳時間戳,不依賴CDN方式,不需要額外開通(必須包含視頻流)
//mLiveStreamingPara.setStreamTimestampPassthrough(true); //(直播答題使用)網易雲透傳時間戳,但完全透傳功能需要聯繫網易雲開通,支持純音頻

mLSMediaCapture.initLiveStream(mLiveStreamingPara,mliveStreamingURL);

4.startLiveStreaming開始推流,之後可以調用其他推流過程中的API

mLSMediaCapture.startLiveStreaming();

5.最後先stopLiveStreaming停止推流,再unInit反初始化推流實例釋放資源
說明:init與unInit,start與stop都要保持匹配使用

mLSMediaCapture.stopLiveStreaming();
mLSMediaCapture.stopVideoPreview();
mLSMediaCapture.destroyVideoPreview();
//反初始化推流實例,當它與stopLiveStreaming連續調用時,參數爲false
mLSMediaCapture.uninitLsMediaCapture(false);

以上五個大步驟,是網易雲推流集成到項目的基本步驟。代碼的5個步驟:實例創建、畫面預覽、參數初始化、推流、結束推流釋放資源。這些步驟構成了,大體的直播過程。
推流全過程代碼:

//以下爲SDK調用主要步驟,請用戶參考使用
//1、創建直播實例
lsMediaCapture.LsMediaCapturePara lsMediaCapturePara = new lsMediaCapture.LsMediaCapturePara();
lsMediaCapturePara.setContext(getApplicationContext()); //設置SDK上下文(建議使用ApplicationContext)
lsMediaCapturePara.setMessageHandler(this); //設置SDK消息回調
lsMediaCapturePara.setLogLevel(lsLogUtil.LogLevel.INFO); //日誌級別
lsMediaCapturePara.setUploadLog(publishParam.uploadLog);//是否上傳SDK日誌
mLSMediaCapture = new lsMediaCapture(lsMediaCapturePara);

//2、設置直播參數
mLiveStreamingPara = new lsMediaCapture.LiveStreamingPara();
mLiveStreamingPara.setStreamType(publishParam.streamType); // 推流類型 AV、AUDIO、VIDEO
mLiveStreamingPara.setFormatType(publishParam.formatType); // 推流格式 RTMP、MP4、RTMP_AND_MP4
mLiveStreamingPara.setRecordPath(publishParam.recordPath);//formatType 爲 MP4 或 RTMP_AND_MP4 時有效
mLiveStreamingPara.setQosOn(publishParam.qosEnable);
mLiveStreamingPara.setQosEncodeMode(publishParam.qosEncodeMode); //1:流暢優先, 2:清晰優先 默認流暢優先

//3、 預覽參數設置
NeteaseView videoView = (NeteaseView) findViewById(R.id.videoview);
boolean frontCamera = publishParam.frontCamera; // 是否前置攝像頭
boolean mScale_16x9 = publishParam.isScale_16x9; //是否強制16:9
if(publishParam.streamType != AUDIO){ //開啓預覽畫面
    lsMediaCapture.VideoQuality videoQuality = publishParam.videoQuality; //視頻模板(SUPER_HIGH 1280*720、SUPER 960*540、HIGH 640*480、MEDIUM 480*360、LOW 352*288)
    mLSMediaCapture.startVideoPreview(videoView,frontCamera,mUseFilter,videoQuality,mScale_16x9);
}

m_startVideoCamera = true;
if(mUseFilter){ //demo中默認設置爲乾淨濾鏡
    mLSMediaCapture.setBeautyLevel(5); //磨皮強度爲5,共5檔,0爲關閉
    mLSMediaCapture.setFilterStrength(0.5f); //濾鏡強度
    mLSMediaCapture.setFilterType(publishParam.filterType);
}


private boolean startAV(){
    //6、初始化直播
    m_liveStreamingInitFinished = mLSMediaCapture.initLiveStream(mLiveStreamingPara,mliveStreamingURL);
    if(mLSMediaCapture != null && m_liveStreamingInitFinished) {
        //7、開始直播
        mLSMediaCapture.startLiveStreaming();
        m_liveStreamingOn = true;

        if(mNeedWater){
            //8、設置視頻水印參數(可選)
            addWaterMark();
            //9、設置視頻動態水印參數(可選)
            addDynamicWaterMark();
        }
        if(mNeedGraffiti){
            //10、設置視頻塗鴉參數(可選)
            addGraffiti();
        }
        return true;
    }
    return m_liveStreamingInitFinished;
}


//停止直播調用相關API接口
if(mLSMediaCapture != null && m_liveStreamingOn) {

    //停止直播,釋放資源
    mLSMediaCapture.stopLiveStreaming();

    //如果音視頻或者單獨視頻直播,需要關閉視頻預覽
    if(m_startVideoCamera)
    {
        mLSMediaCapture.stopVideoPreview();
        //消耗第三方濾鏡
        releaseSenseEffect();
        mLSMediaCapture.destroyVideoPreview();
    }

    //反初始化推流實例,當它與stopLiveStreaming連續調用時,參數爲false
    mLSMediaCapture.uninitLsMediaCapture(false);
    mLSMediaCapture = null;
}

網易雲推流還有其他很多細節:
1、推流的中斷、恢復;(視頻、音頻);
2、伴音(視頻推流過程中,添加伴音);
3、網速測試;
4、攝像頭操作多種功能:閃光燈、變焦、對焦、前後攝像頭切換、分辨率切換、曝光度設置
5、畫面鏡像操作;
6、濾鏡相關操作;
7、水印相關操作;

具體詳情,還是建議參考官方開發指南

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章