日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

Link Visual視頻Media SDK

Link Visual App端SDK提供了音視頻播放、語音對講等功能。

依賴SDK

概述

API通道

提供API通道能力

初始化

初始化的操作請參見SDK初始化

依賴引入

// 1. 在根目錄下的build.gradle中添加Aliyun Maven倉庫的引用
allprojects {
    repositories {
        maven {
            url "http://maven.aliyun.com/nexus/content/repositories/releases"
        }
    }
}

// 2. App build.gradle中添加依賴
implementation('com.aliyun.iotx:linkvisual-media:2.7.5-ilop')

更多版本發布信息請看Link Visual SDK更新記錄

混淆配置

# keep and don't warn Link Visual

-dontwarn com.aliyun.iotx.linkvisual.**

-keep class com.aliyun.iotx.** {*;}
-keep class com.aliyun.iotx.linkvisual.media.** { *; }

SDK接口文檔

LinkVisual Media SDK文檔(Android)

播放器

視頻播放器按功能分為三種。

  • 直播播放器

    • 支持接入LinkVisual設備的直播播放。

    • 具有播放延遲低的特性。

    • 具備與設備之間P2P的通信能力。

  • 點播播放器 (設備錄像)

    • 用于設備本地錄像回放的播放,可調整播放進度。

    • 具備與設備之間P2P的通信能力。

  • 點播播放器(HLS云存錄像)

    • 用于基于HLS的云端錄像回放的播放,支持MPEG-TS和fMP4容器,AES-128加密方式。

播放器功能表

功能

直播播放器

點播播放器(設備錄像)

點播播放器(HLS云存錄像)

視頻播放

?

?

?

音頻播放

?

?

?

暫停/恢復

-

?

?

播放重連

?

-

-

跳至指定位置播放

-

?

?

總時長

-

?

?

當前播放進度

-

?

?

播放器狀態變更通知

?

?

?

播放靜音

?

?

?

變速播放

-

?

?

單幀步進

-

?

?

畫面縮放模式設置

?

?

?

播放停止時顯示模式設置

?

?

?

NVR多畫面播放

?

?

?

數字變焦

?

?

?

播放窗口截圖

?

?

?

截圖到文件

?

?

?

邊播邊錄

?

?

?

硬解碼

?

?

?

獲取碼流信息

?

?

?

提供YUV數據

?

?

?

提供原始碼流數據

?

?

?

提供SEI數據

?

?

?

