看着腾讯直播的官方指导接入SDK,写了一个demo,有点简陋并且没全部demo应用,有空再更新吧,先做个笔记Mark先
demo地址

import android.content.DialogInterface;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.util.TypedValue;
import android.view.Surface;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;import com.tencent.rtmp.ITXLivePushListener;
import com.tencent.rtmp.TXLiveConstants;
import com.tencent.rtmp.TXLivePushConfig;
import com.tencent.rtmp.TXLivePusher;
import com.tencent.rtmp.ui.TXCloudVideoView;
import com.tencent.ugc.TXRecordCommon;import static com.tencent.rtmp.TXLiveConstants.PAUSE_FLAG_PAUSE_AUDIO;
import static com.tencent.rtmp.TXLiveConstants.PAUSE_FLAG_PAUSE_VIDEO;public class StartLiveActivity extends AppCompatActivity{private TXLivePushConfig mLivePushConfig;private TXCloudVideoView mCaptureView;private TXLivePusher mLivePusher;//设置清晰度private boolean mAutoBitrate;//画质优先private boolean mAutoResolution;//分辨率优先private int mVideoQuality = TXLiveConstants.VIDEO_QUALITY_HIGH_DEFINITION;//直播视频质量//美颜private int mBeautyStyle;//磨皮风格:  0:光滑  1:自然  2:朦胧private int mBeautyLevel;//磨皮等级: 取值为 0-9.取值为 0 时代表关闭美颜效果.默认值: 0,即关闭美颜效果.;private int mWhiteningLevel;//美白等级: 取值为 0-9.取值为 0 时代表关闭美白效果.默认值: 0,即关闭美白效果.private int mRuddyLevel;//红润等级: 取值为 0-9.取值为 0 时代表关闭美白效果.默认值: 0,即关闭美白效果.//滤镜private int filterIndex;//滤镜图片private int filterDegree;//滤镜程度private float expouseCompensation;//曝光值//摄像头private boolean mFlashTurnOn=true;//是否开启private boolean mTouchFocus=false;//是否手动(true)自动对焦(false),默认手动//设置水印private boolean isLogo=true;//true设置,false不设置private boolean HWVideoCode =true;//是否开启软(false,默认)硬件编码(true)//本地录制private TextView recordTv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_live);recordTv=findViewById(R.id.recordTv);mLivePusher = new TXLivePusher(this);mLivePushConfig = new TXLivePushConfig();mLivePushConfig.setTouchFocus(mTouchFocus);//是否自动对焦mLivePushConfig.setFrontCamera(true);//是否前置摄像头initLogo();//设置水印initHardWareCode();//软硬件编码setPasueBackImg();//后台推流,设置主播暂停背景图//horizontalPushCustom();//调整观众端表现//horizontalPushLiver();//调整主播端表现initLiveType();//开播类型}@Overrideprotected void onResume() {super.onResume();//10.4 切前台处理//mCaptureView.onResume();     // mCaptureView 是摄像头的图像渲染view//mLivePusher.resumePusher();  // 通知 SDK 重回前台推流}@Overrideprotected void onStop() {super.onStop();//10.3 切后台处理//mCaptureView.onPause();  // mCaptureView 是摄像头的图像渲染view//mLivePusher.pausePusher(); // 通知 SDK 进入“后台推流模式”了//10.4 后台推摄像头采集数据//如果希望主播在切后台或者跳转其他界面还能看到摄像头采集的画面, 按照以下配置即可。//1、step 10.1 和 step 10.2 无需设置。//2、在 step 10.3 中,注释 mLivePusher.pausePusher() 该方法。//3、在 step 10.4 中,注释 mLivePusher.resumePusher() 该方法。}@Overrideprotected void onDestroy() {super.onDestroy();stopRtmpPublish();//结束推流}//开播类型private void initLiveType() {AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("开始纯音频直播还是音视频直播");builder.setIcon(R.mipmap.ic_launcher);builder.setMessage("请选择纯音频直播或是音视频直播");builder.setPositiveButton("音视频直播", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {initStartLive();//开始直播}});builder.setNegativeButton("纯音频直播", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {initOnlyVoiceLive();}});builder.show();}//纯音频直播private void initOnlyVoiceLive() {// 只有在推流启动前设置启动纯音频推流才会生效,推流过程中设置不会生效。mLivePushConfig.enablePureAudioPush(true);   // true 为启动纯音频推流,而默认值是 false;mLivePusher.setConfig(mLivePushConfig);      // 重新设置 configString rtmpUrl = Constant.START_LIVE_URL;//开始直播的推流地址mLivePusher.startPusher(rtmpUrl);}//开始直播private void initStartLive() {mLivePusher.setConfig(mLivePushConfig);String rtmpUrl = Constant.START_LIVE_URL;//开始直播的推流地址mLivePusher.startPusher(rtmpUrl);mCaptureView = (TXCloudVideoView) findViewById(R.id.video_view);mLivePusher.startCameraPreview(mCaptureView);}//纯音频直播public void voiceLive(View view) {Log.e("uuuuuuuu :", "纯音频直播");initOnlyVoiceLive();}//设置清晰度public void setDifinition(View view) {Log.e("uuuuuuuu :", "设置清晰度");AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);final String[] arrayOfString = {"秀场直播", "手游直播", "连麦(主画面)", "连麦(小画面)", "视频通话"};localBuilder.setTitle("设置清晰度").setIcon(R.mipmap.ic_launcher).setItems(arrayOfString, new DialogInterface.OnClickListener() {public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {switch (paramAnonymousInt) {case 0://秀场直播mAutoBitrate = false;mAutoResolution = false;//VIDEO_QUALITY_SUPER_DEFINITIONmVideoQuality = TXLiveConstants.VIDEO_QUALITY_HIGH_DEFINITION;mLivePusher.setVideoQuality(mVideoQuality, mAutoBitrate, mAutoResolution);break;case 1://手游直播mAutoBitrate = true;mAutoResolution = true;mVideoQuality = TXLiveConstants.VIDEO_QUALITY_SUPER_DEFINITION;mLivePusher.setVideoQuality(mVideoQuality, mAutoBitrate, mAutoResolution);break;case 2://连麦(主画面)mAutoBitrate = true;mAutoResolution = true;mVideoQuality = TXLiveConstants.VIDEO_QUALITY_LINKMIC_MAIN_PUBLISHER;mLivePusher.setVideoQuality(mVideoQuality, mAutoBitrate, mAutoResolution);break;case 3://连麦(小画面)mAutoBitrate = false;mAutoResolution = false;mVideoQuality = TXLiveConstants.VIDEO_QUALITY_LINKMIC_SUB_PUBLISHER;mLivePusher.setVideoQuality(mVideoQuality, mAutoBitrate, mAutoResolution);break;case 4://视频通话mAutoBitrate = true;mAutoResolution = true;mVideoQuality = TXLiveConstants.VIDEO_QUALITY_REALTIEM_VIDEOCHAT;mLivePusher.setVideoQuality(mVideoQuality, mAutoBitrate, mAutoResolution);break;}//暂时不知道什么用if (mVideoQuality == TXLiveConstants.VIDEO_QUALITY_STANDARD_DEFINITION ||mVideoQuality == TXLiveConstants.VIDEO_QUALITY_HIGH_DEFINITION ||mVideoQuality == TXLiveConstants.VIDEO_QUALITY_SUPER_DEFINITION) {mLivePushConfig.setVideoEncodeGop(5);}// 列表对话框不加这句,点击选择后也后不会消失paramAnonymousDialogInterface.dismiss();}}).create().show();}//设置美颜public void beatify(View view) {Log.e("uuuuuuuu :", "美颜滤镜");//美颜滤镜mBeautyStyle = 0;//磨皮风格:  0:光滑  1:自然  2:朦胧mBeautyLevel = 0;//磨皮等级: 取值为 0-9.取值为 0 时代表关闭美颜效果.默认值: 0,即关闭美颜效果.;mWhiteningLevel = 0;//美白等级: 取值为 0-9.取值为 0 时代表关闭美白效果.默认值: 0,即关闭美白效果.mRuddyLevel = 0;//红润等级: 取值为 0-9.取值为 0 时代表关闭美白效果.默认值: 0,即关闭美白效果.AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);View view_beaty = getLayoutInflater().inflate(R.layout.beaty, null);SeekBar mStyleSeekBar = view_beaty.findViewById(R.id.mStyleSeekBar);final TextView mStyleTV = view_beaty.findViewById(R.id.mStyleTV);mStyleSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {mStyleTV.setText(progress + "");mBeautyStyle = progress;}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});SeekBar mLevelSeekBar = view_beaty.findViewById(R.id.mLevelSeekBar);final TextView mLevelTV = view_beaty.findViewById(R.id.mLevelTV);mLevelSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {mLevelTV.setText(progress + "");mBeautyLevel = progress;}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});SeekBar whiteningLevelSeekbar = view_beaty.findViewById(R.id.whiteningLevelSeekbar);final TextView whiteningLevelTV = view_beaty.findViewById(R.id.whiteningLevelTV);whiteningLevelSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {whiteningLevelTV.setText(progress + "");mWhiteningLevel = progress;}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});SeekBar ruddyLevelSeekbar = view_beaty.findViewById(R.id.ruddyLevelSeekbar);final TextView ruddyLevelTV = view_beaty.findViewById(R.id.ruddyLevelTV);ruddyLevelSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {ruddyLevelTV.setText(progress + "");mRuddyLevel = progress;}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});localBuilder.setTitle("设置美颜").setIcon(R.mipmap.ic_launcher).setView(view_beaty).setPositiveButton("确定美颜", new DialogInterface.OnClickListener() {public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {mLivePusher.setBeautyFilter(mBeautyStyle, mBeautyLevel, mWhiteningLevel, mRuddyLevel);}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {}}).create().show();}//设置滤镜public void filter(View view) {AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);View view_filter = getLayoutInflater().inflate(R.layout.filter, null);initFilterType(view_filter);localBuilder.setTitle("设置滤镜").setIcon(R.mipmap.ic_launcher).setView(view_filter).setPositiveButton("确定滤镜程度", new DialogInterface.OnClickListener() {public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {mLivePusher.setSpecialRatio(filterDegree / 10.f);//滤镜程度}}).setNegativeButton("确定滤镜图片", new DialogInterface.OnClickListener() {public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {setFilter(filterIndex);//滤镜图片}}).create().show();}//设置曝光值public void exposure(View view) {AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);View view_expouse = getLayoutInflater().inflate(R.layout.expouse, null);initExpouseView(view_expouse);localBuilder.setTitle("设置曝光值").setIcon(R.mipmap.ic_launcher).setView(view_expouse).setPositiveButton("确定曝光值", new DialogInterface.OnClickListener() {public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {mLivePusher.setExposureCompensation(expouseCompensation);}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {}}).create().show();}//设置摄像头public void setCameraHead(View view) {Log.e("uuuuuuuu :", "设置摄像头");AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);View view_camera = getLayoutInflater().inflate(R.layout.camera, null);initCameraView(view_camera);localBuilder.setTitle("设置曝光值").setIcon(R.mipmap.ic_launcher).setView(view_camera).setInverseBackgroundForced(false).setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt) {}}).create().show();}//设置水印logopublic void setLogo(View view) {Log.e("uuuuuuuu :", "设置水印logo");if (isLogo){Toast.makeText(this, "设置失败,水印LOGO已经设置了", Toast.LENGTH_SHORT).show();}else {Toast.makeText(this, "设置失败,需要在mLivePusher.setConfig(mLivePushConfig)之前调用!,这里已经做了,只需修改isLogo的值即可", Toast.LENGTH_SHORT).show();}}//开始软硬件编码public void hardwareCode(View view) {Log.e("uuuuuuuu :", "开始软硬件编码");if (HWVideoCode){Toast.makeText(this, "硬件加速失败,原因:\n1、当前手机 API 级别过低(最低 18)\n" +"2、需要在mLivePusher.setConfig(mLivePushConfig)之前调用!,这里已经做了,只需修改mTouchFocus的值即可", Toast.LENGTH_SHORT).show();}}//本地录制public void nativeRecord(View view) {Log.e("uuuuuuuu :", "本地录制");nativeRecord();}//后台推流public void backPush(View view) {Log.e("uuuuuuuu :", "纯音频直播");Toast.makeText(this, "查看代码中的10.1、10.2、10.3、10.4", Toast.LENGTH_SHORT).show();}//网络提示public void networkTips(View view) {Log.e("uuuuuuuu :", "网络提示");mLivePusher.setPushListener(new ITXLivePushListener() {@Overridepublic void onPushEvent(int event, Bundle bundle) {if (event==TXLiveConstants.PUSH_WARNING_NET_BUSY){Toast.makeText(StartLiveActivity.this, "您当前的网络状况不佳,推荐您离 WiFi 近一点,尽量不要让 WiFi 穿墙", Toast.LENGTH_SHORT).show();}}@Overridepublic void onNetStatus(Bundle bundle) {}});}//横屏推流public void horizontalPush(View view) {Log.e("uuuuuuuu :", "横屏推流");}//设置背景混淆音public void setBGM(View view) {Log.e("uuuuuuuu :", "设置背景混淆音");}//发送消息public void sendMessage(View view) {Log.e("uuuuuuuu :", "发送消息");//Android 示例代码//mLivePusher.sendMessage(questionInfo.getBytes("UTF-8"));//mLivePusher.sendMessage(new byte[]);byte[] bytes = new byte[]{};mLivePusher.sendMessageEx(bytes);}//==================================设置滤镜=======================//初始化Dialog的空件private void initFilterType(final View view_filter) {filterDegree = 0;final TextView mFilterTV = view_filter.findViewById(R.id.mFilterTV);SeekBar mFilterSeekBar = view_filter.findViewById(R.id.mFilterSeekBar);mFilterSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {filterDegree = progress;mFilterTV.setText("" + filterDegree);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});view_filter.findViewById(R.id.bailan).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 5;}});view_filter.findViewById(R.id.biaozhun).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 1;}});view_filter.findViewById(R.id.chaotuo).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 7;}});view_filter.findViewById(R.id.chunzhen).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 4;}});view_filter.findViewById(R.id.fennen).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 13;}});view_filter.findViewById(R.id.huaijiu).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 14;}});view_filter.findViewById(R.id.landiao).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 15;}});view_filter.findViewById(R.id.langman).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 10;}});view_filter.findViewById(R.id.qingliang).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 16;}});view_filter.findViewById(R.id.qinxi).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 11;}});view_filter.findViewById(R.id.rixi).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 17;}});view_filter.findViewById(R.id.weimei).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 12;}});view_filter.findViewById(R.id.white).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 9;}});view_filter.findViewById(R.id.xiangfen).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 8;}});view_filter.findViewById(R.id.yinghong).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 2;}});view_filter.findViewById(R.id.yuanqi).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 6;}});view_filter.findViewById(R.id.yunshang).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {filterIndex = 3;}});}//设置滤镜private void setFilter(int index) {Bitmap bmp = getFilterBitmapByIndex(index);if (mLivePusher != null) {mLivePusher.setFilter(bmp);}}//获取图片资源public Bitmap getFilterBitmapByIndex(int index) {Bitmap bmp = null;switch (index) {case 1:bmp = decodeResource(getResources(), R.drawable.filter_biaozhun);break;case 2:bmp = decodeResource(getResources(), R.drawable.filter_yinghong);break;case 3:bmp = decodeResource(getResources(), R.drawable.filter_yunshang);break;case 4:bmp = decodeResource(getResources(), R.drawable.filter_chunzhen);break;case 5:bmp = decodeResource(getResources(), R.drawable.filter_bailan);break;case 6:bmp = decodeResource(getResources(), R.drawable.filter_yuanqi);break;case 7:bmp = decodeResource(getResources(), R.drawable.filter_chaotuo);break;case 8:bmp = decodeResource(getResources(), R.drawable.filter_xiangfen);break;case 9:bmp = decodeResource(getResources(), R.drawable.filter_white);break;case 10:bmp = decodeResource(getResources(), R.drawable.filter_langman);break;case 11:bmp = decodeResource(getResources(), R.drawable.filter_qingxin);break;case 12:bmp = decodeResource(getResources(), R.drawable.filter_weimei);break;case 13:bmp = decodeResource(getResources(), R.drawable.filter_fennen);break;case 14:bmp = decodeResource(getResources(), R.drawable.filter_huaijiu);break;case 15:bmp = decodeResource(getResources(), R.drawable.filter_landiao);break;case 16:bmp = decodeResource(getResources(), R.drawable.filter_qingliang);break;case 17:bmp = decodeResource(getResources(), R.drawable.filter_rixi);break;default:bmp = null;break;}return bmp;}//获取资源图片转换private Bitmap decodeResource(Resources resources, int id) {TypedValue value = new TypedValue();resources.openRawResource(id, value);BitmapFactory.Options opts = new BitmapFactory.Options();opts.inTargetDensity = value.density;return BitmapFactory.decodeResource(resources, id, opts);}//======================================曝光值======================//初始化曝光值控件private void initExpouseView(View view_expouse) {SeekBar mExpuseSeekBar = view_expouse.findViewById(R.id.mExpuseSeekBar);final TextView mExpuseTV = view_expouse.findViewById(R.id.mExpuseTV);mExpuseSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {float p=(progress-10)/10.0f;expouseCompensation=p;mExpuseTV.setText("曝光值为:"+p);}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});}//===================================控制摄像头======================private void initCameraView(View view_camera) {TextView cameraTV = view_camera.findViewById(R.id.cameraTV);//前后摄像头TextView lampTV = view_camera.findViewById(R.id.lampTV);//闪光灯TextView mFocuseTV = view_camera.findViewById(R.id.mFocuseTV);//自动手动对焦TextView mMirrorTV = view_camera.findViewById(R.id.mMirrorTV);//镜像效果cameraTV.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 默认是前置摄像头mLivePusher.switchCamera();}});lampTV.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mLivePusher.turnOnFlashLight(mFlashTurnOn);//mFlashTurnOn为true表示打开,否则表示关闭if (!mLivePusher.turnOnFlashLight(mFlashTurnOn)) {Toast.makeText(getApplicationContext(), "打开闪光灯失败:绝大部分手机不支持前置闪光灯!", Toast.LENGTH_SHORT).show();}mFlashTurnOn=!mFlashTurnOn;}});mFocuseTV.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getApplicationContext(), "设置手自动对焦失败:需要在mLivePusher.setConfig(mLivePushConfig)之前调用!,这里已经做了,只需修改mTouchFocus的值即可", Toast.LENGTH_SHORT).show();}});mMirrorTV.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 需在 mLivePusher.setConfig(mLivePushConfig); 之后调用mLivePusher.setMirror(true);}});}//=================================软硬件编码========================private void initHardWareCode() {if (HWVideoCode){if (HWVideoCode){if (mLivePushConfig != null) {if(Build.VERSION.SDK_INT < 18){Toast.makeText(getApplicationContext(), "硬件加速失败,当前手机 API 级别过低(最低 18)",Toast.LENGTH_SHORT).show();HWVideoCode = false;}}}mLivePushConfig.setHardwareAcceleration(HWVideoCode ? TXLiveConstants.ENCODE_VIDEO_HARDWARE : TXLiveConstants.ENCODE_VIDEO_SOFTWARE);// 如果你不清楚要何时开启硬件加速, 建议设置为 ENCODE_VIDEO_AUTO// 默认是启用软件编码, 但手机 CPU 使用率超过 80% 或者帧率 <= 10, SDK 内部会自动切换为硬件编码//ENCODE_VIDEO_HARDWARE 开启硬件加速//ENCODE_VIDEO_SOFTWARE   禁用硬件加速,默认禁用硬件加速//ENCODE_VIDEO_AUTO   自动选择是否启用硬件加速}}//=================================设置水印========================private void initLogo() {if (isLogo){//设置视频水印,后面两个参数分别是水印位置的 X 轴坐标和 Y 轴坐标mLivePushConfig.setWatermark(BitmapFactory.decodeResource(getResources(), R.drawable.watermark), 10, 10);//设置视频水印//参数分别是水印图片的 Bitmap、水印位置的 X 轴坐标,水印位置的 Y 轴坐标,水印宽度。后面三个参数取值范围是[0, 1]//后面两个参数分别是水印位置的X轴坐标和 Y 轴坐标//mLivePushConfig.setWatermark(mBitmap, 0.02f, 0.05f, 0.2f);}}//=================================本地录制========================private void nativeRecord(){String externalFilesDir = getExternalFilesDir(Environment.DIRECTORY_MOVIES).toString()+".mp4";mLivePusher.startRecord(externalFilesDir);mLivePusher.setVideoRecordListener(new TXRecordCommon.ITXVideoRecordListener() {@Overridepublic void onRecordEvent(int event, Bundle bundle) {Log.e("本地录制==","完成"+event);}@Overridepublic void onRecordProgress(long milliSecond) {recordTv.setText(String.format("%02d:%02d",milliSecond/1000/60, milliSecond/1000%60));}@Overridepublic void onRecordComplete(TXRecordCommon.TXRecordResult txRecordResult) {Log.e("本地录制==","完成"+txRecordResult.videoPath+"  "+txRecordResult.coverPath);}});recordTv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mLivePusher.stopRecord();}});}//=============================后台推流============================// 设置主播暂停背景图private void setPasueBackImg() {mLivePushConfig.setPauseImg(300,5);// 300 为后台播放暂停图片的最长持续时间,单位是秒// 10 为后台播放暂停图片的帧率,最小值为 5,最大值为 20Bitmap bitmap = decodeResource(getResources(), R.drawable.pause_publish);mLivePushConfig.setPauseImg(bitmap);// 设置推流暂停时,后台播放的暂停图片, 图片最大尺寸不能超过 1920*1920.//10.2 设置setPauseFlagmLivePushConfig.setPauseFlag(PAUSE_FLAG_PAUSE_VIDEO|PAUSE_FLAG_PAUSE_AUDIO);//表示同时停止视频和音频采集,并且推送填充用的音视频流;//mLivePushConfig.setPauseFlag(PAUSE_FLAG_PAUSE_VIDEO);//表示停止摄像头采集视频画面,但保持麦克风继续采集声音,用于主播更衣等场景;}//===============================横屏推流===========================//调整观众端表现private void horizontalPushCustom() {// 竖屏状态, 手机 Home 键在正下方。   旋转 0 度mLivePushConfig.setHomeOrientation(TXLiveConstants.VIDEO_ANGLE_HOME_DOWN);// 横屏状态,手机 Home 键在右手方。   旋转 270 度mLivePushConfig.setHomeOrientation(TXLiveConstants.VIDEO_ANGLE_HOME_RIGHT);}//调整主播端表现private void horizontalPushLiver() {// 竖屏状态,本地渲染相对正方向的角度为0。mLivePusher.setRenderRotation(0);// 横屏状态,本地渲染相对正方向的角度为90。mLivePusher.setRenderRotation(90);}//Activity自旋转@Overridepublic void onConfigurationChanged(Configuration newConfig) {// 自动旋转打开,Activity随手机方向旋转之后,只需要改变推流方向int mobileRotation = getWindowManager().getDefaultDisplay().getRotation();int pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_DOWN;switch (mobileRotation) {case Surface.ROTATION_0:pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_DOWN;break;case Surface.ROTATION_90:pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_RIGHT;break;case Surface.ROTATION_270:pushRotation = TXLiveConstants.VIDEO_ANGLE_HOME_LEFT;break;default:break;}//通过设置config是设置生效(可以不用重新推流,腾讯云是少数支持直播中热切换分辨率的云商之一)mLivePusher.setRenderRotation(0);mLivePushConfig.setHomeOrientation(pushRotation);mLivePusher.setConfig(mLivePushConfig);}//===============================step 13:背景混音===========================//SDK 1.6.1 开始支持背景混音,支持主播带耳机和不带耳机两种场景,您可以通过 TXLivePusher 中的如下这组接口实现背景混音功能://playBGM 通过 path 传入一首歌曲,小直播 Demo中我们是从iOS的本地媒体库中获取音乐文件//stopBGM    停止播放背景音乐//pauseBGM  暂停播放背景音乐//resumeBGM 继续播放背景音乐//setMicVolume  设置混音时麦克风的音量大小,推荐在 UI 上实现相应的一个滑动条,由主播自己设置//setBGMVolume    设置混音时背景音乐的音量大小,推荐在 UI 上实现相应的一个滑动条,由主播自己设置//===============================step 14: 结束推流===========================//结束推流,注意做好清理工作public void stopRtmpPublish() {mLivePusher.stopCameraPreview(true); //停止摄像头预览mLivePusher.stopPusher();            //停止推流mLivePusher.setPushListener(null);   //解绑 listenermLivePusher.stopBGM();mLivePusher.stopScreenCapture();mCaptureView.setVisibility(View.GONE);}
}

