緊接着之前寫的安卓直播實現方法,項目后期發現有些定制的安卓設備外掛攝像頭,原來的android_rtmppush_sdk出現調取攝像頭(熱插拔)前后異常和畫面翻轉來回跳動的問題。之后調研發現有個封裝比較完善的純java編譯的開源安卓推流客戶端——yasea,效率高、延遲低、消息提示、自適應強。
我就簡單介紹一下基本使用方法,我下載的是最新版本v2.5,源碼包里面需要使用的是library這個module。
在android studio ide中import進來,導入可能會出現一些value值不存在或主題參數報錯,調高項目Compile Sdk Version(安卓編譯sdk版本)。搞定后參照源碼包中\app\src\main\java\net\ossrs\yasea\demo\MainActivity.java這里的使用方法。
先在你需要推流的activity進行實現幾個接口類public class ExecuteActivity extends Activity implements RtmpHandler.RtmpListener,
SrsRecordHandler.SrsRecordListener, SrsEncodeHandler.SrsEncodeListener {
......
}
然后生成需要重寫的一些函數。
需要注意的是清單文件聲明權限(不贅述)和在布局文件中攝像頭展示界面控件需要聲明成net.ossrs.yasea.SrsCameraView
android:id="@+id/surfaceViewEx"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
項目需要界面嵌入攝像頭,旁邊展示其他業務。activity中只在onCreate()中設置推流的一些核心功能。//聲明推流攝像頭展示界面對象
SrsPublisher mPublisher = new SrsPublisher((SrsCameraView)
findViewById(R.id.surfaceViewEx));
//設置編碼消息處理
mPublisher.setEncodeHandler(new SrsEncodeHandler(this));
//設置RTMP消息處理
mPublisher.setRtmpHandler(new RtmpHandler(this));
//設置記錄消息處理
mPublisher.setRecordHandler(new SrsRecordHandler(this));
//設置展示界面大小
mPublisher.setPreviewResolution(640, 480);
//設置橫屏推流 1為豎屏 2為橫屏
mPublisher.setScreenOrientation(2);
//設置輸出界面大小
mPublisher.setOutputResolution(640, 480);
//設置視頻高清模式
mPublisher.setVideoHDMode();
//打開攝像頭
mPublisher.startCamera();
//開始或暫停按鈕
btnPublish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isPublished) {
//設為硬編碼
mPublisher.switchToHardEncoder();
//開始推流
mPublisher.startPublish(rtmpUrl);
mPublisher.startCamera();
btnPublish.setBackgroundResource(R.drawable.stoppush);
setTextShow("開始推流!");
} else {
mPublisher.stopPublish();
mPublisher.stopRecord();
btnPublish.setBackgroundResource(R.drawable.push);
setTextShow("暫停推流!");
}
isPublished = !isPublished;
}
});
//切換攝像頭按鈕
btnSwitchCamera.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) { mPublisher.switchCameraFace((mPublisher.getCamraId() + 1) % Camera.getNumberOfCameras());
}
});
源碼中的示例能實現更多功能,有一些濾鏡效果,自動切換橫豎推流功能(測試會出現卡頓,甚至切換會停止推流,得需要先暫停再重新推流就能解決)。具體請參照示例MainActivity.java中的使用方法,源碼還是很規范的,可讀性較高。