播放器的使用示例:

  • 直播播放器

    // 構造播放器實例
    LVLivePlayer player = new LVLivePlayer(getApplicationContext());
    
    // 設置textureview,可使用SDK提供的帶畫面縮放的ZoomableTextureView組件, 畫面不旋轉
    player.setTextureView(zoomableTextureView, LVVideoRotationMode.LV_VIDEO_ROTATE_0_CLOCKWISE);
    // 設置必要的監聽
    player.setPlayerListener(new ILVPlayerListener() {
        @Override
        public void onError(LVPlayerError error) {
            // 播放報錯
        }
        @Override
        public void onPlayerStateChange(LVPlayerState state) {
            Log.d(TAG, "play state= " + state.name());
            switch (state) {
                case STATE_BUFFERING:
                    // 顯示正在緩沖
                    break;
                case STATE_IDLE:
                    break;
                case STATE_READY:
                    // 隱藏正在緩沖
                    updatePlayInfo();
                    break;
                case STATE_ENDED:
                    // 隱藏正在緩沖
                    break;
                default:
                    break;
            }
        }
        @Override
        public void onRenderedFirstFrame(int elapsedTimeInMs) {
            // 顯示回調,elapsedTimeInMs為出圖耗時
        }
        @Override
        public void onVideoSizeChanged(int width, int height) {
            // 寬高變化回調
        }
        @Override
        public void onSeiInfoUpdate(byte[] buffer, int length, long timeStamp) {
            // 碼流中私有格式的SEI數據幀回調,不再建議使用
        }
        @Override
        public void onStandardSeiInfoUpdate(byte[] buffer, int length, long timeStamp) {
            // 碼流中標準的SEI數據幀回調
        }
        @Override
        public void onVideoJitterBufferEmpty() {
        }
    });
    
    // 設置數據源,數據源為設備的IotId
    player.setLiveDataSource(iotId, LVStreamType.LV_STREAM_TYPE_MAJOR);
    // 設置自動重連次數
    player.setReconnectCount(3);
    // 設置解碼策略為硬解碼優先
    player.setDecoderStrategy(LVDecoderStrategy.LV_DECODER_STRATEGY_HARDWARE_FIRST);
    // 設置畫面模式為保持寬高
    player.setVideoScalingMode(LVVideoScalingMode.LV_VIDEO_SCALING_MODE_FIT);
    // 設置播放停止時保留最后一幀畫面
    player.setPlayerStoppedDrawingMode(LVPlayerStoppedDrawingMode.LV_ALWAYS_KEEP_LAST_FRAME);
    ...
    // 開始播放
    player.start();
    ...
    // 停止播放
    player.stop();
    ...
    // 釋放播放器資源
    player.release();     
  • 點播播放器 (設備錄像)

    // 構造播放器實例
    LVVodPlayer player = new LVVodPlayer(getApplicationContext());
    // 設置textureview,可使用SDK提供的帶畫面縮放的ZoomableTextureView組件
    player.setTextureView(zoomableTextureView);
    
    // 設置必要的監聽
    player.setPlayerListener(new ILVPlayerListener() {
        @Override
        public void onError(LVPlayerError error) {
            // 播放報錯
        }
        @Override
        public void onPlayerStateChange(LVPlayerState state) {
            Log.d(TAG, "play state= " + state.name());
            switch (state) {
                case STATE_BUFFERING:
                    // 顯示正在緩沖
                    break;
                case STATE_IDLE:
                    break;
                case STATE_READY:
                    // 隱藏正在緩沖
                    updatePlayInfo();
                    break;
                case STATE_ENDED:
                    // 隱藏正在緩沖
                    break;
                default:
                    break;
            }
        }
        @Override
        public void onRenderedFirstFrame(int elapsedTimeInMs) {
            // 顯示回調,elapsedTimeInMs為出圖耗時
        }
        @Override
        public void onVideoSizeChanged(int width, int height) {
            // 寬高變化回調
        }
        @Override
        public void onSeiInfoUpdate(byte[] buffer, int length, long timeStamp) {
            // 碼流中私有格式的SEI數據幀回調,不再建議使用
        }
        @Override
        public void onStandardSeiInfoUpdate(byte[] buffer, int length, long timeStamp) {
            // 碼流中標準的SEI數據幀回調
        }
        @Override
        public void onVideoJitterBufferEmpty() {
        }
    });
    
    // 設置播放完成監聽
    player.setVodCompletionListener(new ILVVodPlayerCompletionListener() {
        @Override
        public void onCompletion() {
            // 播放完成
        }
    });
    
    // 設置數據源:以下兩種方式都可以
    // 1. 按設備文件名,初始播放偏移為20S
    player.setDataSourceByLocalRecordFileName(iotId, "fileNamexxxxxxxx", 20000);
    // 2. 按設備時間,從2022-08-29 17:54:14到2022-08-30 02:47:34的錄像,初始播放偏移為20S,類型為所有錄像
    player.setDataSourceByLocalRecordTime(iotId, 1661766854, 1661798854, 20000, 99);
    
    // 設置解碼策略為硬解碼優先
    player.setDecoderStrategy(LVDecoderStrategy.LV_DECODER_STRATEGY_HARDWARE_FIRST);
    // 設置畫面模式為保持寬高
    player.setVideoScalingMode(LVVideoScalingMode.LV_VIDEO_SCALING_MODE_FIT);
    ...
    // 開始播放
    player.start();
    ...
    // 暫停
    player.pause();
    ...
    // 恢復
    player.resume();
    ...
    // 停止播放
    player.stop();
    ...
    // 釋放播放器資源
    player.release();                 
  • 點播播放器(HLS云存)

    // 構造播放器實例
    LVVodPlayer player = new LVVodPlayer(getApplicationContext());
    // 設置textureview,可使用SDK提供的帶畫面縮放的ZoomableTextureView組件
    player.setTextureView(zoomableTextureView);
    // 設置必要的監聽
    player.setPlayerListener(new ILVPlayerListener() {
        @Override
        public void onError(LVPlayerError error) {
            // 播放報錯
        }
        @Override
        public void onPlayerStateChange(LVPlayerState state) {
            Log.d(TAG, "play state= " + state.name());
            switch (state) {
                case STATE_BUFFERING:
                    // 顯示正在緩沖
                    break;
                case STATE_IDLE:
                    break;
                case STATE_READY:
                    // 隱藏正在緩沖
                    updatePlayInfo();
                    break;
                case STATE_ENDED:
                    // 隱藏正在緩沖
                    break;
                default:
                    break;
            }
        }
        @Override
        public void onRenderedFirstFrame(int elapsedTimeInMs) {
            // 顯示回調,elapsedTimeInMs為出圖耗時
        }
        @Override
        public void onVideoSizeChanged(int width, int height) {
            // 寬高變化回調
        }    
        @Override
        public void onSeiInfoUpdate(byte[] buffer, int length, long timeStamp) {
            // 碼流中私有格式的SEI數據幀回調,不再建議使用
        }
        @Override
        public void onStandardSeiInfoUpdate(byte[] buffer, int length, long timeStamp) {
            // 碼流中標準的SEI數據幀回調
        }
        @Override
        public void onVideoJitterBufferEmpty() {
        }
    });
    // 設置播放完成監聽
    player.setVodCompletionListener(new ILVVodPlayerCompletionListener() {
        @Override
        public void onCompletion() {
            // 播放完成
        }
    });
    
    // 設置數據源,按云存文件名,初始播放偏移為20S
    player.setDataSourceByCloudRecordFileName(iotId, "fileNamexxxxxxxx", 20000);
    
    // 設置解碼策略為硬解碼優先
    player.setDecoderStrategy(LVDecoderStrategy.LV_DECODER_STRATEGY_HARDWARE_FIRST);
    // 設置畫面模式為保持寬高
    player.setVideoScalingMode(LVVideoScalingMode.LV_VIDEO_SCALING_MODE_FIT);
    ...
    // 開始播放
    player.start();
    ...
    // 暫停
    player.pause();
    ...
    // 恢復
    player.resume();
    ...
    // 停止播放
    player.stop();
    ...
    // 釋放播放器資源
    player.release();                 

播放器狀態介紹

通過設置播放器狀態監聽器,可接收到狀態變更事件,用于相關UI元素的變更。

狀態變更事件如:播放中發生錯誤、主動停止播放等。

播放器狀態圖

  • IDLE:播放器沒有任何內容播放時的狀態。

  • BUFFERING:播放器正在緩沖,當前的位置還不可以播放。狀態變更事件如:開始播放時緩沖、seekTo()后重新緩沖、網絡不佳引起點播緩沖。

  • READY:播放器已經有內容在播放。狀態變更事件如:首幀數據已經渲染、seekTo()緩沖完成開始播放新內容。對于點播播放器,若已seekTo()或播放到文件結尾,則會回調OnCompletionListener.onCompletion()方法,狀態會自動切換到ENDED。

  • ENDED:播放器已結束播放。播放出錯或stop()或播放結束后會切換到該狀態。

播放器錯誤列表

錯誤主碼

錯誤子碼

描述

解決辦法

LV_PLAYER_ERROR_CODE_SOURCE

LV_PLAYER_ERROR_SUB_CODE_SOURCE_STREAM_CONNECT

與數據源建立連接失敗

通常因網絡問題引起連接失敗,請您確保網絡正常后重試。

LV_PLAYER_ERROR_SUB_CODE_SOURCE_INVALID_PARAMETER

錯誤的數據源參數

請檢查配置參數是否合法,然后重試。

LV_PLAYER_ERROR_SUB_CODE_SOURCE_QUERY_URL_FAILED

請求播放地址失敗

請根據錯誤信息中msg字段的描述,確定問題并修復。

LV_PLAYER_ERROR_CODE_RENDER

LV_PLAYER_ERROR_SUB_CODE_RENDER_DECODE

解碼錯誤

