閱讀433 返回首頁    go iPhone_iPad_Mac_手機_平板_蘋果apple


Android 推流SDK使用說明__SDK文檔及下載_API及SDK_視頻直播-阿裏雲

文檔說明:本文檔麵向所有使用該SDK的開發人員、測試人員以及對此感興趣的用戶,要求讀者具有一定的Android開發能力。

1. 簡介

安卓推流SDK是在安卓平台上使用的軟件開發工具包(Soft Development Kit),為Android開發者提供簡單易用的接口,幫助開發者實現Android平台上的推流應用開發。

1.1功能說明

  1. 方便快捷、低門檻實現媒體推流功能。用戶無須關心內部實現細節,隻需要自定義界麵既可以實現專業級的推流應用。

  2. 推流支持格式:rtmp

  3. 編碼目前為硬編

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):

  1. splits {
  2. abi {
  3. enable true
  4. reset()
  5. include 'armeabi-v7a'
  6. }
  7. }

注意:如果使用其他的第三方庫也有對.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 開發步驟

首先在安卓應用程序中,需要聲明以下權限:

  1. <uses-permission android:name="android.permission.INTERNET" />
  2. <uses-permission android:name="android.permission.CAMERA" />
  3. <uses-permission android:name="android.permission.RECORD_AUDIO" />
  4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  5. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  7. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  8. <uses-permission android:name="android.permission.READ_SETTINGS" />
  9. <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  10. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  11. <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
  1. _CameraSurface = (SurfaceView) findViewById(R.id.camera_surface);
  2. _CameraSurface.getHolder().addCallback(_CameraSurfaceCallback);
  3. private final SurfaceHolder.Callback _CameraSurfaceCallback = new SurfaceHolder.Callback() {
  4. @Override
  5. public void surfaceCreated(SurfaceHolder holder) {
  6. holder.setKeepScreenOn(true);
  7. mPreviewSurface = holder.getSurface();
  8. }
  9. @Override
  10. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  11. mMediaRecorder.setPreviewSize(width, height);
  12. mPreviewWidth = width;
  13. mPreviewHeight = height;
  14. }
  15. @Override
  16. public void surfaceDestroyed(SurfaceHolder holder) {
  17. mPreviewSurface = null;
  18. mMediaRecorder.stopRecord();
  19. mMediaRecorder.reset();
  20. }
  21. };
  22. mPreviewSurface = holder.getSurface();
2)、 創建推流器,準備推流:
  • 1.創建實例初始化
  1. mMediaRecorder = AlivcMediaRecorderFactory.createMediaRecorder();
  2. mMediaRecorder.init(this);
  3. mMediaRecorder.setOnRecordStatusListener(mRecordStatusListener);
  4. mMediaRecorder.setOnNetworkStatusListener(mOnNetworkStatusListener);
  5. mMediaRecorder.setOnRecordErrorListener(mOnErrorListener);
  • 2.開始預覽
  1. private Map<String, Object> mConfigure = new HashMap<>();
  2. mConfigure.put(AlivcMediaFormat.KEY_CAMERA_FACING, cameraFrontFacing);
  3. mConfigure.put(AlivcMediaFormat.KEY_MAX_ZOOM_LEVEL, 3);
  4. mConfigure.put(AlivcMediaFormat.KEY_OUTPUT_RESOLUTION, resolution);
  5. mMediaRecorder.prepare(mConfigure, mPreviewSurface);
  • 3.開始推流
  1. mMediaRecorder.startRecord(pushUrl);
  • 4.開啟關閉美顏濾鏡
  1. mMediaRecorder.addFlag(AlivcMediaFormat.FLAG_BEAUTY_ON);//開啟美顏
  2. mMediaRecorder.removeFlag(AlivcMediaFormat.FLAG_BEAUTY_ON);//關閉美顏
  • 5.切換攝像頭
  1. mMediaRecorder.switchCamera();
  • 6.對焦
  1. mMediaRecorder.focusing(x, y);// demo提供了首次對焦+手動對焦
  • 7.縮放
  1. mMediaRecorder.setZoom(scaleGestureDetector.getScaleFactor());
  • 8.結束推流
  1. mMediaRecorder.stopRecord();
  • 9.釋放資源
  1. mMediaRecorder.reset();//釋放預覽資源
  2. mMediaRecorder.release();//釋放推流資源
  • 10.添加水印
  1. //創建水印信息對象
  2. mWatermark = new AlivcWatermark.Builder()
  3. .watermarkUrl(bundle.getString(WATERMARK_PATH)) //水印圖片地址
  4. .paddingX(bundle.getInt(WATERMARK_DX)) //水印圖片在x軸的偏移
  5. .paddingY(bundle.getInt(WATERMARK_DY)) //水印圖片在y軸的偏移
  6. .site(bundle.getInt(WATERMARK_SITE)) //水印圖片位置
  7. .build();
  8. mConfigure.put(AlivcMediaFormat.KEY_WATERMARK, mWatermark); //配置水印信息
