直播软件源码Android直播推拉流功能的实现

编程入门 行业动态 更新时间:2024-10-21 14:41:33

直播软件源码Android直播<a href=https://www.elefans.com/category/jswz/34/1732132.html style=推拉流功能的实现"/>

直播软件源码Android直播推拉流功能的实现

直播软件源码的开发是当下流行的视频社交类平台开发,也是重要的流量渠道,而直播推拉流技术是直播软件源码直播功能实现的基础和关键,一款成熟稳定的推拉流方案的重要性不言而喻。云豹直播作为优质的直播软件源码提供商,在推拉流方面必有其独到之处。下面为大家简单介绍一下云豹直播推拉流实现方式。

如上图所示,在直播软件源码的开播界面启动摄像头,设置直播间的封面,标题,直播类型(收费房间,密码房间等),调整美颜效果,然后点击开始直播按钮,请求服务端接口,服务端使用腾讯云直播sdk,生成推流地址返回,app开始推流。推流成功后请求服务端接口,更改直播间状态为成功开启,其他观众在app首页可以看到该直播间,进入直播间后,请求服务端接口获取播放地址,开始播放。
部分代码如下:

public class LivePlayTxViewHolder extends LiveRoomPlayViewHolder implements ITXLivePlayListener {private static final String TAG = "LiveTxPlayViewHolder";private ViewGroup mRoot;private ViewGroup mSmallContainer;private ViewGroup mLeftContainer;private ViewGroup mRightContainer;private ViewGroup mPkContainer;private TXCloudVideoView mVideoView;private View mLoading;private ImageView mCover;private TXLivePlayer mPlayer;private boolean mPaused;//是否切后台了private boolean mStarted;//是否开始了播放private boolean mEnd;//是否结束了播放private boolean mPausedPlay;//是否被动暂停了播放private boolean mChangeToLeft;private boolean mChangeToAnchorLinkMic;private String mUrl;private int mPlayType;private HttpCallback mGetTxLinkMicAccUrlCallback;private Handler mHandler;private int mVideoLastProgress;public LivePlayTxViewHolder(Context context, ViewGroup parentView) {super(context, parentView);}@Overrideprotected int getLayoutId() {return R.layout.view_live_play_tx;}@Overridepublic void init() {mRoot = (ViewGroup) findViewById(R.id.root);mSmallContainer = (ViewGroup) findViewById(R.id.small_container);mLeftContainer = (ViewGroup) findViewById(R.id.left_container);mRightContainer = (ViewGroup) findViewById(R.id.right_container);mPkContainer = (ViewGroup) findViewById(R.id.pk_container);mLoading = findViewById(R.id.loading);mCover = (ImageView) findViewById(R.id.cover);mVideoView = (TXCloudVideoView) findViewById(R.id.video_view);mPlayer = new TXLivePlayer(mContext);mPlayer.setPlayListener(this);mPlayer.setPlayerView(mVideoView);mPlayer.enableHardwareDecode(false);mPlayer.setRenderRotation(TXLiveConstants.RENDER_ROTATION_PORTRAIT);mPlayer.setRenderMode(TXLiveConstants.RENDER_MODE_FULL_FILL_SCREEN);TXLivePlayConfig playConfig = new TXLivePlayConfig();playConfig.setAutoAdjustCacheTime(true);playConfig.setMaxAutoAdjustCacheTime(5.0f);playConfig.setMinAutoAdjustCacheTime(1.0f);playConfig.setHeaders(CommonAppConfig.HEADER);mPlayer.setConfig(playConfig);}@Overridepublic void onPlayEvent(int e, Bundle bundle) {if (mEnd) {return;}switch (e) {case TXLiveConstants.PLAY_EVT_PLAY_BEGIN://播放开始if (mLoading != null && mLoading.getVisibility() == View.VISIBLE) {mLoading.setVisibility(View.INVISIBLE);}break;case TXLiveConstants.PLAY_EVT_PLAY_LOADING:if (mLoading != null && mLoading.getVisibility() != View.VISIBLE) {mLoading.setVisibility(View.VISIBLE);}break;case TXLiveConstants.PLAY_EVT_RCV_FIRST_I_FRAME://第一帧hideCover();break;case TXLiveConstants.PLAY_EVT_PLAY_END://播放结束replay();break;case TXLiveConstants.PLAY_EVT_CHANGE_RESOLUTION://获取视频宽高if (mChangeToLeft || mChangeToAnchorLinkMic) {return;}float width = bundle.getInt("EVT_PARAM1", 0);float height = bundle.getInt("EVT_PARAM2", 0);
//                L.e(TAG, "流---width----->" + width);
//                L.e(TAG, "流---height----->" + height);FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mVideoView.getLayoutParams();int targetH = 0;if (width >= height) {//横屏 9:16=0.5625targetH = (int) (mVideoView.getWidth() / width * height);} else {targetH = ViewGroup.LayoutParams.MATCH_PARENT;}if (targetH != params.height) {params.height = targetH;params.gravity = Gravity.CENTER;mVideoView.requestLayout();}
//                View txVideoView = mVideoView.getVideoView();
//                FrameLayout.LayoutParams p = (FrameLayout.LayoutParams) txVideoView.getLayoutParams();
//                p.height = targetH;
//                txVideoView.requestLayout();break;case TXLiveConstants.PLAY_ERR_NET_DISCONNECT://播放失败case TXLiveConstants.PLAY_ERR_FILE_NOT_FOUND:ToastUtil.show(WordUtil.getString(R.string.live_play_error));break;case TXLiveConstants.PLAY_EVT_PLAY_PROGRESS:int progress = bundle.getInt("EVT_PLAY_PROGRESS_MS");if (mVideoLastProgress == progress) {replay();} else {mVideoLastProgress = progress;}break;}}@Overridepublic void onNetStatus(Bundle bundle) {}@Overridepublic void hideCover() {if (mCover != null) {mCover.animate().alpha(0).setDuration(500).start();}}@Overridepublic void setCover(String coverUrl) {if (mCover != null) {ImgLoader.displayBlur(mContext, coverUrl, mCover);}}/*** 循环播放*/private void replay() {if (mStarted && mPlayer != null) {mPlayer.seek(0);mPlayer.resume();}}/*** 暂停播放*/@Overridepublic void pausePlay() {if (!mPausedPlay) {mPausedPlay = true;if (!mPaused) {if (mPlayer != null) {mPlayer.setMute(true);}}if (mCover != null) {mCover.setAlpha(1f);if (mCover.getVisibility() != View.VISIBLE) {mCover.setVisibility(View.VISIBLE);}}}}/*** 暂停播放后恢复*/@Overridepublic void resumePlay() {if (mPausedPlay) {mPausedPlay = false;if (!mPaused) {if (mPlayer != null) {mPlayer.setMute(false);}}hideCover();}}/*** 开始播放** @param url 流地址*/@Overridepublic void play(String url) {if (TextUtils.isEmpty(url)) {return;}int playType = -1;if (url.startsWith("rtmp://")) {playType = TXLivePlayer.PLAY_TYPE_LIVE_RTMP;} else if (url.contains(".flv")) {playType = TXLivePlayer.PLAY_TYPE_LIVE_FLV;} else if (url.contains(".m3u8")) {playType = TXLivePlayer.PLAY_TYPE_VOD_HLS;} else if (url.contains(".mp4")) {playType = TXLivePlayer.PLAY_TYPE_VOD_MP4;}if (playType == -1) {ToastUtil.show(R.string.live_play_error_2);return;}if (mPlayer != null) {int result = mPlayer.startPlay(url, playType);if (result == 0) {mStarted = true;mUrl = url;mPlayType = playType;}}L.e(TAG, "play----url--->" + url);}@Overridepublic void stopPlay() {mChangeToLeft = false;mChangeToAnchorLinkMic = false;if (mHandler != null) {mHandler.removeCallbacksAndMessages(null);}if (mCover != null) {mCover.setAlpha(1f);if (mCover.getVisibility() != View.VISIBLE) {mCover.setVisibility(View.VISIBLE);}}stopPlay2();}@Overridepublic void stopPlay2() {if (mPlayer != null) {mPlayer.stopPlay(false);}}@Overridepublic void release() {mEnd = true;if (mHandler != null) {mHandler.removeCallbacksAndMessages(null);}mHandler = null;LiveHttpUtil.cancel(LiveHttpConsts.GET_TX_LINK_MIC_ACC_URL);if (mPlayer != null) {mPlayer.stopPlay(false);mPlayer.setPlayListener(null);}mPlayer = null;L.e(TAG, "release------->");}@Overridepublic ViewGroup getSmallContainer() {return mSmallContainer;}@Overridepublic ViewGroup getRightContainer() {return mRightContainer;}@Overridepublic ViewGroup getPkContainer() {return mPkContainer;}@Overridepublic void changeToLeft() {mChangeToLeft = true;if (mVideoView != null) {FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mVideoView.getLayoutParams();params.width = mVideoView.getWidth() / 2;params.height = DpUtil.dp2px(250);params.topMargin = DpUtil.dp2px(130);mVideoView.setLayoutParams(params);}if (mLoading != null && mLeftContainer != null) {ViewParent viewParent = mLoading.getParent();if (viewParent != null) {((ViewGroup) viewParent).removeView(mLoading);}FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(DpUtil.dp2px(24), DpUtil.dp2px(24));params.gravity = Gravity.CENTER;mLoading.setLayoutParams(params);mLeftContainer.addView(mLoading);}}@Overridepublic void changeToBig() {mChangeToLeft = false;if (mVideoView != null) {FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mVideoView.getLayoutParams();params.width = ViewGroup.LayoutParams.MATCH_PARENT;params.height = ViewGroup.LayoutParams.MATCH_PARENT;params.topMargin = 0;mVideoView.setLayoutParams(params);}if (mLoading != null && mRoot != null) {ViewParent viewParent = mLoading.getParent();if (viewParent != null) {((ViewGroup) viewParent).removeView(mLoading);}FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(DpUtil.dp2px(24), DpUtil.dp2px(24));params.gravity = Gravity.CENTER;mLoading.setLayoutParams(params);mRoot.addView(mLoading);}}@Overridepublic void onResume() {if (!mPausedPlay && mPaused && mPlayer != null) {mPlayer.setMute(false);}mPaused = false;}@Overridepublic void onPause() {if (!mPausedPlay && mPlayer != null) {mPlayer.setMute(true);}mPaused = true;}@Overridepublic void onDestroy() {release();}/*** 腾讯sdk连麦时候切换低延时流*/public void onLinkMicTxAccEvent(boolean linkMic) {if (mStarted && mPlayer != null && !TextUtils.isEmpty(mUrl)) {mPlayer.stopPlay(false);if (linkMic) {if (mGetTxLinkMicAccUrlCallback == null) {mGetTxLinkMicAccUrlCallback = new HttpCallback() {@Overridepublic void onSuccess(int code, String msg, String[] info) {if (code == 0 && info.length > 0) {JSONObject obj = JSON.parseObject(info[0]);if (obj != null) {String accUrl = obj.getString("streamUrlWithSignature");if (!TextUtils.isEmpty(accUrl) && mPlayer != null) {L.e(TAG, "低延时流----->" + accUrl);mPlayer.startPlay(accUrl, TXLivePlayer.PLAY_TYPE_LIVE_RTMP_ACC);}}}}};}LiveHttpUtil.getTxLinkMicAccUrl(mUrl, mGetTxLinkMicAccUrlCallback);} else {mPlayer.startPlay(mUrl, mPlayType);}}}/*** 设置主播连麦模式** @param anchorLinkMic*/public void setAnchorLinkMic(final boolean anchorLinkMic, int delayTime) {if (mVideoView == null) {return;}if (mHandler == null) {mHandler = new Handler();}mHandler.postDelayed(new Runnable() {@Overridepublic void run() {mChangeToAnchorLinkMic = anchorLinkMic;FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mVideoView.getLayoutParams();if (anchorLinkMic) {params.height = DpUtil.dp2px(250);params.topMargin = DpUtil.dp2px(130);params.gravity = Gravity.TOP;} else {params.height = ViewGroup.LayoutParams.MATCH_PARENT;params.topMargin = 0;params.gravity = Gravity.CENTER;}mVideoView.setLayoutParams(params);}}, delayTime);}
}

这样就实现了直播软件源码的推拉流功能。

声明:以上内容为云豹科技作者本人原创,未经作者本人同意,禁止转载,否则将追究相关法律责任

更多推荐

直播软件源码Android直播推拉流功能的实现

本文发布于:2024-03-09 09:14:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1724573.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:推拉   源码   功能   软件   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!