若在持續一段時間內,解碼均發生失敗,您可轉存碼流數據,然后分析數據。轉存的操作步驟如下:

  • 運行命令adb shell setprop debug.lv.dump.enable true

  • 重啟應用然后播放視頻。

  • 運行命令adb pull /sdcard/Android/data/${pkgname}/files/LinkVisual_dump/ 拉取。

LV_PLAYER_ERROR_CODE_UNEXPECTED

LV_PLAYER_ERROR_SUB_CODE_UNEXPECTED_PULL_STREAM_TIMEOUT

超過8秒未拉取到流或連接被異常斷開

請檢查以下項目然后重試:1、檢查設備是否未推流;2、檢查應用端和設備端的網絡是否異常。

LV_PLAYER_ERROR_SUB_CODE_UNEXPECTED_PLAY_DURATION_EXCEED

連續播放時長超過上限

避免長時間的無人播放消耗不必要的帶寬,如果您有連續觀看的需求可以考慮升級流量套餐服務來解除該限制。

語音對講

提供App和IPC設備之間端到端的單/雙向實時對講能力。

  • 單講:App端采集并發送音頻數據到設備端進行播放,App端采集音頻期間手機保持聲音靜默。

  • 全雙工對講:App端和設備端都需要同時做采音和放音,設備端必須支持AEC,否則不建議使用該方案。

  • 半雙工對講:APP端和設備端都需要做采音和放音,一端上始終不會出現同時采音和放音的情況,因此設備不要求支持AEC,使用上類似對講機,由APP端在一次對講會話中可多次人為控制錄音的開啟和結束。

支持以下格式的音頻。

類型

采樣率

編碼

解碼

G711A

8Khz/16Khz

?

?

G711U

8Khz/16Khz

?

?

AAC_LC

8Khz/16Khz

?

?

語音對講使用方式:

  1. 創建語音對講實例,并設置音頻參數。

    liveIntercom = new LVLiveIntercom(getApplicationContext(), AudioParams.AUDIOPARAM_MONO_8K_G711A);
  2. 注冊監聽器,并處理語音對講回調。

    請在對應的事件回調中處理,包括對講開始、錄音開始和結束、音量回調(用于UI展示)。

    在語音通道建立和對講過程中,可能發生的錯誤詳見語音對講錯誤列表。

    liveIntercom.setLiveIntercomListener(new ILVLiveIntercomListener() {
        @Override
        public void onTalkReady() {
            // 對端已鏈接,可以開始說話了
        }
        @Override
        public void onRecorderStart() {
            speakBtn.setEnabled(false);
            // 錄音開啟
        }
        @Override
        public void onRecorderEnd() {
            // 錄音結束
        }
        @Override
        public void onRecorderVolume(int volume) {
        }
        @Override
        public void onError(LVLiveIntercomError error) {
            // 對講發生錯誤:code: + error.getCode() + error.getSubCode() +  msg: + error.getMessage());
        }});
    }
  3. 設置增益水平。

    可以設置App端聲音采集的增益值,提供“-1 - None, 0 - Mild, 1 - Medium , 2 - high , 3 - Aggressive , 4 - very Aggressive , 5 - Max”六種水平供選擇(默認值為無),請根據設備效果來調整。

    liveIntercom.setGainLevel(-1);
  4. 設置對講模式。

    提供五種模式供選擇:

    • 單講:App端采集并發送音頻數據到設備端進行播放,App端采集音頻期間手機保持聲音靜默。

    • 全雙工對講(獨立):App端和設備端都需要同時做采音和放音,設備端必須支持AEC,否則不建議使用該方案將會使用設備對講通道的聲音進行播放,可以單獨存在不依賴直播通道。

    • 全雙工對講(伴隨直播):App端和設備端都需要同時做采音和放音,設備端必須支持AEC,否則不建議使用該方案將會使用設備直播通道的聲音進行播放,要求必須有已開播的直播通道,可通過LVLivePlayer.audioFocus()方法在對講開啟前選擇對應的已存在的直播通道。

    • 半雙工對講(獨立):APP端和設備端都需要做采音和放音,一端上始終不會出現同時采音和放音的情況,因此設備不要求支持AEC;使用上類似對講機,由APP端在一次對講會話中可多次人為控制錄音的開啟和結束;將會使用設備對講通道的聲音進行播放,可以單獨存在不依賴直播通道;使用限制:該模式需要設備端SDK使用v2.3.3及以上版本的支持,如果使用較舊的設備SDK,將會降級到全雙工對講。

    • 半雙工對講(伴隨直播):APP端和設備端都需要做采音和放音,一端上始終不會出現同時采音和放音的情況,因此設備不要求支持AEC;使用上類似對講機,由APP端在一次對講會話中可多次人為控制錄音的開啟和結束;將會使用設備直播通道的聲音進行播放,要求必須有已開播的直播通道,可通過LVLivePlayer.audioFocus()方法在對講開啟前選擇對應的已存在的直播通道;使用限制:該模式需要設備端SDK使用v2.3.3及以上版本的支持,如果使用較舊的設備SDK,將會降級到全雙工對講。

    liveIntercom.setLiveIntercomMode(LVLiveIntercomMode.DoubleTalk);
  5. 開始對講。

    對講開始后,會請求音頻焦點,并設置到通話模式,同時將對端播放聲音強制路由到揚聲器(若已連接藍牙耳機或者線控耳機則路由到耳機上)。

    // 開始對講
    liveIntercom.start(iotId);
  6. 對講機講話狀態切換(僅半雙工對講需要關注)。

    開啟半雙工對講后,由用戶來主動切換對講狀態,按需去做收放音。

    // 該狀態下APP端停止播放,采集音頻發給設備端,同時設備端會停止音頻采集,播放APP端采集的聲音
    liveIntercom.listen(true);
    ...
    // 該狀態下APP端恢復播放,同時設備端會停止播放聲音,恢復音頻采集
    liveIntercom.listen(false);
  7. 結束對講。

    對講結束后釋放音頻焦點,并設置到常規模式,同時取消強制音頻播放路由到揚聲器規則。對講過程中默認開啟手機回聲消除。

    // 停止對講
    liveIntercom.stop();
  8. 釋放對講資源。

    對講功能不再使用需要主動釋放資源。

    // 釋放對講
    liveIntercom.release();

語音對講錯誤列表

錯誤枚舉