3) 網絡狀態事件通知— OnNetworkStatusListener

OnNetworkStatusListener:

  1. /**
  2. * 網絡較差時的回調,此時推流buffer為滿的狀態,會執行丟包,此時數據流不能正常推送
  3. */
  4. void onNetworkBusy();
  5. /**
  6. * 網絡空閑狀態,此時本地推流buffer不滿,數據流可正常發送
  7. */
  8. void onNetworkFree();
  9. /**
  10. * @param status
  11. */
  12. void onConnectionStatusChange(int status);
  13. /**
  14. * 網絡重連
  15. * @return false:停止重連 true:允許重連
  16. */
  17. boolean onNetworkReconnect();
4) 錯誤事件通知中:
  1. private OnLiveRecordErrorListener mOnErrorListener = new OnLiveRecordErrorListener() {
  2. @Override
  3. public void onError(int errorCode) {
  4. switch (errorCode) {
  5. case AlivcStatusCode.ERROR_SERVER_CLOSED_CONNECTION:
  6. case AlivcStatusCode.ERORR_OUT_OF_MEMORY:
  7. case AlivcStatusCode.ERROR_CONNECTION_TIMEOUT:
  8. case AlivcStatusCode.ERROR_BROKEN_PIPE:
  9. case AlivcStatusCode.ERROR_ILLEGAL_ARGUMENT:
  10. case AlivcStatusCode.ERROR_IO:
  11. case AlivcStatusCode.ERROR_NETWORK_UNREACHABLE:
  12. Log.i(TAG, "Live stream connection error-->" + errorCode);
  13. ToastUtils.showToast(LiveCameraActivity.this,"Live stream connection error-->" + errorCode);
  14. break;
  15. default:
  16. }
  17. }
  18. };

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.初始化推流器
  1. /**
  2. * @param context:Android上下文
  3. */
  4. void init(Context context);
  • 2.開始預覽
  1. /**
  2. * 開始預覽
  3. * @param params: 推流過程中不可動態改變的參數.
  4. * @param surface: 預覽窗口
  5. */
  6. void prepare(Map<String, Object> params, Surface surface);
  • 3.開始推流
  1. /**
  2. * @param outputUrl 推流地址URL
  3. */
  4. void startRecord(String outputUrl);

備注:在prepare完成之後調用startRecord進行推流。

  • 4.結束推流
  1. void stopRecord();
  • 5.切換攝像頭
  1. void switchCamera();
  • 6.釋放資源
  1. void reset();

