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設備的直播播放。
具有播放延遲低的特性。
具備與設備之間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 | 解碼錯誤 | 若在持續一段時間內,解碼均發生失敗,您可轉存碼流數據,然后分析數據。轉存的操作步驟如下:
|
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 | ? | ? |
語音對講使用方式:
創建語音對講實例,并設置音頻參數。
liveIntercom = new LVLiveIntercom(getApplicationContext(), AudioParams.AUDIOPARAM_MONO_8K_G711A);
注冊監聽器,并處理語音對講回調。
請在對應的事件回調中處理,包括對講開始、錄音開始和結束、音量回調(用于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()); }}); }
設置增益水平。
可以設置App端聲音采集的增益值,提供“-1 - None, 0 - Mild, 1 - Medium , 2 - high , 3 - Aggressive , 4 - very Aggressive , 5 - Max”六種水平供選擇(默認值為無),請根據設備效果來調整。
liveIntercom.setGainLevel(-1);
設置對講模式。
提供五種模式供選擇:
單講: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);
開始對講。
對講開始后,會請求音頻焦點,并設置到通話模式,同時將對端播放聲音強制路由到揚聲器(若已連接藍牙耳機或者線控耳機則路由到耳機上)。
// 開始對講 liveIntercom.start(iotId);
對講機講話狀態切換(僅半雙工對講需要關注)。
開啟半雙工對講后,由用戶來主動切換對講狀態,按需去做收放音。
// 該狀態下APP端停止播放,采集音頻發給設備端,同時設備端會停止音頻采集,播放APP端采集的聲音 liveIntercom.listen(true); ... // 該狀態下APP端恢復播放,同時設備端會停止播放聲音,恢復音頻采集 liveIntercom.listen(false);
結束對講。
對講結束后釋放音頻焦點,并設置到常規模式,同時取消強制音頻播放路由到揚聲器規則。對講過程中默認開啟手機回聲消除。
// 停止對講 liveIntercom.stop();
釋放對講資源。
對講功能不再使用需要主動釋放資源。
// 釋放對講 liveIntercom.release();
語音對講錯誤列表
錯誤枚舉 | 描述 | 解決辦法 |
LV_LIVE_INTERCOM_ERROR_START_REQUEST_FAILED | 發起語音對講請求失敗,詳細錯誤原因請參考subCode | 檢查并修復以下異常,然后重試:
|
LV_LIVE_INTERCOM_ERROR_CONNECT_STREAM_FAILED | 建立語音對講流通道失敗 | 檢查并修復以下異常,然后重試:
|
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 | |
點播播放器 | 卡錄像點播播放器為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 | 更新包名與類名。 |
接口變更:直播預建連接口 |
| 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設備直播數據源 |
|
| 除接口名修改外,第二個參數碼流類型由int值改為枚舉,方便理解和維護。 |
接口移除:基于生活物聯網平臺連接的IPC設備直播數據源 |
| - | 從2.0.0開始強制要求打開加密和強制I幀。 |
接口移除:移除prepare步驟 |
| - | 設置數據源后,在播放start()前無需再調用prepare()。 |
指令接口,如setDataSource()/start()/stop()/release()等增加返回值 | - | 返回值枚舉:
| 可以通過判斷返回值作為接口操作是否成功的判斷。 |
新增接口:獲取當前碼流的寬高 | - |
| - |
類名變更:解碼器策略和解碼器類型枚舉 |
|
| 修改類名。 |
接口變更:取消設置音量接口改為靜音和取消靜音接口 |
|
| 不支持應用內單獨控制播放音量,音量控制統一交由系統音量來完成。 |
新增接口:增加音頻焦點接口 | - |
| 從2.0.0開始,SDK不再支持多路音頻同時播放,至多只有一路音頻播放。當存在多路觀看(如NVR多分屏)場景時,請交由用戶來調用關心的那一路播放器的audioFocus()接口來完成多路播放器之間聲音播放的切換。 |
接口移除:移除音頻播放流通道設置接口 | void setAudioStreamType(final int streamType) | - | 直播播放器始終使用 AudioManager.STREAM_MUSIC通道,不再支持切換。 |
接口移除:移除對GLSurfaceView的支持 |
| - | 請替換為TextureView,相比GLSurfaceView有以下優勢:
|
接口變更:設置畫面縮放模式接口參數調整 | void setVideoScalingMode(int mVideoScalingMode) | LVPlayerCode setVideoScalingMode(LVVideoScalingMode videoScalingMode)
| 修改參數名和類名。 |
接口變更:邊播邊錄 |
|
|
|
接口移除:設置播放停止時畫面行為接口 |
| - | 暫未支持,后續版本中會補充該功能。 |
接口變更:獲取播放狀態接口 | int getPlayState() |
| 播放器狀態由int改為枚舉值,方便理解和維護。 |
接口變更:獲取當前流連接類型接口 | StreamConnectType getStreamConnectType() |
| 修改類名。 |
接口變更:獲取當前播放幀率/碼率信息接口 | PlayInfo getCurrentPlayInfo() |
| 修改類名。 |
接口變更:設置直播播放器回調接口 |
| LVPlayerCode setPlayerListener(ILVPlayerListener listener)
| 將多個Listener合并為一個。 |
接口變更:設置使用外部渲染接口 |
| LVPlayerCode setUseExternalRender(boolean useExternalVideoRender, boolean useExternalAudioRender, ILVPlayerExternalRenderListener listener)
| 從2.0.0開始,除了支持視頻YUV數據回調之外,還支持音頻PCM回調。 |
接口變更:獲取一幀YUV數據接口 | Yuv420pFrame getYuvFrame() | Yuv420pFrame getYuv420pFrame() | 修改接口名。 |
點播播放器
變更細節 | 1.x | 2.x | 修改建議 |
包名與類名變更 |
| 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設備指定錄像名的本地錄像文件地址 |
|
| 修改接口名。 |
接口移除:設置播放地址為已接入生活物聯網的IPC設備指定錄像名的本地錄像文件地址 | void setDataSourceByIPCRecordFileName(String iotId, String fileName, boolean encrypted, int encryptType) | - | 從2.0.0開始強制要求打開加密,故移除可以關閉加密的接口。 |
接口命名調整:設置播放地址為已接入生活物聯網的IPC設備指定錄像時間段的本地錄像文件地址 |
| LVPlayerCode setDataSourceByLocalRecordTime(String iotId, int beginTimeInS, int endTimeInS, long seekToPositionInMs, int recordType) | 修改接口名。 |
接口移除:設置播放地址為已接入生活物聯網的IPC設備指定錄像時間段的本地錄像文件地址. |
| - | 從2.0.0開始強制要求打開加密,故移除可以關閉加密的接口。 |
接口命名調整:設置播放地址為已接入生活物聯網的IPC設備指定錄像名的云端錄像文件地址 |
|
| 修改接口名。 |
接口移除:移除prepare步驟 |
| - | 設置數據源后,在播放start()前無需再調用prepare()。 |
指令接口,如setDataSource()/start()/stop()/release()等增加返回值 | - | 返回值枚舉:
| 可以通過判斷返回值作為接口操作是否成功的判斷。 |
新增接口:增加單獨的播放恢復接口 | void start() | LVPlayerCode resume() | 從2.0.0 SDK開始,點播播放恢復接口不再與start()接口復用。 |
接口名調整:獲取點播播放時長 |
|
| 修改接口名。 |
新增接口:獲取當前碼流的寬高 | - |
| - |
類名變更:解碼器策略和解碼器類型枚舉 |
|
| 修改類名。 |
接口變更:取消設置音量接口改為靜音和取消靜音接口 |
|
| 不支持應用內單獨控制播放音量,音量控制統一交由系統音量來完成。 |
新增接口:增加音頻焦點接口 | - |
| 從2.0.0開始,SDK不再支持多路音頻同時播放,至多只有一路音頻播放。當存在多路觀看(如NVR多分屏)場景時,請交由用戶來調用關心的那一路播放器的audioFocus()接口來完成多路播放器之間聲音播放的切換。 |
接口移除:移除音頻播放流通道設置接口 | void setAudioStreamType(final int streamType) | - | 直播播放器始終使用 AudioManager.STREAM_MUSIC通道,不再支持切換。 |
接口移除:移除對GLSurfaceView的支持 |
| - | 請替換為TextureView,相比GLSurfaceView有以下優勢:
|
接口變更:設置畫面縮放模式接口參數調整 | void setVideoScalingMode(int mVideoScalingMode) | LVPlayerCode setVideoScalingMode(LVVideoScalingMode videoScalingMode)
| 修改參數名和類名。 |
接口變更:邊播邊錄 |
|
|
|
接口移除:設置播放停止時畫面行為接口 |
| - | 暫未支持,后續版本中會補充該功能。 |
接口變更:獲取播放狀態接口 | int getPlayState() |
| 播放器狀態由int改為枚舉值,方便理解和維護。 |
接口變更:獲取當前流連接類型接口 | StreamConnectType getStreamConnectType() |
| 僅在設備卡錄像點播下有效。 |
接口變更:獲取當前播放幀率/碼率信息接口 | PlayInfo getCurrentPlayInfo() |
| 修改類名。 |
接口變更:設置點播播放器回調接口 |
| LVPlayerCode setPlayerListener(ILVPlayerListener listener)
LVPlayerCode setVodCompletionListener(ILVVodPlayerCompletionListener listener)
| 將多個Listener合并為二個。 |
接口變更:設置使用外部渲染接口 |
| LVPlayerCode setUseExternalRender(boolean useExternalVideoRender, boolean useExternalAudioRender, ILVPlayerExternalRenderListener listener)
| 從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 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)
| 修改接口名。 |
接口變更:外部變聲實現 | void setExternalVoiceChangeImpl(IVoiceChange voiceChangeImpl) | LVLiveIntercomCode setUseExternalVoiceChange(boolean useExternal, ILVLiveIntercomVoiceChangeListener listener)
| 修改接口名。 |
接口變更:內部變聲類型設置 | void setVoiceChangeType(LiveIntercomVoiceType voiceType) | LVLiveIntercomCode setVoiceChangeType(LVLiveIntercomVoiceType liveIntercomVoiceType) | 修改接口名。 |