注:
①、直播码获取:https://console.cloud.tencent.com/live/livecodemanage

②、接入文档地址:
https://cloud.tencent.com/document/product/268/7685

笔记:腾讯云直播SDK测试demo相关推荐

  1. 直播系统开发之ios对接腾讯云直播sdk

    这里是使用 Swift 语言编写对接腾讯云直播 SDK 的 demo 的示例代码.这段代码仅作为参考,实际应用中可能需要根据您的具体需求进行修改. 首先,你需要从腾讯云控制台获取 SDK 的 AppI ...

  2. 腾讯云直播SDK接入指南

    现如今直播类的app,如映客,抖音,火山视频等APP,基本大家手里都会安装,很多公司都可能会研发自己的直播系统,在2020年疫情阶段,很多老师采用了远程直播授课的方式.在国内如果你想使用直播技术,那么 ...

  3. 直播app开发之对接腾讯云直播sdk-安卓

    下载腾讯云直播SDK 首先,需要从腾讯云官网下载最新的腾讯云直播SDK,并将其添加到项目中. 添加权限 在 AndroidManifest.xml 文件中添加以下权限: phpCopy code< ...

  4. 智密-腾讯云直播 MLVB 插件优化教程:六步提升拉流速度+降低直播延迟

    前言 很多刚开始使用智密-腾讯云 MLVB 直播插件或者单独腾讯云直播 SDK的工程师在进行直播效果测试或者实际直播应用中可能会遇到延迟比较大.或者推流.拉流速度较慢的问题.今天智密科技就来分享一下如 ...

  5. ***腾讯云直播(含微信小程序直播)研究资料汇总-原创

    ***腾讯云直播(含微信小程序直播)研究资料汇总-原创 原文: ***腾讯云直播(含微信小程序直播)研究资料汇总-原创 这段时间抽空研究了下直播技术,综合比较了下腾讯云直播的技术和文档方面最齐全,现把 ...

  6. android端接入腾讯云直播全过程详解(包含腾讯云点播、腾讯云IM)直播+弹幕+录制直播视频

    前言 为什么想到对接腾讯云直播SDK呢?答案很简单--公司需要.从开始着手对接SDK,到现在直播全程流畅跑通,花了两周零几天的时间.为了帮后续也需要接入腾讯云直播SDK的朋友节省不必要的时间.少走点弯 ...

  7. 腾讯云直播、生成腾讯推拉流

    一.背景 最近公司用到推拉流,经过一番比较后决定使用腾讯云.但是腾讯云的文档确实有点一言难尽,去网上搜索一下例子,结果就是把腾讯云的demo粘贴过去,还必须得是会员才能看,坑啊!!所以把自己做的小de ...

  8. 腾讯云直播是什么?操作文档

    最近小白翻看腾讯云的文档,发现一个被隐藏了的功能.那就是云直播.目前很多学校.公司都开启了云办公形式.这次老师们都在使用钉钉直播.不过钉钉还是比较卡的.如果有人可以做个更好用的直播软件就好了.好了下面 ...

  9. Android开发-在Android里接入腾讯云推流SDK实现直播推流的功能

    前 言 如今,在国内移动互联网发展了几年的时间,移动开发技术也相对的成熟,在咱们日常使用的手机App中也少不了直播的功能,不管是娱乐类.游戏类.体育类还是教育类等的App都会有直播的功能,可以说直播的 ...