備注:釋放預覽資源,對應的是prepare

    1. 手動對焦
  1. /**
  2. * @param xRatio 橫向坐標點所占的比例
  3. * @param yRatio 縱向坐標點所占的比例
  4. */
  5. void focusing(float xRatio, float yRatio);
  • 8.縮放
  1. /**
  2. * 這是個新增加的接口,老接口為下麵的接口,已經廢棄,不建議使用
  3. *
  4. * @param scaleFactor參數為縮放比例
  5. */
  6. void setZoom(float scaleFactor);
  1. /**
  2. * 這個接口已經廢棄了,建議使用上麵的接口
  3. *
  4. * @param scaleFactor參數為縮放比例
  5. */
  6. @Deceperated
  7. void setZoom(float scaleFactor,CaptureRequest.OnCaptureRequestResultListener listener);
  • 9.設置預覽大小
  1. /**
  2. * @param width 預覽寬
  3. * @param height 預覽高
  4. */
  5. void setPreviewSize(int width, int height);
  • 10.開啟美顏/開啟手動對焦/開啟閃光燈/開啟靜音推流
  1. /**
  2. * 增加效果 如:美顏,對焦,閃光燈,靜音等
  3. * @see AlivcMediaFormat#FLAG_BEAUTY_ON
  4. * @see AlivcMediaFormat#FLAG_AUTO_FOCUS_ON
  5. * @see AlivcMediaFormat#FLAG_FLASH_MODE_ON
  6. * @see AlivcMediaFormat#FLAG_MUTE_ON
  7. * @see AlivcMediaRecorder#removeFlag(int)
  8. * @param flag
  9. */
  10. void addFlag(int flag);
  • 11.關閉美顏/關閉手動對焦/關閉閃光燈/關閉靜音推流
  1. /**
  2. * 移除效果 如:美顏,對焦,閃光燈,靜音等
  3. * @see AlivcMediaFormat#FLAG_BEAUTY_ON
  4. * @see AlivcMediaFormat#FLAG_AUTO_FOCUS_ON
  5. * @see AlivcMediaFormat#FLAG_FLASH_MODE_ON
  6. * @see AlivcMediaFormat#FLAG_MUTE_ON
  7. * @param flag
  8. */
  9. void removeFlag(int flag);
  • 12.釋放資源
  1. void release();
  • 13.設置推流錯誤回調
  1. /**
  2. * @param listener 直播錯誤回調
  3. */
  4. void setOnRecordErrorListener(OnLiveRecordErrorListener listener);

備注:具體的錯誤信息會在下麵介紹

  • 14.設置推流的狀態回調監聽
  1. /**
  2. * @param listener 直播狀態回調
  3. */
  4. void setOnRecordStatusListener(OnRecordStatusListener listener);

備注:回調具體的信息在下麵介紹

  • 15.設置網絡狀態的回調監聽
  1. /**
  2. * @param listener 直播網絡狀態回調
  3. */
  4. void setOnNetworkStatusListener(OnNetworkStatusListener listener);

備注:回調具體的信息在下麵介紹

  • 16.添加水印圖片

首先需要創建一個水印信息對像——AlivcWatermark

  1. AlivcWatermark mWatermark = new AlivcWatermark.Builder()
  2. .watermarkUrl(bundle.getString(WATERMARK_PATH)) //水印圖片地址
  3. .paddingX(bundle.getInt(WATERMARK_DX)) //水印圖片在x軸的偏移
  4. .paddingY(bundle.getInt(WATERMARK_DY)) //水印圖片在y軸的偏移
  5. .site(bundle.getInt(WATERMARK_SITE)) //水印圖片位置
  6. .build();

水印位置有四個常量表示:

常量值 含義
AlivcWatermark.SITE_TOP_LEFT 左上角
AlivcWatermark.SITE_TOP_RIGHT 右上角
AlivcWatermark.SITE_BOTTOM_LEFT 左下角
AlivcWatermark.SITE_BOTTOM_RIGHT 右下角

然後需要將該水印信息描述對像通過AlivcMediaRecorder#prepare接口的map參數傳入進去

  1. mConfigure.put(AlivcMediaFormat.KEY_WATERMARK, mWatermark); //配置水印信息
  2. ......
  3. mMediaRecorder.prepare(mConfigure, mPreviewSurface);
  • 17.獲取SDK版本名稱
  1. String getVersionName()