描述

解決辦法

LV_LIVE_INTERCOM_ERROR_START_REQUEST_FAILED

發起語音對講請求失敗,詳細錯誤原因請參考subCode

檢查并修復以下異常,然后重試:

  • 檢查網絡是否故障。

  • 設備是否離線。

  • 檢查服務端是否出現異常。

LV_LIVE_INTERCOM_ERROR_CONNECT_STREAM_FAILED

建立語音對講流通道失敗

檢查并修復以下異常,然后重試:

  • 檢查網絡是否故障。

  • 檢查是否因5秒內設備未及時響應導致上報超時。

LV_LIVE_INTERCOM_ERROR_SEND_STREAM_DATA_FAILED

發送音頻數據失敗

網絡環境異常,請切換至良好的網絡環境中并重試。

LV_LIVE_INTERCOM_ERROR_RECEIVE_STREAM_DATA_FAILED

接收音頻數據失敗

網絡環境異常,請切換至良好的網絡環境中并重試。

LV_LIVE_INTERCOM_ERROR_INIT_AUDIO_RECORDER_FAILED

錄音機初始化錯誤

檢查并修復以下異常,然后重試:

  • 檢查是否錄音權限未授權。

  • 檢查是否有其它應用占用了錄音機,終止應用進程并重試。

LV_LIVE_INTERCOM_ERROR_START_AUDIO_RECORDER_FAILED

錄音機啟動錯誤

檢查是否有其它應用占用了錄音機,終止應用進程并重試。

LV_LIVE_INTERCOM_ERROR_READ_AUDIO_RECORDER_FAILED

錄音機數據讀取錯誤

錄音機異常,需重啟應用端設備,例如重啟手機。

LV_LIVE_INTERCOM_ERROR_INIT_AUDIO_TRACK_FAILED

音頻播放器創建失敗

音頻播放器異常,需重啟應用端設備,例如重啟手機。

音頻文件錄制、播放及上傳

提供錄制音頻文件、播放本地或者網絡音頻文件及上傳音頻文件的能力。

錄制及播放音頻文件支持以下格式。

文件類型

采樣率

編碼方式

AMR

8Khz(支持錄制和播放)/16Khz(僅播放)

amr

WAV

8Khz/16Khz

PCM

G711

音頻文件錄制、播放及上傳的使用方式:

  • 音頻文件錄制

    // 創建音頻文件錄音機
    LVAudioFileRecorder recorder = new LVAudioFileRecorder(getApplicationContext());
    
    // 設置錄制監聽器
    recorder.setRecorderListener(new ILVAudioFileRecorderListener() {
                @Override
                public void onRecordStart() {
                    appendLog("錄音開始");
                    isRecording = true;
                }
    
                @Override
                public void onRecordEnd() {
                    appendLog("錄音結束");
                    isRecording = false;
                }
    
                @Override
                public void onRecordVolume(int volume) {
                }
    
                @Override
                public void onError(LVAudioFileErrorCode code, String message) {
                    appendLog("錄制出錯: code:" + code + " msg:" + message);
                    isRecording = false;
                }
            });
    
    // 設置錄音參數配置并啟動錄音
    File audioFile = new File(String.format("/sdcard/%d.amr", System.currentTimeMillis()));
    LVAudioFileCode code = recorder.startRecorder(AudioParams.AUDIOPARAM_MONO_8K_AMR, audioFile.getAbsolutePath());
    
    // 停止錄制
    recorder.stopRecorder();
    
    // 錄音機資源釋放
    recorder.release();
  • 音頻文件播放

    // 創建音頻文件播放器
    LVAudioFilePlayer player = new LVAudioFilePlayer(getApplicationContext());
    
    // 設置播放監聽器
    player.setPlayerListener(new ILVAudioFilePlayerListener() {
            @Override
            public void onCompletion() {
                appendLog("播放結束");
            }
        });
    
    // 播放本地文件
    LVAudioFileCode code = player.startPlay(LVAudioFileType.LV_AUDIO_FILE_TYPE_WAV, "/sdcard/test.wav");
    
    // 播放網絡文件
    LVAudioFileCode code = player.startPlay("https://link-vision-temp-sh.oss-cn-shanghai.aliyuncs.com/test.amr");
    
    // 停止播放
    player.stopPlay();
    
    // 播放器資源釋放
    player.release();
  • 文件上傳

    // 創建文件上傳器
    LVOSSUploader uploader = new LVOSSUploader(getApplicationContext());
    
    // 設置文件上傳監聽器
    uploader.setOSSUploaderCallback(new ILVOSSUploaderListener() {
                @Override
                public void onError(String sessionId, String fileName, int code, String message) {
                    appendLog("上傳失敗 sessionId=" + sessionId + " fileName=" + fileName + " code=" + code + " message=" + message);
                }
    
                @Override
                public void onProgress(long uploadBytes, long totalBytes) {
                    appendLog("上傳進度 " + uploadBytes + "/" + totalBytes);
                }
    
                @Override
                public void onCompletion(String sessionId, String fileName) {
                    appendLog("上傳完成 sessionId=" + sessionId + " fileName=" + fileName);
                }
            });
    
    // 開始上傳
    uploader.upload(audioFile.getAbsolutePath(), "test.wav", "123456", "https://oss.example.com/test.wav");
    
    // 上傳器資源釋放
    uploader.release();

音頻文件錯誤列表

錯誤枚舉

描述

解決辦法

LV_AUDIO_FILE_ERROR_CREATE_FILE_FAILED

文件創建失敗

請檢查文件能否創建,是否可以寫入。

LV_AUDIO_FILE_ERROR_INIT_AUDIO_RECORDER_FAILED

錄音機初始化錯誤

檢查并修復以下異常,然后重試:

  • 檢查是否錄音權限未授權。

  • 檢查是否有其它應用占用了錄音機,終止應用進程并重試。

LV_AUDIO_FILE_ERROR_START_AUDIO_RECORDER_FAILED

錄音機啟動錯誤

檢查是否有其它應用占用了錄音機,終止應用進程并重試。

LV_AUDIO_FILE_ERROR_READ_AUDIO_RECORDER_FAILED

錄音機數據讀取錯誤

錄音機異常,需重啟應用端設備,例如重啟手機,一般比較少見。