最新文章

  1. jmeter基本测试步骤
  2. java.net.SocketException四大异常解决方案
  3. C#中在多个地方调用同一个触发器从而触发同一个自定义委托的事件
  4. 利用Inotify和Rsync将webproject文件自己主动同步到多台应用server
  5. 网络中的七层协议与TCP/IP五层模型
  6. freebsd查询php5的版本,FreeBSD下查看各软件版本命令
  7. leetcode算法—无重复字符的最长子串 Longest Substring Without Repeating Characters
  8. 【C++ STL学习之六】STL算法之for_each
  9. Vmware虚拟机修改静态IP无法ping外网,以及eth0不见问题解决
  10. C++ const型成员函数与 non-const型成员函数
  11. Spring依赖注入流程【完整版】(populateBean方法内部执行流程)
  12. 【数据库学习】数据库平台:Postgres(PG)与PostgreSQL
  13. 在Openjdk 8 中如何合理使用容器 memory 资源
  14. OutLook邮件中设计添加个性签名
  15. 【最佳实践】瀚高数据库安全版v4.5.8非root用户运行的安装配置
  16. 小王的研发日记-自动对焦(硬件与计算机通信)
  17. 清华北大教授联袂推荐的好书:《区块链:金融应用实践》
  18. 【以史为鉴】《饱食穷民》读后感
  19. html select更改箭头样式,下拉列表-select样式css处理,可改变箭头的颜色
  20. 网络工程师必知的光纤常识

热门文章

  1. 介紹卷积神经网络(CNN)模型结构
  2. [日推荐]『台湾景点大全』小编带你游台湾!
  3. 使用标准信号检测 VM振弦采集模块测量精度修正
  4. 项目实列:飞机大战上(了解pygame)
  5. 受《Pokémon Go》鼓舞,EA要开发“AR+社交”游戏
  6. 奇舞周刊第 440 期:一文彻底搞懂前端沙箱
  7. 解决 Flask 网页不刷新的问题
  8. 【蓝桥备考-每周一题5】翻煎饼(栈的翻转)★
  9. 06云计算中具有多关键字搜索的基于区块链的公钥加密
  10. SQL语言——DDL