4.3 OnNetworkStatusListener

當調用startRecord()後,推流器開始推流,當前的網絡連接狀態會返回,用戶需要注冊該事件,以便獲取到該時間通知,在結束和開始的狀態都會給予返回.

  1. public interface OnNetworkStatusListener {
  2. /**
  3. * 網絡較差時的回調,此時推流buffer為滿的狀態,會執行丟包,此時數據流不能正常推送
  4. */
  5. void onNetworkBusy();
  6. /**
  7. * 網絡空閑狀態,此時本地推流buffer不滿,數據流可正常發送
  8. */
  9. void onNetworkFree();
  10. /**
  11. * @param status
  12. */
  13. void onConnectionStatusChange(int status);
  14. /**
  15. * 重連失敗
  16. * @return false:停止重連 true:繼續重連
  17. * 說明: sdk檢測到檢測到需要重連時將會自動執行重連,直到重連成功或者重連嚐試超時,
  18. * 超時時間可以通過{@link AlivcMediaFormat#KEY_RECONNECT_TIMEOUT}來設置,
  19. * 默認為5s,超時後將觸發此回調,若返回true表示繼續開始新的一輪嚐試,返回false,
  20. * 表示不再嚐試
  21. */
  22. boolean onNetworkReconnectFailed();
  23. }

注意:這裏 onNetworkReconnect()接口已經移除掉,現在網絡重連為sdk自動執行,在重連指定時間後弱依然不能重連成功,則會執行onNetworkReconnectFailed()的回調,表示重連失敗。

4.4 OnRecordStatusListener

當prepare完成後,會發出該事件通知消息,用戶需要注冊該事件,采集開始得到攝像頭的狀態以便做一些事情,比如進入對焦一次。

  1. public interface OnRecordStatusListener {
  2. /*** 攝像頭打開成功 */
  3. void onDeviceAttach();
  4. /*** 開啟預覽成功 */
  5. void onSessionAttach();
  6. /** * 停止預覽 */
  7. void onSessionDetach();
  8. /*** 關閉攝像頭 */
  9. void onDeviceDetach();
  10. /**攝像頭打開失敗**/
  11. void onDeviceAttachFailed(int facing)
  12. }

4.5 OnLiveRecordErrorListener

當開始推流,返回給開發者的錯誤信息。

  1. public interface OnLiveRecordErrorListener {
  2. /**
  3. * @param errorCode 獲取到的錯誤類型Code
  4. * @see AlivcStatusCode#ERROR_**
  5. */
  6. void onError(int errorCode);
  7. }

備注:具體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.打點日誌

    1. 獲取性能日誌

所有的性能日誌都通過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,其對應的屬性值類型可在相應的類文檔中查看。

    1. 事件通知

打點事件是通過訂閱的形式獲取監聽,通過AlivcMediaRecorder#subscribeEvent()訂閱一個事件,通過AlivcMediaRecorder#unSubscribeEvent()取消訂閱。

訂閱事件: 需要創建一個AlivcEventSubscriber對象,該對象中包含要訂閱的事件類型以及對應的事件響應,事件類型可以通過AlivcEvent#EventType類中定義的常量來表示。事件響應需要實現AlivcEventResponse接口,其中的onEvent表示事件發生,其參數AlivcEvent代表一個事件,AlivcEvent#getBundle()方法獲取一個Bundle對象,該對象存儲了事件的一些相關信息,具體每個事件對應有哪些信息可以查看相關類文檔,獲取事件信息的Key值可以通過AlivcEvent$EventBundleKey中定義的常量表示

7. 注意事項

8. 版權聲明

版權所有,切勿盜版

最後更新:2016-11-23 17:16:11

  上一篇:go 直播錄製視頻轉點播__使用手冊_視頻直播-阿裏雲
  下一篇:go iOS 推流SDK使用說明__SDK文檔及下載_API及SDK_視頻直播-阿裏雲