LV_AUDIO_FILE_ERROR_READ_FILE_FAILED

文件讀取失敗

請檢查文件是否存在,是否可以讀取。

LV_AUDIO_FILE_ERROR_INIT_AUDIO_TRACK_FAILED

音頻播放器創建失敗

手機的音頻播放器異常,需要重啟應用或者手機,一般比較少見。

從1.x SDK遷移到2.x版本指南

Android Media SDK在2.0.0版本對接口、方法和類進行了大幅改動。如果您正在使用2.0.0-ilop以下版本,建議通過本文提供的方法升級至2.0.0-ilop。

說明

1.x版本文檔見Link Visual視頻Media SDK

重要變化

重要變化

1.x版本

2.x版本

渲染組件支持

支持TextureView和GLSurfaceView兩種組件

只提供TextureView, 移除對GLSurfaceView的支持。

直播播放器

LivePlayer

改名為LVLivePlayer。

點播播放器

卡錄像點播播放器為VodPlayer

云存錄像播放器為HlsPlayer

不再區分卡錄像點播還是云存錄像點播,統一為LVVodPlayer,自動識別設置的數據源來完成相應的轉換。

語音對講

LiveIntercomV2

改名為LVLiveIntercom。

升級步驟

gradle集成,方式與1.x版本類似,修改版本號即可,混淆配置無變化。

說明

從2.0.0開始,linkvisual-media不再默認依賴ExoPlayer,如果您還需要使用繼續使用ExoPlayer請在依賴中添加

implementation('com.google.android.exoplayer:exoplayer-core:2.10.5')
implementation('com.google.android.exoplayer:exoplayer-ui:2.8.3')
implementation('com.google.android.exoplayer:exoplayer-hls:2.10.5')

混淆配置中添加:

-dontwarn com.google.android.exoplayer2.**

API變化細節(建議通過文本搜索來定位)

全局組件

變更細節

1.x

2.x

修改建議

包名與類名變更

com.aliyun.iotx.linkvisual.media.LinkVisualMedia

com.aliyun.iotx.linkvisual.media.LVMedia

更新包名與類名。

接口變更:直播預建連接口

  1. void preConnectByIotId(final String iotId)

  2. void preConnectByIotId(final String iotId, int streamType)

LVPlayerCode preConnectByIotId(String iotId, LVStreamType streamType)

修改接口名。

直播播放器

變更細節

1.x

2.x

修改建議

包名與類名變更

com.aliyun.iotx.linkvisual.media.video.player.LivePlayer

com.aliyun.iotx.linkvisual.media.player.LVLivePlayer

更新包名與類名。

設置加密的直播數據源中設置的decryptIv和decryptKey從Base64解碼后的二進制數據改為解碼器前的字符串

void setDataSource(String url, boolean isEncrypted, byte[] decryptIv, byte[] decryptKey)

LVPlayerCode setDataSource(String url, boolean isEncrypted, String decryptIvBase64, String decryptKeyBase64)

請注意將Base64解碼去除,由SDK內部來完成對Base64字符串的解碼。

接口命名調整:設置基于生活物聯網平臺連接的IPC設備直播數據源

  1. void setIPCLiveDataSource(String iotId, int streamType)

  2. void setIPCLiveDataSource(String iotId, int streamType, int cacheDurationInMs)

  1. LVPlayerCode setLiveDataSource(String iotId, LVStreamType streamType)

  2. LVPlayerCode setLiveDataSource(String iotId, LVStreamType streamType, int cacheDurationInMs)

除接口名修改外,第二個參數碼流類型由int值改為枚舉,方便理解和維護。

接口移除:基于生活物聯網平臺連接的IPC設備直播數據源

  1. void setIPCLiveDataSource(String iotId, int streamType, boolean relayEncrypted, int relayEncryptType, boolean forceIFrame)

  2. void setIPCLiveDataSource(String iotId, int streamType, boolean relayEncrypted, int relayEncryptType, boolean forceIFrame, int cacheDurationInMs)

-

從2.0.0開始強制要求打開加密和強制I幀。

接口移除:移除prepare步驟

  1. prepare()

  2. void setOnPreparedListener(OnPreparedListener listener)

  3. com.aliyun.iotx.linkvisual.media.video.listener.OnPreparedListener

-

設置數據源后,在播放start()前無需再調用prepare()。

指令接口,如setDataSource()/start()/stop()/release()等增加返回值

-

返回值枚舉:

enum LVPlayerCode{
    /** 執行成功 */
    LV_PLAYER_SUCCESS  = 0,
    /** 執行失敗, 通用錯誤 */
    LV_PLAYER_ERROR_FAILED  = -1,
    /** 錯誤的輸入參數 */
    LV_PLAYER_ERROR_INVALID_PARAMETER   = -2,
    /** 不支持的接口 */
    LV_PLAYER_ERROR_UNSUPPORTED = -3,
};

可以通過判斷返回值作為接口操作是否成功的判斷。

新增接口:獲取當前碼流的寬高

-

  1. int getVideoWidth()

  2. int getVideoHeight()

-

類名變更:解碼器策略和解碼器類型枚舉

  1. com.aliyun.iotx.linkvisual.media.video.HardwareDecoderable.DecoderStrategy

  2. com.aliyun.iotx.linkvisual.media.video.HardwareDecoderable.DecoderType

  1. com.aliyun.iotx.linkvisual.media.player.bean.LVDecoderStrategy

  2. com.aliyun.iotx.linkvisual.media.player.bean.LVDecoderType

修改類名。

接口變更:取消設置音量接口改為靜音和取消靜音接口

  1. void setVolume(float audioVolume)

  2. float getVolume()

  1. LVPlayerCode mute(boolean isMute)

  2. boolean isMute()

不支持應用內單獨控制播放音量,音量控制統一交由系統音量來完成。

新增接口:增加音頻焦點接口

-

  1. LVPlayerCode audioFocus()

  2. boolean isAudioFocus()

從2.0.0開始,SDK不再支持多路音頻同時播放,至多只有一路音頻播放。當存在多路觀看(如NVR多分屏)場景時,請交由用戶來調用關心的那一路播放器的audioFocus()接口來完成多路播放器之間聲音播放的切換。

