最麻烦的是如何高效处理捕捉到的每帧数据,这也导致做出来的效果不好,5–6帧每秒,像在看ppt,所以这次把捕捉到的数据先转换为YuvImage对象,之后开启新线程执行YuvImage转jpg的方法得到jpg得字节数据后启动新线程去执行发送数据到客户端的工作,放开Yuvimage解码jpg的线程,可以不用等发送完成,在发送数据的同时继续解码。虽然还是会掉帧,但实践证明这样操作效果还是比较好的。或许是摄像头捕捉的帧率本来就不高(猜的)。
掉线时交替闪烁,收发数据时,闪烁越快,帧率越高,类似电脑后面网口上那颗小黄灯,一闪一闪的,晚上在村里放,你就是那个村里最靓的仔(坏笑)
MainActivity类做了写更改,比如自动获取机器的IP地址,用这个IP地址作为服务器,客户端接入就可以直接通信收发图像数据。增加了k1用来转码jpg,开新线程发送图像数据
Camera camera;
SurfaceView surfaceView;//预览
SurfaceHolder surfaceHolder;
public static boolean boo1;//是否可以发送数据
boolean boo3;//连接中
Socket soc;
InputStream input;
OutputStream out;
TextView textView;//显示配置端口信息
int port = 8081;
ServerSocket ser;//服务器
boolean is_ser_link_ser;//记录网路是否正常
String ip = "";
public Thread gh1;
boolean led_flash;//未连接闪关灯交替闪烁
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sett1();//启动相机
textView = findViewById(R.id.textView);
ip = getIpAddress(MainActivity.this);
if(ip != "" && !ip.equals("0.0.0.0")){
textView.setText(ip+":"+port);
}else{
textView.setText("没有wifi网络,请打开wifi重启");
}
gh1 = new Thread(new Runnable() {
public void run() {
}
});
gh1.start();
}
//打开相机
public void sett1(){
camera = camera.open(0);
camera.setDisplayOrientation(90);
surfaceView = findViewById(R.id.surfaceView1);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
try {
camera.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
//获取摄像实时数据
camera.setPreviewCallback(new Camera.PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera camera) {
//判断服务器是否打开
if(is_ser_link_ser ){
//判断服务器是否正常打开,否则开启新线程去打开服务器
Camera.Size size = camera.getParameters().getPreviewSize();
YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null);
if(image != null ){
//&& new Date().getTime()-tim>30
yuvtojpeg(size, image);
}
}else {
if(!boo3){
ip = getIpAddress(MainActivity.this);
if(ip != "" && !ip.equals("0.0.0.0")){
textView.setText(ip+":"+port);
new Thread(new Runnable() {
public void run() {
boo3 = true;
is_ser_link_ser = soc_link_ser();
boo3 = false;
}
}).start();
}else{
textView.setText("没有wifi网络,请打开wifi重启");
}
}else{
//断线时,未连接时,闪关灯交替闪烁
if(led_flash){
led_flash = !led_flash;
Camera.Parameters parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF)