博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于DragonBoard 410c的遥控炮台九之实时视频瞄准
阅读量:2228 次
发布时间:2019-05-09

本文共 4519 字,大约阅读时间需要 15 分钟。

一.背景

在这个系列博客,博主给大家分享了如何基于Dragonboard410c制作遥控炮台的原型机,考虑到我们这个产品的趣味性,博主觉得纯粹处于第三视角去控制炮台瞄准射击的方式稍显单调,于是决定为其添加一双“眼睛”,让体验者以第一视角直接进入炮台“角色”,达到“沉浸式“的体验效果!

二.实时视频

1.硬件组装:保持与炮身视角平行,可方便后续的视野校正。

图1 炮台

2.软件添加实时视频传输:

(1).主机端:在原有的服务器基础上加入motion系统,具体可参考博主之前发过的博客:http://blog.csdn.net/ad3600/article/details/62422756

(2).客户端:

在原来的控制客户端基础上添加远程视频接受及实时播放页面,核心实现代码如下:

     

package com.boss.xiao.Ideas;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;public class MySurfaceView extends SurfaceView    implements Callback, Runnable     {	    private SurfaceHolder sfh;  	    private Canvas canvas;  	    URL videoUrl;	    private String url;	    HttpURLConnection conn;	    Bitmap bmp;	    private Paint p;      	    InputStream inputstream=null;	    private Bitmap mBitmap;    	    private static int mScreenWidth; 	    private static int mScreenHeight;        float myEyesDistance;        int numberOfFaceDetected;        Paint myPaint = new Paint();        	    public MySurfaceView(Context context, AttributeSet attrs) 	    {	    	  super(context, attrs);	    	  initialize();	    	  p = new Paint();	    	  p.setAntiAlias(true);	    	  myPaint.setColor(Color.GREEN);	    	  myPaint.setStyle(Paint.Style.STROKE);	    	  myPaint.setStrokeWidth(3);	             	    	  sfh = this.getHolder();	    	  sfh.addCallback(this);	    	  this.setKeepScreenOn(true);	    	  setFocusable(true);	    	  this.getWidth();	    	  this.getHeight();  	     }	     private void initialize() 	     { 	    	  DisplayMetrics dm = new  DisplayMetrics();     	    	  dm = getResources().getDisplayMetrics();	    	  mScreenWidth = dm.widthPixels; 	    	  mScreenHeight = dm.heightPixels;                  	     } 	    	 class DrawVideo extends Thread	    	 {	    	  	    	    public DrawVideo() {}     	    	    public void run() 	    	    {	    		     while (true)	    		     {		    		     try {  		    		    	 	videoUrl=new URL(url);		    		    	 	conn = (HttpURLConnection)videoUrl.openConnection();		    		    	 	conn.connect();		    		    	 	inputstream = conn.getInputStream(); //获取流		    		    	 	BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options();		    		            BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;		    		            bmp = BitmapFactory.decodeStream(inputstream,null,BitmapFactoryOptionsbfo);//从获取的流中构建出BMP图像		    		            mBitmap = Bitmap.createScaledBitmap(bmp, mScreenWidth, mScreenHeight, true);		    		            canvas = sfh.lockCanvas();		    		            canvas.drawColor(Color.WHITE);		    		            canvas.drawBitmap(mBitmap, 0,0, null);//把BMP图像画在画布上		    		            sfh.unlockCanvasAndPost(canvas);//画完一副图像,解锁画布 		    		            		    		         } catch (Exception ex) { 		    		        	 ex.printStackTrace();		    		         } finally {}   	    		     }	    		 }	 	    	 }    	    	 public void surfaceChanged(SurfaceHolder holder, int format, int width,    	            int height){}    	         public void surfaceDestroyed(SurfaceHolder holder){} 	       	         public void GetCameraIP(String p){url=p; Log.e("GetCameraIP ="+p,"xiao");}	         public void run() {		     while (true)		     {			     try {  			    	 	Log.e("DrawVideo ============","xiao");			    	    videoUrl=new URL(url);			         	conn = (HttpURLConnection)videoUrl.openConnection();			         	conn.connect();			         	inputstream = conn.getInputStream(); //获取流			         	bmp = BitmapFactory.decodeStream(inputstream);//从获取的流中构建出BMP图像			         	mBitmap = Bitmap.createScaledBitmap(bmp, mScreenWidth, mScreenHeight, true);			            canvas = sfh.lockCanvas();			            canvas.drawColor(Color.WHITE);			            canvas.drawBitmap(mBitmap, 0,0, null);//把BMP图像画在画布上			            sfh.unlockCanvasAndPost(canvas);//画完一副图像,解锁画布 			         } 			     	 catch (Exception ex) 			         { 			          ex.printStackTrace();			         } 			     	 finally 			         {  			    	 			         }   		     }		 }			    public void surfaceCreated(SurfaceHolder holder) 				{					new DrawVideo().start();					}	       			    public void drowblack(){}	}
图2 客户端控制页面

你可能感兴趣的文章
Oracle PL/SQL语言初级教程之表和视图
查看>>
Oracle PL/SQL语言初级教程之完整性约束
查看>>
PL/SQL学习笔记
查看>>
如何分析SQL语句
查看>>
结构化查询语言(SQL)原理
查看>>
SQL教程之嵌套SELECT语句
查看>>
日本語の記号の読み方
查看>>
计算机英语编程中一些单词
查看>>
JavaScript 经典例子
查看>>
判断数据的JS代码
查看>>
js按键事件说明
查看>>
AJAX 初次体验!推荐刚学看这个满好的!
查看>>
AJAX 设计制作 在公司弄的 非得要做出这个养的 真晕!
查看>>
Linux 查看文件大小
查看>>
Java并发编程:线程池的使用
查看>>
redis单机及其集群的搭建
查看>>
Java多线程学习
查看>>
检查Linux服务器性能
查看>>
Java 8新的时间日期库
查看>>
Chrome开发者工具
查看>>