接口移除:移除音頻播放流通道設置接口

void setAudioStreamType(final int streamType)

-

直播播放器始終使用 AudioManager.STREAM_MUSIC通道,不再支持切換。

接口移除:移除對GLSurfaceView的支持

  1. void setSurfaceView(SurfaceView mSurfaceView)

  2. void clearSurfaceView()

-

請替換為TextureView,相比GLSurfaceView有以下優勢:

  1. 支持硬件加速,可隨View移動不產生黑邊。

  2. 支持電子變焦(請使用SDK提供ZoomableTextureView)。

  3. 支持多窗口播放。

接口變更:設置畫面縮放模式接口參數調整

void setVideoScalingMode(int mVideoScalingMode)

LVPlayerCode setVideoScalingMode(LVVideoScalingMode videoScalingMode)

com.aliyun.iotx.linkvisual.media.player.bean.LVVideoScalingMode {
//保持寬高
LV_VIDEO_SCALING_MODE_FIT,
//強制填充
LV_VIDEO_SCALING_MODE_FILL;
}

修改參數名和類名。

接口變更:邊播邊錄

  1. boolean startRecordingContent(File contentFile)

  2. boolean stopRecordingContent()

  3. long getCurrentRecordingContentDuration()

  1. LVPlayerCode startRecordingContent(String contentFilePath)

  2. LVPlayerCode stopRecordingContent()

  3. long getCurrentRecordingContentDurationInMs()

  1. 開始錄制參數類型由File改為String。

  2. 獲取錄制時長接口名調整。

接口移除:設置播放停止時畫面行為接口

  1. void setPlayerStoppedDrawingMode(PlayerStoppedDrawingMode playerStoppedDrawingMode)

  2. PlayerStoppedDrawingMode getPlayerStoppedDrawingMode()

-

暫未支持,后續版本中會補充該功能。

接口變更:獲取播放狀態接口

int getPlayState()

  1. LVPlayerState getPlayerState()

  2. com.aliyun.iotx.linkvisual.media.player.bean.LVPlayerState

播放器狀態由int改為枚舉值,方便理解和維護。

接口變更:獲取當前流連接類型接口

StreamConnectType getStreamConnectType()

  1. LVStreamConnectType getStreamConnectType()

  2. com.aliyun.iotx.linkvisual.media.player.bean.LVStreamConnectType

修改類名。

接口變更:獲取當前播放幀率/碼率信息接口

PlayInfo getCurrentPlayInfo()

  1. LVPlayInfo getCurrentPlayInfo()

  2. com.aliyun.iotx.linkvisual.media.player.bean.LVPlayInfo

修改類名。

接口變更:設置直播播放器回調接口

  1. void setOnRenderedFirstFrameListener(OnRenderedFirstFrameListener listener)

  2. void setOnErrorListener(OnErrorListener listener)

  3. void setOnPlayerStateChangedListener(OnPlayerStateChangedListener listener)

  4. void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener)

  5. void setOnVideoQualityListener(OnVideoQualityListener listener)

  6. void setOnSeiInfoListener(SeiInfoBuffer seiInfoBuffer, OnSeiInfoListener onSeiInfoListener)

LVPlayerCode setPlayerListener(ILVPlayerListener listener)

com.aliyun.iotx.linkvisual.media.player.listener.ILVPlayerListener {
    void onError(LVPlayerError error);
    void onPlayerStateChange(LVPlayerState state);
    void onRenderedFirstFrame(int elapsedTimeInMs);
    void onVideoSizeChanged(int width, int height);
    void onSeiInfoUpdate(byte[] buffer, int length, long timeStamp);    void onVideoJitterBufferEmpty();
}

將多個Listener合并為一個。

接口變更:設置使用外部渲染接口

  1. void setUseExternalRender(boolean mUseExternalRender)

  2. void setOnExternalRenderListener

  3. boolean useExternalRender()

LVPlayerCode setUseExternalRender(boolean useExternalVideoRender, boolean useExternalAudioRender, ILVPlayerExternalRenderListener listener)

com.aliyun.iotx.linkvisual.media.player.listener.ILVPlayerExternalRenderListener {
    void onVideoFrameUpdate(int width, int height, long timestampInMs);
    void onAudioHeader(int audioBitPerSample, int audioSamplesPerSec, int audioChannel);
    boolean onAudioData(byte[] buffer, int offset, int length);
}

從2.0.0開始,除了支持視頻YUV數據回調之外,還支持音頻PCM回調。

接口變更:獲取一幀YUV數據接口

Yuv420pFrame getYuvFrame()

Yuv420pFrame getYuv420pFrame()

修改接口名。

點播播放器

變更細節

1.x

2.x

修改建議

包名與類名變更

  1. com.aliyun.iotx.linkvisual.media.video.player.VodPlayer

  2. com.aliyun.iotx.linkvisual.media.video.player.HlsPlayer

com.aliyun.iotx.linkvisual.media.player.LVVodPlayer

更新包名與類名。從2.0.0開始,SDK將設備卡錄像點播播放器和云存播放器統一為一種播放器。

設置加密的設備卡錄像點播數據源中設置的decryptIv和decryptKey從Base64解碼后的二進制數據改為解碼器前的字符串

void setDataSource(String url, boolean isEncrypted, byte[] decryptIv, byte[] decryptKey)

LVPlayerCode setDataSource(String url, boolean isEncrypted, String decryptIvBase64, String decryptKeyBase64)

請注意將Base64解碼去除,由SDK內部來完成對Base64字符串的解碼。

接口命名調整:設置播放地址為已接入生活物聯網的IPC設備指定錄像名的本地錄像文件地址

  1. void setDataSourceByIPCRecordFileName(String iotId, String fileName)

  2. void setDataSourceByIPCRecordFileName(String iotId, String fileName, long seekToPositionInMs)

  1. LVPlayerCode setDataSourceByLocalRecordFileName(String iotId, String fileName)

  2. LVPlayerCode setDataSourceByLocalRecordFileName(String iotId, String fileName, long seekToPositionInMs)

修改接口名。

接口移除:設置播放地址為已接入生活物聯網的IPC設備指定錄像名的本地錄像文件地址

void setDataSourceByIPCRecordFileName(String iotId, String fileName, boolean encrypted, int encryptType)

