主要功能
推流:RTMP 推流
示例代码
public class PushActivity extends Activity {
VHVideoCaptureView videoCapture;
IVHCapture audioCapture;
VHLivePusher pusher;
VHLivePushConfig config;
//status info
boolean isFlashOpen = false;
int mCameraId = 0;
boolean isAudioEnable = true;
boolean isPushing = false;
int mDrawMode = VHLivePushFormat.DRAW_MODE_NONE;
//view
TextView mSpeedView;
ProgressBar mLoadingView;
ImageView mPushBtn;
private String roomId = "";
private String accessToken = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
roomId = getIntent().getStringExtra("roomid");
accessToken =getIntent().getStringExtra("token");
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.push_layout);
//initview
mSpeedView = (TextView) this.findViewById(R.id.tv_speed);
mLoadingView = (ProgressBar) this.findViewById(R.id.pb_loading);
mPushBtn = (ImageView) this.findViewById(R.id.btn_push);
//配置发直播系列参数
config = new VHLivePushConfig(VHLivePushFormat.PUSH_MODE_HD);
config.screenOri = VHLivePushFormat.SCREEN_ORI_PORTRAIT;//横竖屏设置 重要
//初始化音视频采集器
videoCapture = (VHVideoCaptureView) this.findViewById(R.id.videoCaptureView);
audioCapture = new VHAudioCapture();
//初始化直播器
pusher = new VHLivePusher(videoCapture, audioCapture, config);
pusher.addListener(new MyListener());
}
@Override
protected void onPause() {
super.onPause();
if (pusher.getStatus() == IVHLivePusher.Status.STARTED) {
pusher.pause();
mPushBtn.setImageResource(R.mipmap.icon_start_bro);
}
}
@Override
protected void onResume() {
super.onResume();
if (pusher.resumeAble())
pusher.resume();
}
@Override
protected void onDestroy() {
super.onDestroy();
pusher.release();
}
public void push(View view) {
if (isPushing) {
pusher.stop();
mPushBtn.setImageResource(R.mipmap.icon_start_bro);
} else {
if (pusher.resumeAble())
pusher.resume();
else
pusher.start(roomId, accessToken);
mPushBtn.setImageResource(R.mipmap.icon_pause_bro);
}
}
public void changeFlash(View view) {
isFlashOpen = videoCapture.changeFlash(!isFlashOpen);
}
public void changeCamera(View view) {
mCameraId = videoCapture.switchCamera();
}
public void changeFilter(View view) {
int level = (++mBeautyLevel) % 6;
if (level == 0)
videoCapture.setFilter(null);
else {
videoCapture.setFilter(new VHBeautyFilter());
videoCapture.setBeautyLevel(level);
}
Toast.makeText(this, "level:" + level, Toast.LENGTH_SHORT).show();
}
public void switchAudio(View view) {
isAudioEnable = audioCapture.setEnable(!isAudioEnable);
}
public void changeMode(View view) {
switch (mDrawMode) {
case VHLivePushFormat.DRAW_MODE_NONE:
mDrawMode = VHLivePushFormat.DRAW_MODE_ASPECTFILL;
break;
case VHLivePushFormat.DRAW_MODE_ASPECTFILL:
mDrawMode = VHLivePushFormat.DRAW_MODE_ASPECTFIT;
break;
case VHLivePushFormat.DRAW_MODE_ASPECTFIT:
mDrawMode = VHLivePushFormat.DRAW_MODE_NONE;
break;
}
videoCapture.setCameraDrawMode(mDrawMode);
}
class MyListener implements VHPushLiveListener {
@Override
public void onError(int errorCode, int innerErrorCode) {
mLoadingView.setVisibility(View.GONE);
switch (errorCode) {
case VHLivePusher.ERROR_PUSH://推送过程出错
break;
case VHLivePusher.ERROR_AUDIO_CAPTURE://音频采集过程出错
break;
case VHLivePusher.ERROR_VIDEO_CAPTURE://视频采集过程出错
break;
}
Toast.makeText(PushActivity.this, "push error,errorCode:" + errorCode + ",innerCode:" + innerErrorCode, Toast.LENGTH_SHORT).show();
}
@Override
public void onEvent(int eventCode, String eventMsg) {
switch (eventCode) {
case VHLivePusher.EVENT_STATUS_STARTING:
mLoadingView.setVisibility(View.VISIBLE);
break;
case VHLivePusher.EVENT_STATUS_STARTED:
mLoadingView.setVisibility(View.GONE);
isPushing = true;
break;
case VHLivePusher.EVENT_STATUS_STOPED:
mLoadingView.setVisibility(View.GONE);
isPushing = false;
break;
case VHLivePusher.EVENT_UPLOAD_SPEED:
mSpeedView.setText(eventMsg + "kbps");
break;
}
}
}
}