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
原创粉丝点击