-

從2.0.0開始強制要求打開加密,故移除可以關閉加密的接口。

接口命名調整:設置播放地址為已接入生活物聯網的IPC設備指定錄像時間段的本地錄像文件地址

  1. void setDataSourceByIPCRecordTime(String iotId, int beginTimeInS, int endTimeInS, long seekToPositionInMs)

  2. void setDataSourceByIPCRecordTime(String iotId, int beginTimeInS, int endTimeInS, long seekToPositionInMs, int recordType)

LVPlayerCode setDataSourceByLocalRecordTime(String iotId, int beginTimeInS, int endTimeInS, long seekToPositionInMs, int recordType)

修改接口名。

接口移除:設置播放地址為已接入生活物聯網的IPC設備指定錄像時間段的本地錄像文件地址.

  1. void setDataSourceByIPCRecordTime(String iotId, int beginTimeInS, int endTimeInS, boolean encrypted, int encryptType, long seekToPositionInMs)

  2. void setDataSourceByIPCRecordTime(String iotId, int beginTimeInS, int endTimeInS, boolean encrypted, int encryptType, long seekToPositionInMs, int recordType)

-

從2.0.0開始強制要求打開加密,故移除可以關閉加密的接口。

接口命名調整:設置播放地址為已接入生活物聯網的IPC設備指定錄像名的云端錄像文件地址

  1. void setDataSourceByIPCRecordFileName(String iotId, String fileName)

  2. void setDataSourceByIPCRecordFileName(String iotId, String fileName, long seekToPositionInMs)

  1. LVPlayerCode setDataSourceByCloudRecordFileName(String iotId, String fileName)

  2. LVPlayerCode setDataSourceByCloudRecordFileName(String iotId, String fileName, long seekToPositionInMs)

修改接口名。

接口移除:移除prepare步驟

  1. prepare()

  2. void setOnPreparedListener(OnPreparedListener listener)

  3. com.aliyun.iotx.linkvisual.media.video.listener.OnPreparedListener

-

設置數據源后,在播放start()前無需再調用prepare()。

指令接口,如setDataSource()/start()/stop()/release()等增加返回值

-

返回值枚舉:

enum LVPlayerCode{
    /** 執行成功 */
    LV_PLAYER_SUCCESS  = 0,
    /** 執行失敗, 通用錯誤 */
    LV_PLAYER_ERROR_FAILED  = -1,
    /** 錯誤的輸入參數 */
    LV_PLAYER_ERROR_INVALID_PARAMETER   = -2,
    /** 不支持的接口 */
    LV_PLAYER_ERROR_UNSUPPORTED = -3,
};

可以通過判斷返回值作為接口操作是否成功的判斷。

新增接口:增加單獨的播放恢復接口

void start()

LVPlayerCode resume()

從2.0.0 SDK開始,點播播放恢復接口不再與start()接口復用。

接口名調整:獲取點播播放時長

  1. long getDuration()

  2. long getCurrentPosition()

  1. long getDurationMs()

  2. long getCurrentPositionMs()

修改接口名。

新增接口:獲取當前碼流的寬高

-

  1. int getVideoWidth()

  2. int getVideoHeight()

-

類名變更:解碼器策略和解碼器類型枚舉

  1. com.aliyun.iotx.linkvisual.media.video.HardwareDecoderable.DecoderStrategy

  2. com.aliyun.iotx.linkvisual.media.video.HardwareDecoderable.DecoderType

  1. com.aliyun.iotx.linkvisual.media.player.bean.LVDecoderStrategy

  2. com.aliyun.iotx.linkvisual.media.player.bean.LVDecoderType

修改類名。

接口變更:取消設置音量接口改為靜音和取消靜音接口

  1. void setVolume(float audioVolume)

  2. float getVolume()

  1. LVPlayerCode mute(boolean isMute)

  2. boolean isMute()

不支持應用內單獨控制播放音量,音量控制統一交由系統音量來完成。

新增接口:增加音頻焦點接口

-

  1. LVPlayerCode audioFocus()

  2. boolean isAudioFocus()

從2.0.0開始,SDK不再支持多路音頻同時播放,至多只有一路音頻播放。當存在多路觀看(如NVR多分屏)場景時,請交由用戶來調用關心的那一路播放器的audioFocus()接口來完成多路播放器之間聲音播放的切換。

接口移除:移除音頻播放流通道設置接口

void setAudioStreamType(final int streamType)

-

直播播放器始終使用 AudioManager.STREAM_MUSIC通道,不再支持切換。

接口移除:移除對GLSurfaceView的支持

  1. void setSurfaceView(SurfaceView mSurfaceView)

  2. void clearSurfaceView()

-

請替換為TextureView,相比GLSurfaceView有以下優勢:

  1. 支持硬件加速,可隨View移動不產生黑邊。

  2. 支持電子變焦(請使用SDK提供ZoomableTextureView)。

  3. 支持多窗口播放。

接口變更:設置畫面縮放模式接口參數調整

void setVideoScalingMode(int mVideoScalingMode)

LVPlayerCode setVideoScalingMode(LVVideoScalingMode videoScalingMode)

com.aliyun.iotx.linkvisual.media.player.bean.LVVideoScalingMode {
//保持寬高
LV_VIDEO_SCALING_MODE_FIT,
//強制填充
LV_VIDEO_SCALING_MODE_FILL;
}

修改參數名和類名。

接口變更:邊播邊錄

  1. boolean startRecordingContent(File contentFile)

  2. boolean stopRecordingContent()

  3. long getCurrentRecordingContentDuration()

  1. LVPlayerCode startRecordingContent(String contentFilePath)

  2. LVPlayerCode stopRecordingContent()

  3. long getCurrentRecordingContentDurationInMs()

  1. 開始錄制參數類型由File改為String。

  2. 獲取錄制時長接口名調整。

接口移除:設置播放停止時畫面行為接口

  1. void setPlayerStoppedDrawingMode(PlayerStoppedDrawingMode playerStoppedDrawingMode)

  2. PlayerStoppedDrawingMode getPlayerStoppedDrawingMode()

-

暫未支持,后續版本中會補充該功能。

接口變更:獲取播放狀態接口

