Android两个SurfaceView叠加显示

最近一段时间一直在做智能后视镜产品(Android平台)里的相机模块,目前已经告一段落了。现在空闲的时候可以把一些技术点记录下来。

其中有一个需求就是显示前、后两个摄像头的预览画面,并且可以相互切换显示。

类似下面这个样子:
这里写图片描述

在Android里常用来显示相机预览的就是SurfaceView,因为不需要在UI线程刷新。那这里我们考虑的就是将两个SurfaceView叠加在一起显示。

布局xml(部分):

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"  android:layout_gravity="center_vertical|center_horizontal" >      
        < SurfaceView
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在AndroidSurfaceView显示MJPEG视频流解码,你可以按照以下步骤进行操作: 1. 首先,在你的Android项目中添加必要的依赖项,如OpenCV或其他MJPEG解码库。 2. 创建一个自定义的SurfaceView类,并在其中实现SurfaceHolder.Callback接口。这将允许你监听SurfaceView的生命周期事件。 ```java public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private MJPEGDecoder mjpegDecoder; public MySurfaceView(Context context) { super(context); getHolder().addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { // 在Surface创建时初始化解码器 mjpegDecoder = new MJPEGDecoder(holder.getSurface()); mjpegDecoder.startDecoding(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 在Surface尺寸发生变化时更新解码器 mjpegDecoder.updateSurface(holder.getSurface()); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 在Surface销毁时停止解码器 mjpegDecoder.stopDecoding(); } } ``` 3. 创建一个MJPEGDecoder类,该类负责接收MJPEG视频流数据并进行解码。你可以使用OpenCV或其他MJPEG解码库来实现这个类。 ```java public class MJPEGDecoder { private Surface surface; private boolean isDecoding; public MJPEGDecoder(Surface surface) { this.surface = surface; isDecoding = true; } public void startDecoding() { // 开始解码线程 new Thread(new Runnable() { @Override public void run() { while (isDecoding) { // 从MJPEG视频流中获取数据并解码 byte[] frameData = getFrameDataFromStream(); // 使用解码库进行解码 Mat frame = decodeMJPEG(frameData); // 将解码后的帧绘制到Surface上 drawFrameToSurface(frame); } } }).start(); } public void updateSurface(Surface surface) { this.surface = surface; } public void stopDecoding() { isDecoding = false; } private byte[] getFrameDataFromStream() { // 从网络或其他来源获取MJPEG视频流数据 // 返回帧的字节数组 } private Mat decodeMJPEG(byte[] frameData) { // 使用OpenCV或其他MJPEG解码库解码帧数据 // 返回解码后的帧(Mat对象) } private void drawFrameToSurface(Mat frame) { Canvas canvas = surface.lockCanvas(null); // 在Surface上绘制解码后的帧 // 可以使用Canvas.drawBitmap()等方法 surface.unlockCanvasAndPost(canvas); } } ``` 4. 在你的Activity中使用自定义的SurfaceView显示MJPEG视频流。 ```java public class MainActivity extends AppCompatActivity { private MySurfaceView surfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = findViewById(R.id.surface_view); } } ``` 确保在布局文件中添加一个SurfaceView元素: ```xml <com.example.MySurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 这样,你就可以在AndroidSurfaceView显示解码后的MJPEG视频流了。记得根据你使用的MJPEG解码库进行必要的调整和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值