433
iPhone_iPad_Mac_手機_平板_蘋果apple
Android 推流SDK使用說明__SDK文檔及下載_API及SDK_視頻直播-阿裏雲
文檔說明:本文檔麵向所有使用該SDK的開發人員、測試人員以及對此感興趣的用戶,要求讀者具有一定的Android開發能力。
1. 簡介
安卓推流SDK是在安卓平台上使用的軟件開發工具包(Soft Development Kit),為Android開發者提供簡單易用的接口,幫助開發者實現Android平台上的推流應用開發。
1.1功能說明
方便快捷、低門檻實現媒體推流功能。用戶無須關心內部實現細節,隻需要自定義界麵既可以實現專業級的推流應用。
推流支持格式:rtmp
編碼目前為硬編
1.2安裝包說明
推流器SDK的完整下載包中包含demo、doc、jar包、.so文件等:
1.demo:主要存放了調用SDK的示例工程,可以幫助用戶了解如何使用該SDK。
2.jar:推流SDK java庫, SDK建議使用Android Studio進行集成,對於使用eclipse的開發者可以參考Google提供的遷移方法 https://developer.android.com/studio/intro/migrate.html (此地址需要翻牆,也可自行百度解決),將原應用遷移到Android Studio後再集成SDK。
3.添加libs裏麵給出的j ar依賴,並且將jniLibs整個拷貝到moudle-name/src/main中,然後在moudle的build.gradle中加入以下配置(具體可參考Demo):
splits {
abi {
enable true
reset()
include 'armeabi-v7a'
}
}
注意:如果使用其他的第三方庫也有對.so的依賴,則需要選取其他第三方庫的armeabi-v7a的.so,一並放入moudle-name/src/main/jniLibs/armeabi-v7a中,如果其他第三方庫沒有給出armeabi-v7a的.so,則可以使用其armeabi的.so替代
- 4.doc:存放SDK相關接入文檔。
1.3推流器性能
1.目前推流SDK推流采用的是硬編。
2.推流采用FFMPEG推流
3.SDK的大小:去除ffmpeg動態庫之後SDK對應用的大小增加在1M左右.加上ffmepg在2M左右
1.4注意事項
1.推流器SDK目前隻支持單實例。不能夠同時開2個推流實例,同時隻能存在一個實例,需要另開實例的時候,需要關閉之前存在的實例。
2.操作係統版本要求android4.3以上。
2. 係統框架
2.1係統框架圖
2.2類框架圖
無
3. 使用說明
3.1 開發環境配置
1.需要準備Android運行環境,以及硬件CPU支持ARMv7或ARMv7s的安卓設備。
2.權限開通,在阿裏雲上申請推流SDK開發權限。
3.2 開發步驟
首先在安卓應用程序中,需要聲明以下權限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_TASKS" />
使用用媒體推流器SDK的調用順序為:
1.調用AlivcMediaRecorderFactory.createMediaRecorder獲取實例
2.初始化mMediaRecorder.init(this);
3.調用mMediaRecorder.prepare(mConfigure, mPreviewSurface);
4.調用mMediaRecorder.startRecord(pushUrl);開始推流
5.調用mMediaRecorder.stopRecord();停止推流
6.調用mMediaRecorder.reset();釋放預覽資源,對應的是prepare
7.調用mMediaRecorder.release();釋放資源,對應的是init
3.3 Demo示例
在SDK中提供了Demo,此Demo是用推流SDK開發了一個完整的推流器,用戶可以參考Demo進行推流的開發。
下麵給出了部分重要的Demo中調用SDK的代碼。
1) 創建SurfaceView和SurfaceView的Callbac
_CameraSurface = (SurfaceView) findViewById(R.id.camera_surface);
_CameraSurface.getHolder().addCallback(_CameraSurfaceCallback);
private final SurfaceHolder.Callback _CameraSurfaceCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
holder.setKeepScreenOn(true);
mPreviewSurface = holder.getSurface();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
mMediaRecorder.setPreviewSize(width, height);
mPreviewWidth = width;
mPreviewHeight = height;
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mPreviewSurface = null;
mMediaRecorder.stopRecord();
mMediaRecorder.reset();
}
};
mPreviewSurface = holder.getSurface();
2)、 創建推流器,準備推流:
- 1.創建實例初始化
mMediaRecorder = AlivcMediaRecorderFactory.createMediaRecorder();
mMediaRecorder.init(this);
mMediaRecorder.setOnRecordStatusListener(mRecordStatusListener);
mMediaRecorder.setOnNetworkStatusListener(mOnNetworkStatusListener);
mMediaRecorder.setOnRecordErrorListener(mOnErrorListener);
- 2.開始預覽
private Map<String, Object> mConfigure = new HashMap<>();
mConfigure.put(AlivcMediaFormat.KEY_CAMERA_FACING, cameraFrontFacing);
mConfigure.put(AlivcMediaFormat.KEY_MAX_ZOOM_LEVEL, 3);
mConfigure.put(AlivcMediaFormat.KEY_OUTPUT_RESOLUTION, resolution);
mMediaRecorder.prepare(mConfigure, mPreviewSurface);
- 3.開始推流
mMediaRecorder.startRecord(pushUrl);
- 4.開啟關閉美顏濾鏡
mMediaRecorder.addFlag(AlivcMediaFormat.FLAG_BEAUTY_ON);//開啟美顏
mMediaRecorder.removeFlag(AlivcMediaFormat.FLAG_BEAUTY_ON);//關閉美顏
- 5.切換攝像頭
mMediaRecorder.switchCamera();
- 6.對焦
mMediaRecorder.focusing(x, y);// demo提供了首次對焦+手動對焦
- 7.縮放
mMediaRecorder.setZoom(scaleGestureDetector.getScaleFactor());
- 8.結束推流
mMediaRecorder.stopRecord();
- 9.釋放資源
mMediaRecorder.reset();//釋放預覽資源
mMediaRecorder.release();//釋放推流資源
- 10.添加水印
//創建水印信息對象
mWatermark = new AlivcWatermark.Builder()
.watermarkUrl(bundle.getString(WATERMARK_PATH)) //水印圖片地址
.paddingX(bundle.getInt(WATERMARK_DX)) //水印圖片在x軸的偏移
.paddingY(bundle.getInt(WATERMARK_DY)) //水印圖片在y軸的偏移
.site(bundle.getInt(WATERMARK_SITE)) //水印圖片位置
.build();
mConfigure.put(AlivcMediaFormat.KEY_WATERMARK, mWatermark); //配置水印信息
3) 網絡狀態事件通知— OnNetworkStatusListener
OnNetworkStatusListener:
/**
* 網絡較差時的回調,此時推流buffer為滿的狀態,會執行丟包,此時數據流不能正常推送
*/
void onNetworkBusy();
/**
* 網絡空閑狀態,此時本地推流buffer不滿,數據流可正常發送
*/
void onNetworkFree();
/**
* @param status
*/
void onConnectionStatusChange(int status);
/**
* 網絡重連
* @return false:停止重連 true:允許重連
*/
boolean onNetworkReconnect();
4) 錯誤事件通知中:
private OnLiveRecordErrorListener mOnErrorListener = new OnLiveRecordErrorListener() {
@Override
public void onError(int errorCode) {
switch (errorCode) {
case AlivcStatusCode.ERROR_SERVER_CLOSED_CONNECTION:
case AlivcStatusCode.ERORR_OUT_OF_MEMORY:
case AlivcStatusCode.ERROR_CONNECTION_TIMEOUT:
case AlivcStatusCode.ERROR_BROKEN_PIPE:
case AlivcStatusCode.ERROR_ILLEGAL_ARGUMENT:
case AlivcStatusCode.ERROR_IO:
case AlivcStatusCode.ERROR_NETWORK_UNREACHABLE:
Log.i(TAG, "Live stream connection error-->" + errorCode);
ToastUtils.showToast(LiveCameraActivity.this,"Live stream connection error-->" + errorCode);
break;
default:
}
}
};
4.接口說明
SDK中提供了兩個類AlivcMediaRecorder和AlivcMediaRecorderFactory,其中AlivcMediaRecorder是推流SDK使用接口類,AlivcMediaRecorderFactory用來創建推流器器AlivcMediaRecorder。同時提供了多個事件通知接口,用來監聽推流器的各種狀態。
類名 | 功能 |
---|---|
AlivcMediaRecorderFactory | 創建推流器接口 |
AlivcMediaRecorder | 推流功能接口類 |
AlivcMediaFormat | 推流器可配參數類 |
OnNetworkStatusListener | 推流狀態監聽接口 |
OnRecordStatusListener | 預覽狀態監聽接口 |
OnLiveRecordErrorListener | 推流錯誤信息監聽接口 |
4.1 AlivcMediaRecorderFactory
類名:AlivcMediaRecorderFactory
功能:創建推流器接口AlivcMediaRecorder
成員:
成員 | 功能 |
---|---|
createMediaRecorder | 創建推流器AlivcMediaRecorder |
詳細說明:
AlivcMediaRecorderFactory.createMediaRecorder()
createMediaRecorder用來創建推流器,返回AlivcMediaRecorder類。
參數:
空
返回值:返回空為錯誤,正確則為有效的AlivcMediaRecorder值。
4.2 AlivcMediaRecorder
類名:AlivcMediaRecorder
功能:推流器接口類AlivcMediaRecorder,提供推流控製
成員:
成員 | 功能 |
---|---|
init | 初始化推流器 |
prepare | 開始預覽 |
startRecord | 開始推流 |
switchCamera | 切換攝像頭 |
stopRecord | 結束推流 |
reset | 釋放預覽資源,對應的是prepare |
focusing | 對焦 |
setZoom | 縮放 |
setPreviewSize | 設置預覽大小 |
addFlag | 添加美顏 |
removeFlag | 移除美顏 |
release | 釋放資源對應: init |
setOnRecordErrorListener | 設置推流錯誤回調 |
setOnRecordStatusListener | 設置推流的狀態回調監聽 |
setOnNetworkStatusListener | 設置網絡狀態的回調監聽 |
getVersionName | 獲取SDK版本名稱 |
下麵詳細介紹一下各個成員函數的具體使用:
- 1.初始化推流器
/**
* @param context:Android上下文
*/
void init(Context context);
- 2.開始預覽
/**
* 開始預覽
* @param params: 推流過程中不可動態改變的參數.
* @param surface: 預覽窗口
*/
void prepare(Map<String, Object> params, Surface surface);
- 3.開始推流
/**
* @param outputUrl 推流地址URL
*/
void startRecord(String outputUrl);
備注:在prepare完成之後調用startRecord進行推流。
- 4.結束推流
void stopRecord();
- 5.切換攝像頭
void switchCamera();
- 6.釋放資源
void reset();
備注:釋放預覽資源,對應的是prepare
- 手動對焦
/**
* @param xRatio 橫向坐標點所占的比例
* @param yRatio 縱向坐標點所占的比例
*/
void focusing(float xRatio, float yRatio);
- 8.縮放
/**
* 這是個新增加的接口,老接口為下麵的接口,已經廢棄,不建議使用
*
* @param scaleFactor參數為縮放比例
*/
void setZoom(float scaleFactor);
/**
* 這個接口已經廢棄了,建議使用上麵的接口
*
* @param scaleFactor參數為縮放比例
*/
@Deceperated
void setZoom(float scaleFactor,CaptureRequest.OnCaptureRequestResultListener listener);
- 9.設置預覽大小
/**
* @param width 預覽寬
* @param height 預覽高
*/
void setPreviewSize(int width, int height);
- 10.開啟美顏/開啟手動對焦/開啟閃光燈/開啟靜音推流
/**
* 增加效果 如:美顏,對焦,閃光燈,靜音等
* @see AlivcMediaFormat#FLAG_BEAUTY_ON
* @see AlivcMediaFormat#FLAG_AUTO_FOCUS_ON
* @see AlivcMediaFormat#FLAG_FLASH_MODE_ON
* @see AlivcMediaFormat#FLAG_MUTE_ON
* @see AlivcMediaRecorder#removeFlag(int)
* @param flag
*/
void addFlag(int flag);
- 11.關閉美顏/關閉手動對焦/關閉閃光燈/關閉靜音推流
/**
* 移除效果 如:美顏,對焦,閃光燈,靜音等
* @see AlivcMediaFormat#FLAG_BEAUTY_ON
* @see AlivcMediaFormat#FLAG_AUTO_FOCUS_ON
* @see AlivcMediaFormat#FLAG_FLASH_MODE_ON
* @see AlivcMediaFormat#FLAG_MUTE_ON
* @param flag
*/
void removeFlag(int flag);
- 12.釋放資源
void release();
- 13.設置推流錯誤回調
/**
* @param listener 直播錯誤回調
*/
void setOnRecordErrorListener(OnLiveRecordErrorListener listener);
備注:具體的錯誤信息會在下麵介紹
- 14.設置推流的狀態回調監聽
/**
* @param listener 直播狀態回調
*/
void setOnRecordStatusListener(OnRecordStatusListener listener);
備注:回調具體的信息在下麵介紹
- 15.設置網絡狀態的回調監聽
/**
* @param listener 直播網絡狀態回調
*/
void setOnNetworkStatusListener(OnNetworkStatusListener listener);
備注:回調具體的信息在下麵介紹
- 16.添加水印圖片
首先需要創建一個水印信息對像——AlivcWatermark
AlivcWatermark mWatermark = new AlivcWatermark.Builder()
.watermarkUrl(bundle.getString(WATERMARK_PATH)) //水印圖片地址
.paddingX(bundle.getInt(WATERMARK_DX)) //水印圖片在x軸的偏移
.paddingY(bundle.getInt(WATERMARK_DY)) //水印圖片在y軸的偏移
.site(bundle.getInt(WATERMARK_SITE)) //水印圖片位置
.build();
水印位置有四個常量表示:
常量值 | 含義 |
---|---|
AlivcWatermark.SITE_TOP_LEFT | 左上角 |
AlivcWatermark.SITE_TOP_RIGHT | 右上角 |
AlivcWatermark.SITE_BOTTOM_LEFT | 左下角 |
AlivcWatermark.SITE_BOTTOM_RIGHT | 右下角 |
然後需要將該水印信息描述對像通過AlivcMediaRecorder#prepare接口的map參數傳入進去
mConfigure.put(AlivcMediaFormat.KEY_WATERMARK, mWatermark); //配置水印信息
......
mMediaRecorder.prepare(mConfigure, mPreviewSurface);
- 17.獲取SDK版本名稱
String getVersionName()
4.3 OnNetworkStatusListener
當調用startRecord()後,推流器開始推流,當前的網絡連接狀態會返回,用戶需要注冊該事件,以便獲取到該時間通知,在結束和開始的狀態都會給予返回.
public interface OnNetworkStatusListener {
/**
* 網絡較差時的回調,此時推流buffer為滿的狀態,會執行丟包,此時數據流不能正常推送
*/
void onNetworkBusy();
/**
* 網絡空閑狀態,此時本地推流buffer不滿,數據流可正常發送
*/
void onNetworkFree();
/**
* @param status
*/
void onConnectionStatusChange(int status);
/**
* 重連失敗
* @return false:停止重連 true:繼續重連
* 說明: sdk檢測到檢測到需要重連時將會自動執行重連,直到重連成功或者重連嚐試超時,
* 超時時間可以通過{@link AlivcMediaFormat#KEY_RECONNECT_TIMEOUT}來設置,
* 默認為5s,超時後將觸發此回調,若返回true表示繼續開始新的一輪嚐試,返回false,
* 表示不再嚐試
*/
boolean onNetworkReconnectFailed();
}
注意:這裏 onNetworkReconnect()接口已經移除掉,現在網絡重連為sdk自動執行,在重連指定時間後弱依然不能重連成功,則會執行onNetworkReconnectFailed()的回調,表示重連失敗。
4.4 OnRecordStatusListener
當prepare完成後,會發出該事件通知消息,用戶需要注冊該事件,采集開始得到攝像頭的狀態以便做一些事情,比如進入對焦一次。
public interface OnRecordStatusListener {
/*** 攝像頭打開成功 */
void onDeviceAttach();
/*** 開啟預覽成功 */
void onSessionAttach();
/** * 停止預覽 */
void onSessionDetach();
/*** 關閉攝像頭 */
void onDeviceDetach();
/**攝像頭打開失敗**/
void onDeviceAttachFailed(int facing)
}
4.5 OnLiveRecordErrorListener
當開始推流,返回給開發者的錯誤信息。
public interface OnLiveRecordErrorListener {
/**
* @param errorCode 獲取到的錯誤類型Code
* @see AlivcStatusCode#ERROR_**
*/
void onError(int errorCode);
}
備注:具體ErrorCode詳情可參考下麵的ErrorCode說明
5. ErrorCode說明
ErrorCode常量 | 含義 | 可能出現的場景 |
---|---|---|
AlivcStatusCode.ERROR_BROKEN_PIPE | 管道中斷 | 推流時進行了違法操作,比如同時推流同一個地址,或者重複推流,服務器端會主動關閉socket,引起broken pipe |
AlivcStatusCode.ERROR_OUT_OF_MEMORY | 內存不足 | 手機內存不足時導致底層某些內存開辟失敗引起該錯誤 |
AlivcStatusCode.ERROR_IO | I/O錯誤 | 導致該錯誤的情況比較多,比如網絡環境較差或者推流域名錯誤等導致DNS解析失敗等 |
AlivcStatusCode.ERROR_iLLIGAL_ARGUMENT | 參數非法 | 該錯誤通常發生在幀數據錯誤的情況下 |
AlivcStatusCode.ERROR_NETWORK_UNREACHABLE | 網絡不可達 | 該錯誤通常發生在網絡無法傳輸數據的情況,或者推流過程網絡中斷等情況 |
AlivcStatusCode.ERROR_SERVER_CLOSED_CONNECTION | 服務器關閉鏈接 | 發生違法操作時,服務器會主動斷開鏈接 |
AlivcStatusCode.ERROR_CONNECTION_TIMEOUT | 網絡鏈接超時 | 網絡較差時導致鏈接超時或者數據發送超時 |
AlivcStatusCode.ERROR_AUTH_FAILED | 鑒權失敗 | 推流地址開啟鑒權時,鑒權失敗 |
AlivcStatusCode.ERROR_OPERATION_NOT_PERMITTED | 操作不允許 | 發生違法操作時,服務器端主動斷開鏈接導致 |
AlivcStatusCode.ERROR_CONNECTION_REFUSED | 服務器拒絕鏈接 | 域名解析錯誤,或者其他異常導致無法鏈接服務器時 |
6.打點日誌
- 獲取性能日誌
所有的性能日誌都通過AlivcRecordReporter來獲取,通過AlivcMediaRecorder#getRecordReporter()獲取AlivcRecordReporter的對象注意:AlivcMediaRecorder#getRecordReporter()必須在AlivcMediaRecordReporter#init()方法之後,AlivcMediaRecordReporter#release()方法之前調用,否則將返回一個null對象
/ 獲取int類型的性能屬性 /AlivcRecordReporter#getInt(int key);
/ 獲取Double類型的性能屬性 /AlivcRecordReporter#getDouble(int key);
/ 獲取Long類型的性能屬性 /AlivcRecordReporter#getLong(int key);
/ 獲取Float類型的性能屬性 /AlivcRecordReporter#getFloat(int key);
/ 獲取boolean類型的性能屬性 /AlivcRecordReporter#getBoolean(int key);
/ 獲取String類型的性能屬性 /AlivcRecordReporter#getString(int key);
相關屬性的Key值都可通過AlivcRecordReporter拿到,比如視頻采集幀率的Key值——AlivcRecordReporter#VIDEO_CAPTURE_FPS,其對應的屬性值類型可在相應的類文檔中查看。
- 事件通知
打點事件是通過訂閱的形式獲取監聽,通過AlivcMediaRecorder#subscribeEvent()訂閱一個事件,通過AlivcMediaRecorder#unSubscribeEvent()取消訂閱。
訂閱事件: 需要創建一個AlivcEventSubscriber對象,該對象中包含要訂閱的事件類型以及對應的事件響應,事件類型可以通過AlivcEvent#EventType類中定義的常量來表示。事件響應需要實現AlivcEventResponse接口,其中的onEvent表示事件發生,其參數AlivcEvent代表一個事件,AlivcEvent#getBundle()方法獲取一個Bundle對象,該對象存儲了事件的一些相關信息,具體每個事件對應有哪些信息可以查看相關類文檔,獲取事件信息的Key值可以通過AlivcEvent$EventBundleKey中定義的常量表示
7. 注意事項
無
8. 版權聲明
版權所有,切勿盜版
最後更新:2016-11-23 17:16:11
上一篇:
直播錄製視頻轉點播__使用手冊_視頻直播-阿裏雲
下一篇:
iOS 推流SDK使用說明__SDK文檔及下載_API及SDK_視頻直播-阿裏雲
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