int getPlayState()

  1. LVPlayerState getPlayerState()

  2. com.aliyun.iotx.linkvisual.media.player.bean.LVPlayerState

播放器狀態由int改為枚舉值,方便理解和維護。

接口變更:獲取當前流連接類型接口

StreamConnectType getStreamConnectType()

  1. LVStreamConnectType getStreamConnectType()

  2. com.aliyun.iotx.linkvisual.media.player.bean.LVStreamConnectType

僅在設備卡錄像點播下有效。

接口變更:獲取當前播放幀率/碼率信息接口

PlayInfo getCurrentPlayInfo()

  1. LVPlayInfo getCurrentPlayInfo()

  2. com.aliyun.iotx.linkvisual.media.player.bean.LVPlayInfo

修改類名。

接口變更:設置點播播放器回調接口

  1. void setOnRenderedFirstFrameListener(OnRenderedFirstFrameListener listener)

  2. void setOnErrorListener(OnErrorListener listener)

  3. void setOnPlayerStateChangedListener(OnPlayerStateChangedListener listener)

  4. void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener)

  5. void setOnVideoQualityListener(OnVideoQualityListener listener)

  6. void setOnSeiInfoListener(SeiInfoBuffer seiInfoBuffer, OnSeiInfoListener onSeiInfoListener)

  7. void setOnCompletionListener(OnCompletionListener listener)

LVPlayerCode setPlayerListener(ILVPlayerListener listener)

com.aliyun.iotx.linkvisual.media.player.listener.ILVPlayerListener {
    void onError(LVPlayerError error);
    void onPlayerStateChange(LVPlayerState state);
    void onRenderedFirstFrame(int elapsedTimeInMs);
    void onVideoSizeChanged(int width, int height);
    void onSeiInfoUpdate(byte[] buffer, int length, long timeStamp);    void onVideoJitterBufferEmpty();
}

LVPlayerCode setVodCompletionListener(ILVVodPlayerCompletionListener listener)

com.aliyun.iotx.linkvisual.media.player.listener.ILVVodPlayerCompletionListener{
    void onCompletion();
}

將多個Listener合并為二個。

接口變更:設置使用外部渲染接口

  1. void setUseExternalRender(boolean mUseExternalRender)

  2. void setOnExternalRenderListener

  3. boolean useExternalRender()

LVPlayerCode setUseExternalRender(boolean useExternalVideoRender, boolean useExternalAudioRender, ILVPlayerExternalRenderListener listener)

com.aliyun.iotx.linkvisual.media.player.listener.ILVPlayerExternalRenderListener {
    void onVideoFrameUpdate(int width, int height, long timestampInMs);
    void onAudioHeader(int audioBitPerSample, int audioSamplesPerSec, int audioChannel);
    boolean onAudioData(byte[] buffer, int offset, int length);
}

從2.0.0開始,除了支持視頻YUV數據回調之外,還支持音頻PCM回調。

接口變更:獲取一幀YUV數據接口

Yuv420pFrame getYuvFrame()

Yuv420pFrame getYuv420pFrame()

修改接口名。

語音對講

變更細節

1.x

2.x

修改建議

包名與類名變更

com.aliyun.iotx.linkvisual.media.audio.LiveIntercomV2

com.aliyun.iotx.linkvisual.media.liveintercom.LVLiveIntercom

更新包名與類名。

接口變更:初始化接口

LiveIntercomV2(Context context, final String iotId, final LiveIntercomMode liveIntercomMode, final AudioParams audioParams)

LVLiveIntercom(Context context, AudioParams audioParams)

從2.0.0 SDK開始,iotId和對講模式不在初始化階段傳入,分別下放到start()和setLiveIntercomMode()接口中。

指令接口,如start()/stop()/release()等增加返回值

-

返回值枚舉:

LVLiveIntercomCode {
    //執行成功
    LV_LIVE_INTERCOM_SUCCESS,
    //執行失敗, 通用錯誤
    LV_LIVE_INTERCOM_ERROR_FAILED,
    //錯誤的輸入參數
    LV_LIVE_INTERCOM_ERROR_INVALID_PARAMETER,
    //不支持的接口
    LV_LIVE_INTERCOM_ERROR_UNSUPPORTED
}

可以通過判斷返回值作為接口操作是否成功的判斷。

新增接口:增加新的對講模式

-

LVLiveIntercomCode setLiveIntercomMode(LVLiveIntercomMode liveIntercomMode)

從2.0.0 SDK開始增加DoubleTalkWithLive模式:App端和設備端都需要同時做采音和放音,設備端必須支持AEC,否則不建議使用該方案;將會使用設備直播通道的聲音進行播放,要求必須有已開播的直播通道,可通過LVLivePlayer.audioFocus()方法在對講開啟前選擇對應的已存在的直播通道。

接口變更:與指定設備(通過iotId)進行對講

void start()

LVLiveIntercomCode start(String iotId)

需要傳入iotId。

接口變更:與指定設備(通過url)進行對講

void startWithExternalRequest(LiveIntercomRequest liveIntercomRequest)

LVLiveIntercomCode start(String url, String decryptIvBase64, String decryptKeyBase64)

修改接口名,注意decryptIvBase64和decryptKeyBase64使用Base64編碼的字符串。

接口變更:設置對講監聽器

void setLiveIntercomV2Listener(LiveIntercomV2Listener listener)

LVLiveIntercomCode setLiveIntercomListener(ILVLiveIntercomListener listener)

ILVLiveIntercomListener {
    void onTalkReady();
    void onRecorderStart();
    void onRecorderEnd();
    void onRecorderVolume(int volume);
    void onError(LVLiveIntercomError error);
}

修改接口名。

接口變更:外部變聲實現

void setExternalVoiceChangeImpl(IVoiceChange voiceChangeImpl)

LVLiveIntercomCode setUseExternalVoiceChange(boolean useExternal, ILVLiveIntercomVoiceChangeListener listener)

ILVLiveIntercomVoiceChangeListener{
    boolean onAudioData(byte[] pcm, int length);    
}

修改接口名。

接口變更:內部變聲類型設置

void setVoiceChangeType(LiveIntercomVoiceType voiceType)

LVLiveIntercomCode setVoiceChangeType(LVLiveIntercomVoiceType liveIntercomVoiceType)

修改接口名。