Android视频聊天或直播,大小视频切换思路和代码
来源:互联网 发布:python 判断sys.argv 编辑:程序博客网 时间:2024/06/04 19:49
Android视频聊天大小窗口切换实现
视频播放切换Demo下载地址:点击下载
视频聊天切换Demo下载地址:点击下载
近来公司在做直播项目,之前都是做普通的App,也很少接触SurfaceView相关的东西。在做项目之前,领导让我研究一下横竖屏的切换,刚开始我以为其切换真的很简单,就是改变下层级关系,做的时候才发现SurfaceView带来的好多坑,下面谈谈自己的思路。
实践一:切换的时候只是改变Layouparams可以实现大小窗口切换,大小视频的确是可以切换,但是切换以后,SurfaceView的层级关系就是不能按照自己想要的实现。用了setZOrderOnTop、setZOrderMediaOverlay方法都一点用没有。实践失败。
实践二:切换大小视频的时候,更换布局。但是由于是视频聊天,这样的话存在一个很严重的问题,你切换视频了,导致对方无法看到你的流。
所以,重点就是切换视频的过程中,自己的surfaceview一定不能够销毁掉。
解决方法:两个surfaceview放在同一级,切换的时候移除对方的,然后再添加进去。就可以实现这种切换。
代码运行说明:
在内存卡里,放2个视频文件,1.mp4、2.mp4。可以测试
附上代码:
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/btn_switch" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="切换" > </Button> <RelativeLayout android:id="@+id/rl_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/btn_switch" > <SurfaceView android:id="@+id/surfaceBig" android:layout_width="match_parent" android:layout_height="match_parent" /> <SurfaceView android:id="@+id/surfaceSmall" android:layout_width="120dp" android:layout_height="150dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" /> </RelativeLayout> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/btn_switch" android:src="@drawable/ic_launcher" /></RelativeLayout>
MainActivity代码
package com.example;import android.app.Activity;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Environment;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.RelativeLayout;import android.widget.RelativeLayout.LayoutParams;public class MainActivity extends Activity implements OnClickListener {private SurfaceView mOtherView;private SurfaceView mMyView;private LayoutParams LayoutParamsBig;private LayoutParams LayoutParamsSmall;private RelativeLayout rlContainer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);rlContainer = (RelativeLayout) findViewById(R.id.rl_container);mOtherView = (SurfaceView) findViewById(R.id.surfaceBig);mMyView = (SurfaceView) findViewById(R.id.surfaceSmall);mMyView.getHolder().addCallback(new MyHolder1());mOtherView.getHolder().addCallback(new MyHolder2());mMyView.setZOrderMediaOverlay(true);findViewById(R.id.btn_switch).setOnClickListener(this);LayoutParamsBig = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);LayoutParamsSmall = new LayoutParams(300, 450);LayoutParamsSmall.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);LayoutParamsSmall.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);}@Overridepublic void onClick(View v) {changeSize();}private int tag = 0;/** 此方法会交换两个位置的信息 */private void changeSize() {if (tag == 0) {mMyView.setLayoutParams(LayoutParamsBig);mOtherView.setLayoutParams(LayoutParamsSmall); mMyView.setZOrderOnTop(false); mMyView.setZOrderMediaOverlay(false); mOtherView.setZOrderMediaOverlay(true);mOtherView.setZOrderOnTop(true);// 移出别人的画面rlContainer.removeView(mOtherView);mMyView.setLayoutParams(LayoutParamsBig);mOtherView.setLayoutParams(LayoutParamsSmall);mOtherView.setZOrderOnTop(true);rlContainer.addView(mOtherView);mOtherView.getHolder().addCallback(new MyHolder1());tag = 1;} else {// 移出别的画面rlContainer.removeView(mOtherView);mMyView.setLayoutParams(LayoutParamsSmall);mOtherView.setLayoutParams(LayoutParamsBig);rlContainer.addView(mOtherView, -1);mOtherView.setZOrderOnTop(false);mOtherView.setZOrderMediaOverlay(false);mMyView.setZOrderMediaOverlay(true);mMyView.setZOrderOnTop(true);mOtherView.getHolder().addCallback(new MyHolder2());tag = 0;}}class MyHolder1 implements SurfaceHolder.Callback {MediaPlayer player;@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {player = new MediaPlayer();player.reset();player.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath() + "/2.mp4");player.prepare();player.start();player.setDisplay(holder);} catch (Exception e) {e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}class MyHolder2 implements SurfaceHolder.Callback {MediaPlayer player;@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {player = new MediaPlayer();player.reset();player.setDataSource(Environment.getExternalStorageDirectory().getAbsolutePath() + "/1.mp4");player.prepare();player.start();player.setDisplay(holder);} catch (Exception e) {e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}}}
最后附上源码
视频播放切换Demo下载地址:点击下载
视频聊天切换Demo下载地址:点击下载
1 0
- Android视频聊天或直播,大小视频切换思路和代码
- 小型直播、视频聊天
- 视频直播代码
- 视频转换和视频直播
- 关于Android视频直播
- android 音视频直播
- android视频直播
- Android 视频直播
- android 视频直播SDK
- android视频直播问题
- android 视频直播
- Android视频直播原理
- Android 视频直播开发
- Android集成腾讯互动直播如何切换流视频
- 做移动视频直播应用的思路
- 音视频直播--Android视频采集(Camera2)
- iphone视频聊天代码实现
- iphone视频聊天代码实现
- css定义方式
- mContext.enforceCallingOrSelfPermission
- iOS 应用跳转到AppStore评分 可内置跳转
- android上传下载系列:一般性知识解读
- 去哪儿网前端架构师司徒正美:如何挑选适合的前端框架?
- Android视频聊天或直播,大小视频切换思路和代码
- mongodb 用户身份验证,权限控制db.createUser()方法使用
- 开源几何计算数学库
- 类图如何画
- Shell编程(2):替换
- 监听首页购物车角标
- 一步一步走进Linux HOOK API(一)
- Mac 用RVM安装ruby 2.0.0的时候出现错误
- CSS基本语法