发帖
2 0 0

小安派BW21-CBV-Kit 远程udp图传

lijrgj
高级会员

5

主题

19

回帖

633

积分

高级会员

积分
633
小安派·BW21-CBV-KIt 79 2 3 天前

本人不是用的Arduino环境可能不是很友好,废话不多说直接贴代码

开发板端

#include "mmf2_link.h"
#include "mmf2_siso.h"
#include "module_video.h"
#include "module_rtsp2.h"
#include "mmf2_pro2_video_config.h"
#include "video_example_media_framework.h"
#include "log_service.h"
#include "video_snapshot.h"
#include "sensor.h"
/*****************************************************************************
* ISP channel : 0
* Video type  : H264/HEVC + SNAPSHOT
*****************************************************************************/

#define V1_CHANNEL 0
#define V1_BPS 2*1024*1024
#define V1_RCMODE 2 // 1: CBR, 2: VBR
#define USE_H265 0
#if USE_H265
#include "sample_h265.h"
#define VIDEO_TYPE VIDEO_HEVC
#define VIDEO_CODEC AV_CODEC_ID_H265
#define SHAPSHOT_TYPE VIDEO_HEVC_JPEG
#else
#include "sample_h264.h"
#define VIDEO_TYPE VIDEO_H264
#define VIDEO_CODEC AV_CODEC_ID_H264
#define SHAPSHOT_TYPE VIDEO_H264_JPEG
#endif

#define ENABLE_META_INFO  //Enable the marco to wirte the META data to frame
//#define ENABLE_SD_SNAPSHOT //Enable the snapshot to sd card
static _mutex snapshot_mutex;
static _sema snapshot_sema;
struct sockaddr_in udp;
static void atcmd_userctrl_init(void);
static mm_context_t *video_v1_ctx			= NULL;
static mm_context_t *rtsp2_v1_ctx			= NULL;
static mm_siso_t *siso_video_rtsp_v1			= NULL;
extern uint32_t IPaddress;
extern uint8_t iptab[4];
static int soc = -1;
static video_params_t video_v1_params = {
	.stream_id = V1_CHANNEL,
	.type = SHAPSHOT_TYPE,
	.bps = V1_BPS,
	.rc_mode = V1_RCMODE,
	.use_static_addr = 1,
};


static rtsp2_params_t rtsp2_v1_params = {
	.type = AVMEDIA_TYPE_VIDEO,
	.u = {
		.v = {
			.codec_id = VIDEO_CODEC,
			.bps      = V1_BPS
		}
	}
};

TaskHandle_t snapshot_thread = NULL;

int v1_snapshot_cb(uint32_t addr, uint32_t len)
{
    if (soc >-1) {
        rtw_mutex_get(&snapshot_mutex);
        uint8_t *ub =(uint8_t*)(addr);
       // uint32_t x = len / max;
        //uint32_t x1 = len % max;
        printf("addr={%p} len={%d}\r\n", ub, len);
        char *star = "start";
        sendto(soc, star, strlen(star), 0, (struct sockaddr *) &udp, sizeof(udp));
        printf("imag_start--------\r\n");
        vTaskDelay(1);
        /*for (int i = 0; i < x; i++) {
            sendto(soc, ub, max, 0, (struct sockaddr *) &udp_in, sizeof(udp_in));
            ub+=max;
            printf("进入for--i=====%d---ub=====%d\r\n",i,ub[i]);
             // vTaskDelay(5);
        }
        sendto(soc, ub, x1, 0, (struct sockaddr *) &udp_in, sizeof(udp_in));*/
        sendto(soc, ub, len, 0, (struct sockaddr *) &udp, sizeof(udp));
        printf("send_...........\r\n");
        vTaskDelay(1);
        char *end = "end";
        sendto(soc, end, strlen(end), 0, (struct sockaddr *) &udp, sizeof(udp));
        printf("imag_end-------------\r\n");
        goto end;
    }
    printf("callback_fun----- soc=%d\r\n", errno);
    goto end;
    end:
    rtw_mutex_put(&snapshot_mutex);
    rtw_up_sema(&snapshot_sema);
	return 0;
}
#if defined(ENABLE_META_INFO)
static void video_meta_cb(void *parm)
{
	video_meta_t *m_parm = (video_meta_t *)parm;
   // printf("------------------------------%d",m_parm->video_len);
	m_parm->user_buf = NULL;
	video_sei_write(m_parm);
}
#endif

void snapshot_control_thread(void *param)
{
#if defined(configENABLE_TRUSTZONE) && (configENABLE_TRUSTZONE == 1)
	rtw_create_secure_context(2048);
#endif

        while (1){
            if(IPaddress==0){
                continue;
            }
            iptab[0] = (uint8_t)(IPaddress >> 24);
            iptab[1] = (uint8_t)(IPaddress >> 16);
            iptab[2] = (uint8_t)(IPaddress >> 8);
            iptab[3] = (uint8_t)(IPaddress);
            printf("\n\rip_addr------: %d.%d.%d.%d\n", iptab[3], iptab[2], iptab[1], iptab[0]);
            printf("socket_init-----------\r\n");
            soc = socket(AF_INET, SOCK_DGRAM, 0);//udp
            if (soc < 0) {
                printf("soc_init_error=%d\r\n", errno);
                continue;
            }
            printf("socket_init---ok\r\n");
            printf("udp_start--------udp---------\r\n");
            printf("soc==============%d\r\n", soc);
            udp.sin_family = AF_INET;
            udp.sin_port = htons(9091);
            udp.sin_addr.s_addr= inet_addr("192.168.158.9");
            // udp_in.sin_addr.s_addr = inet_addr("192.168.121.9");
        
            //udp_in.sin_addr.s_addr = inet_addr("192.168.214.9");
            while (1){
                mm_module_ctrl(video_v1_ctx, CMD_VIDEO_SNAPSHOT, 1);
                rtw_down_timeout_sema(&snapshot_sema, portMAX_DELAY);
                // int a=  mm_module_ctrl(video_v1_ctx, CMD_VIDEO_GET_META_DATA, 1);
                // printf("a=====%d\r\n",a );
                vTaskDelay(5);
            }

        }
//		vTaskDelay(30);
//		mm_module_ctrl(video_v1_ctx, CMD_VIDEO_SNAPSHOT, 1);

}

void mmf2_video_example_v1_shapshot_init(void)
{

	atcmd_userctrl_init();
    rtw_init_sema(&snapshot_sema, 0);
    rtw_mutex_init(&snapshot_mutex);
	/*sensor capacity check & video parameter setting*/
	video_v1_params.resolution = VIDEO_VGA;
	video_v1_params.width = 640;
	video_v1_params.height = 480;
	video_v1_params.fps = sensor_params[USE_SENSOR].sensor_fps;
	video_v1_params.gop = sensor_params[USE_SENSOR].sensor_fps;
	/*rtsp parameter setting*/
	rtsp2_v1_params.u.v.fps = sensor_params[USE_SENSOR].sensor_fps;

#if defined(ENABLE_META_INFO)
	unsigned char uuid[16] = {0xc7, 0x98, 0x2c, 0x28, 0x0a, 0xfc, 0x49, 0xe6, 0xaa, 0xe4, 0x7f, 0x8f, 0x64, 0xee, 0x65, 0x01};
	video_pre_init_params_t init_params;
	memset(&init_params, 0x00, sizeof(video_pre_init_params_t));
	init_params.meta_enable = 1;
	init_params.meta_size = VIDEO_META_USER_SIZE;
	memcpy(init_params.video_meta_uuid, uuid, VIDEO_META_UUID_SIZE);
	video_pre_init_setup_parameters(&init_params);
	video_v1_params.meta_enable = 1;
#endif
#if (USE_UPDATED_VIDEO_HEAP == 0)
	int voe_heap_size = video_voe_presetting(1, video_v1_params.width, video_v1_params.height, V1_BPS, 1,
						0, 0, 0, 0, 0,
						0, 0, 0, 0, 0,
						0, 0, 0);
#else
	int voe_heap_size = video_voe_presetting_by_params(&video_v1_params, 1, NULL, 0, NULL, 0, NULL);
#endif
	printf("\r\n voe heap size = %d\r\n", voe_heap_size);

	video_v1_ctx = mm_module_open(&video_module);
	if (video_v1_ctx) {
		mm_module_ctrl(video_v1_ctx, CMD_VIDEO_SET_PARAMS, (int)&video_v1_params);
		mm_module_ctrl(video_v1_ctx, MM_CMD_SET_QUEUE_LEN, video_v1_params.fps * 3);
		mm_module_ctrl(video_v1_ctx, MM_CMD_INIT_QUEUE_ITEMS, MMQI_FLAG_DYNAMIC);
		mm_module_ctrl(video_v1_ctx, CMD_VIDEO_SNAPSHOT, 0);
	} else {
		rt_printf("video open fail\n\r");
		goto mmf2_video_exmaple_v1_shapshot_fail;
	}

	rtsp2_v1_ctx = mm_module_open(&rtsp2_module);
	if (rtsp2_v1_ctx) {
		mm_module_ctrl(rtsp2_v1_ctx, CMD_RTSP2_SELECT_STREAM, 0);
		mm_module_ctrl(rtsp2_v1_ctx, CMD_RTSP2_SET_PARAMS, (int)&rtsp2_v1_params);
		mm_module_ctrl(rtsp2_v1_ctx, CMD_RTSP2_SET_APPLY, 0);
		mm_module_ctrl(rtsp2_v1_ctx, CMD_RTSP2_SET_STREAMMING, ON);
	} else {
		rt_printf("RTSP2 open fail\n\r");
		goto mmf2_video_exmaple_v1_shapshot_fail;
	}

	siso_video_rtsp_v1 = siso_create();
	if (siso_video_rtsp_v1) {
#if defined(configENABLE_TRUSTZONE) && (configENABLE_TRUSTZONE == 1)
		siso_ctrl(siso_video_rtsp_v1, MMIC_CMD_SET_SECURE_CONTEXT, 1, 0);
#endif
		siso_ctrl(siso_video_rtsp_v1, MMIC_CMD_ADD_INPUT, (uint32_t)video_v1_ctx, 0);
		siso_ctrl(siso_video_rtsp_v1, MMIC_CMD_ADD_OUTPUT, (uint32_t)rtsp2_v1_ctx, 0);
		siso_start(siso_video_rtsp_v1);
	} else {
		rt_printf("siso2 open fail\n\r");
		goto mmf2_video_exmaple_v1_shapshot_fail;
	}

	mm_module_ctrl(video_v1_ctx, CMD_VIDEO_APPLY, V1_CHANNEL);

	//--------------snapshot setting---------------------------
#if defined(ENABLE_SD_SNAPSHOT)
	extern snapshot_user_config_t snap_config;
	memset(&snap_config, 0x00, sizeof(snap_config));
	snapshot_vfs_init();
	snap_config.video_snapshot_ctx = video_v1_ctx;
	snap_config.snapshot_write = snapshot_write_picture;
	video_snapshot_init_with_streaming(&snap_config);
	atcmd_snapshot_init();//ATCMD => SNAP=SNAPS (Take picture to sdcard)
#else
	mm_module_ctrl(video_v1_ctx, CMD_VIDEO_SNAPSHOT_CB, (int)v1_snapshot_cb);
	if (xTaskCreate(snapshot_control_thread, ((const char *)"snapshot_store"), 512, NULL, tskIDLE_PRIORITY + 1, &snapshot_thread) != pdPASS) {
		printf("\n\r%s xTaskCreate failed", __FUNCTION__);
	}
#endif
#if defined(ENABLE_META_INFO)
	mm_module_ctrl(video_v1_ctx, CMD_VIDEO_META_CB, (int)video_meta_cb);
#endif

	return;
mmf2_video_exmaple_v1_shapshot_fail:

	return;
}

static const char *example = "mmf2_video_example_v1_shapshot";
static void example_deinit(void)
{
	//Pause Linker
	siso_pause(siso_video_rtsp_v1);

	//Stop module
	mm_module_ctrl(rtsp2_v1_ctx, CMD_RTSP2_SET_STREAMMING, OFF);
	mm_module_ctrl(video_v1_ctx, CMD_VIDEO_STREAM_STOP, V1_CHANNEL);

	//Delete linker
	siso_delete(siso_video_rtsp_v1);

	//Close module
	mm_module_close(rtsp2_v1_ctx);
	mm_module_close(video_v1_ctx);

	//Video Deinit
	video_deinit();
}

static void fUC(void *arg)
{
	static uint32_t user_cmd = 0;

	if (!strcmp(arg, "TD")) {
		if (user_cmd & USR_CMD_EXAMPLE_DEINIT) {
			printf("invalid state, can not do %s deinit!\r\n", example);
		} else {
			example_deinit();
			user_cmd = USR_CMD_EXAMPLE_DEINIT;
			printf("deinit %s\r\n", example);
		}
	} else if (!strcmp(arg, "TSR")) {
		if (user_cmd & USR_CMD_EXAMPLE_DEINIT) {
			printf("reinit %s\r\n", example);
			sys_reset();
		} else {
			printf("invalid state, can not do %s reinit!\r\n", example);
		}
	} else if (!strcmp(arg, "TSS")) {
		if (!(user_cmd & USR_CMD_EXAMPLE_DEINIT)) {
			printf("snapshot %s\r\n", example);
#if defined(configENABLE_TRUSTZONE) && (configENABLE_TRUSTZONE == 1)
			rtw_create_secure_context(2048);
#endif
			mm_module_ctrl(video_v1_ctx, CMD_VIDEO_SNAPSHOT, 1);
		} else {
			printf("invalid state, can not do %s snapshot!\r\n", example);
		}
	} else {
		printf("invalid cmd");
	}

	printf("user command 0x%lx\r\n", user_cmd);
}

static log_item_t userctrl_items[] = {
	{"UC", fUC, },
};

static void atcmd_userctrl_init(void)
{
	log_service_add_table(userctrl_items, sizeof(userctrl_items) / sizeof(userctrl_items[0]));
}

java端

package com.camd200.serve.controller;

import cn.hutool.core.io.FileUtil;
import com.camd200.serve.IpDriver;
import com.camd200.serve.JpgMode;
import com.camd200.serve.Main;
import com.camd200.serve.RecvData;
import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;

import javax.swing.*;
import java.awt.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class JpgController implements Runnable {
    final int data_len=500*1024;
    private HashMap<String,IpDriver>ipDriverHashMap=new HashMap<>();
    int count2=0;
    byte[]jpeg=new byte[500*1024];
    byte[] imgBytes;
    ArrayList<RecvData> recv_list=new ArrayList<>();
  final String mes="Udp_sc_Server启动....";
  final String dev_mes="Udp_dev_Server启动....";
  int cou=0;
 public static int fps=0;
 Lock l=new ReentrantLock();
 Condition condition=l.newCondition();
   private DatagramSocket datagramSocket;
    public void startUdpServer_src() throws IOException {
        System.out.println(mes);
        datagramSocket = new DatagramSocket(9091);
        byte[] bytes = new byte[data_len];
        while(true) {
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
            try {
                datagramSocket.receive(datagramPacket);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            byte[] data = datagramPacket.getData();
            int length = datagramPacket.getLength();
            System.out.println(length);
            if (data != null && data.length != 0 && length != 0) {
                if (length==4){
                    if (new String(data,0,length, StandardCharsets.UTF_8).equals("1111")){
                        IpDriver ipDriver = new IpDriver();
                        ipDriver.setIp(((InetSocketAddress)datagramPacket.getSocketAddress()).getAddress());
                        ipDriver.setPort(((InetSocketAddress)datagramPacket.getSocketAddress()).getPort());
                        ipDriverHashMap.put(ipDriver.getIp().getHostAddress(),ipDriver);
                        System.out.println(ipDriver.getIp().getHostAddress()+"--上线");
                        continue;

                    }
                }
                if (length==6){
                    if (new String(data,0,length).equals("iclose")){
                        System.out.println(((InetSocketAddress)datagramPacket.getSocketAddress()).getAddress().getHostAddress()+"下线--");
                        ipDriverHashMap.remove(((InetSocketAddress)datagramPacket.getSocketAddress()).getAddress().getHostAddress());
                        continue;
                    }

                }
                if (length == 5) {
                    if (data[0] == 115 && data[1] == 116 && data[2] == 97 && data[3] == 114 && data[4] == 116) {
                        System.out.println("数据开始------" + length);
                        // jpeg=null;
                        count2 = 0;
                        jpeg = new byte[data_len];
//                            st=2;
                        continue;
                    }
                }
                if (length == 3) {
                    if (data[0] == 101 && data[1] == 110 && data[2] == 100) {
                        System.out.println("接受完毕------" + count2);
                        byte[] jpeg_byte = new byte[count2];
                        int jpeg_count = count2;
                        System.arraycopy(jpeg,0,jpeg_byte,0,jpeg_count);
                        JpgMode jpgMode=new JpgMode();
                        jpgMode.setCount(jpeg_count);
                        jpgMode.setJpeg(jpeg_byte);
                        if (ipDriverHashMap.size() > 0) {
                            ipDriverHashMap.forEach((k, v) -> {
                                // final JpgMode poll = jpgModes.poll();
                                send_jpeg_data(jpgMode,v);
                            });
                        }

                        st=1;
                        anInt++;
                        cou = 0;
                        fps++;

                        //  FileUtil.writeBytes(jpgMode.getJpeg(), new File("D:\\application\\java\\camd200_server\\camd200_server\\img2\\" + anInt + ".jpeg"));

                        ////////////

                    }

                } else {
                    if (jpeg!=null){
                        System.arraycopy(data, 0, jpeg, count2, length);
                        count2+=length;
                        cou++;
                        System.out.println("第"+cou+"次,长度为"+length+"data="+data[88]);
                    }
                }
            }
        }

    }
        int anInt=0;
   public ConcurrentLinkedQueue<JpgMode> jpgModes=new ConcurrentLinkedQueue<>();
  public static int st=1;
    public void startUdpServer_dev() throws IOException {
        System.out.println(dev_mes);
        datagramSocket = new DatagramSocket(9091);
        byte[] bytes = new byte[data_len];
            while(true) {
                DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
                try {
                    datagramSocket.receive(datagramPacket);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                byte[] data = datagramPacket.getData();
                int length = datagramPacket.getLength();
                System.out.println(length);
                if (data != null && data.length != 0 && length != 0) {
                    if (length==4){
                        if (new String(data,0,length, StandardCharsets.UTF_8).equals("1111")){
                            IpDriver ipDriver = new IpDriver();
                            ipDriver.setIp(((InetSocketAddress)datagramPacket.getSocketAddress()).getAddress());
                            ipDriver.setPort(((InetSocketAddress)datagramPacket.getSocketAddress()).getPort());
                            ipDriverHashMap.put(ipDriver.getIp().getHostAddress(),ipDriver);
                            System.out.println(ipDriver.getIp().getHostAddress()+"--上线");
                            continue;

                        }
                    }
                    if (length==6){
                        if (new String(data,0,length).equals("iclose")){
                              System.out.println(((InetSocketAddress)datagramPacket.getSocketAddress()).getAddress().getHostAddress()+"下线--");
                            ipDriverHashMap.remove(((InetSocketAddress)datagramPacket.getSocketAddress()).getAddress().getHostAddress());
                            continue;
                        }

                    }
                    if (length == 5) {
                        if (data[0] == 115 && data[1] == 116 && data[2] == 97 && data[3] == 114 && data[4] == 116) {
                             System.out.println("数据开始------" + length);
                           // jpeg=null;
                            count2 = 0;
                           jpeg = new byte[data_len];
//                            st=2;
                            continue;
                        }
                    }
                    if (length == 3) {
                        if (data[0] == 101 && data[1] == 110 && data[2] == 100) {
                             System.out.println("接受完毕------" + count2);
                                    byte[] jpeg_byte = new byte[count2];
                                   int jpeg_count = count2;
                                   System.arraycopy(jpeg,0,jpeg_byte,0,jpeg_count);
                           JpgMode jpgMode=new JpgMode();
                           jpgMode.setCount(jpeg_count);
                           jpgMode.setJpeg(jpeg_byte);
                           if (ipDriverHashMap.size() > 0) {
                               ipDriverHashMap.forEach((k, v) -> {
                                   // final JpgMode poll = jpgModes.poll();
                                   send_jpeg_data(jpgMode,v);
                               });
                           }

                            st=1;
                            anInt++;
                            cou = 0;
                            fps++;

                          //  FileUtil.writeBytes(jpgMode.getJpeg(), new File("D:\\application\\java\\camd200_server\\camd200_server\\img2\\" + anInt + ".jpeg"));

                            ////////////

                        }

                    } else {
                        if (jpeg!=null){
                            System.arraycopy(data, 0, jpeg, count2, length);
                            count2+=length;
                            cou++;
                             System.out.println("第"+cou+"次,长度为"+length+"data="+data[88]);
                        }
                    }
                }
           }

    }
byte[] getImgBytes(ArrayList<RecvData> b,int count){
        int index=0;
 if (b!=null&&count>0){

     byte[]jpg_addr=new byte[count];
     for (int i = 0; i <b.size() ; i++) {
          RecvData bytes = b.get(i);
          if (bytes!=null){
              System.out.println("实际长度"+bytes.getCount());
              //System.out.println("第2222"+cou+"次,长度为"+bytes.getCount()+"data="+bytes.getAddr()[9]);
              System.arraycopy(bytes.getAddr(),0,jpg_addr,index,bytes.getCount());
              index=bytes.getCount()+index;
          }
     }
     return jpg_addr;
 }
        return null;
}

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            l.lock();
            System.out.println("------------------------");

            l.unlock();
        }
    }
    void send_jpeg_data(JpgMode jpgMode,IpDriver v){
       // new Thread(()->{
            int da = jpgMode.getCount() / 8000;
            int mi = jpgMode.getCount() % 8000;
            int po = 0;
            try {
                String st = "start";
                DatagramPacket sta = new DatagramPacket(st.getBytes(StandardCharsets.UTF_8), st.length(), v.getIp(), v.getPort());
                datagramSocket.send(sta);
               // Thread.sleep(1);
                /*for (int i = 0; i < da; i++) {
                    DatagramPacket imageaData = new DatagramPacket(jpgMode.getJpeg(), po, 8000, v.getIp(), v.getPort());
                    po += 8000;
                    datagramSocket.send(imageaData);
                    Thread.sleep(0);
                }
                DatagramPacket imageaData2 = new DatagramPacket(jpgMode.getJpeg(), po, mi, v.getIp(), v.getPort());
                datagramSocket.send(imageaData2);*/
                 DatagramPacket imageaData2 = new DatagramPacket(jpgMode.getJpeg(), jpgMode.getCount(), v.getIp(), v.getPort());
                 datagramSocket.send(imageaData2);
                //Thread.sleep(10);
                String en = "end";
                DatagramPacket endd = new DatagramPacket(en.getBytes(StandardCharsets.UTF_8), en.length(), v.getIp(), v.getPort());
                datagramSocket.send(endd);
                System.out.println("向->"+v.getIp()+"发送"+jpgMode.getCount()+"字节");
            } catch (Exception e) {
                e.printStackTrace();
            }
       // }).start();
    }
}

android

package com.yaokong.shipin;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageDecoder;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import org.eclipse.paho.android.service.MqttAndroidClient;
import org.eclipse.paho.client.mqttv3.IMqttActionListener;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.IMqttToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okhttp3.internal.ws.RealWebSocket;
import okio.ByteString;
import okio.Okio;

public class MainActivity extends Activity implements View.OnClickListener {
    public Lock lock=new ReentrantLock();
    ImageView sp;
    TextView rest;
    MqttAndroidClient recv;
    ByteString byteString;
    byte[] b;
    int fps = 0;
    int isSet = 1;
    Button button;
    Button button2;
    ArrayList<byte[]> arrayList = new ArrayList<>();
    Handler handler;
     EditText ed;
    @Override
    public void onBackPressed() {
        String data = "iclose";
        try {
            DatagramPacket datagramPacket1 = new DatagramPacket(data.getBytes(StandardCharsets.UTF_8), data.getBytes(StandardCharsets.UTF_8).length, InetAddress.getByAddress(serip), 9091);

            datagramSocket.send(datagramPacket1);
        } catch (Exception ioException) {
            ioException.printStackTrace();
        }
        aBoolean = false;
        datagramSocket.close();
        finish();
        super.onBackPressed();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        String data = "iclose";
        try {
            DatagramPacket datagramPacket1 = new DatagramPacket(data.getBytes(StandardCharsets.UTF_8), data.getBytes(StandardCharsets.UTF_8).length, InetAddress.getByAddress(serip), 9091);

            datagramSocket.send(datagramPacket1);
        } catch (Exception ioException) {
            ioException.printStackTrace();
        }
        aBoolean = false;
        datagramSocket.close();
        finish();
    }

    @SuppressLint({"RestrictedApi", "HandlerLeak"})
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sp = findViewById(R.id.sp);
        rest = findViewById(R.id.stat);
        button = findViewById(R.id.star);
        button2 = findViewById(R.id.close);
        ed=findViewById(R.id.input);
        button.setOnClickListener(this);
        button2.setOnClickListener(this);
        handler = new Handler() {
            @RequiresApi(api = Build.VERSION_CODES.P)
            @Override
            public void handleMessage(@NonNull Message msg) {
                  switch (msg.what){
                      case 5:
                          rest.setText("FPS:" + fps);
                          fps = 0;
                          break;
                      case 4:
                          if (msg.obj!=null){
                              Bitmap b=(Bitmap)msg.obj;
                                 sp.setImageBitmap(b);
                          }
                          break;
                  }
            }
        };
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.INTERNET, Manifest.permission.ACCESS_NETWORK_STATE}, 88);
        new Thread(() -> {
            while (true) {
                try {
                    Message message1 = new Message();
                    message1.what = 5;
                    handler.sendMessage(message1);
                    Thread.sleep(1000);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();


    }
  

    DatagramSocket datagramSocket;
    int count = 0;
    byte[] jpeg = null;
    byte[] imgBytes;
    ArrayList<byte[]> bytess = new ArrayList<>();
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    @RequiresApi(api = Build.VERSION_CODES.P)
    void startUdpServer() throws IOException {
        datagramSocket = new DatagramSocket(3333);
        Log.d("udp-----", "udp启动");
        String data1 = "1111";
        DatagramPacket datagramPacket2 = new DatagramPacket(data1.getBytes(StandardCharsets.UTF_8), data1.length(), InetAddress.getByAddress(serip), port);
        System.out.println(datagramSocket + "------------");
        datagramSocket.send(datagramPacket2);
        byte[] bytes = new byte[1024*500];
        DatagramPacket datagramPacket = null;
        while (aBoolean) {
            System.out.println(aBoolean);
            datagramPacket = null;
            datagramPacket = new DatagramPacket(bytes, bytes.length);
            datagramSocket.receive(datagramPacket);
            byte[] data = datagramPacket.getData();
            System.out.println("-----------"+datagramPacket.getLength());
            if (data != null && data.length != 0 && datagramPacket.getLength() != 0) {
                if (datagramPacket.getLength()==5){
                    if (data[0]==115&&data[1]==116&&data[2]==97&&data[3]==114&&data[4]==116){
                       System.out.println("数据开始------"+datagramPacket.getLength());
                       count=0;
                       jpeg=new byte[500*1024];
                        continue;
                    }
                }
                if (datagramPacket.getLength()==3){
                    if (data[0]==101&&data[1]==110&&data[2]==100){
                        System.out.println("接受完毕------"+datagramPacket.getLength());
                        new Thread(()->{
                            JpegMode jpegMode=new JpegMode();
                            jpegMode.setJpeg(jpeg);
                            jpegMode.setCount(count);
                            linkedQueue_rec.add(jpegMode);
                           /* ImageDecoder.Source ds=ImageDecoder.createSource(ByteBuffer.wrap(jpegMode.getJpeg(),0,jpegMode.getCount()));
                            if (ds!=null){
                                try {
                                    Bitmap bitmap = ImageDecoder.decodeBitmap(ds);
                                    if (bitmap!=null){
                                        linkedQueue.add(bitmap);
                                    }
                                } catch (IOException ioException) {
                                    ioException.printStackTrace();
                                }
                            }*/
                           // Bitmap bitmap = BitmapFactory.decodeByteArray(jpegMode.getJpeg(), 0, jpegMode.getCount());

                            try {
                                Thread.sleep(2);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }).start();

                        fps++;
                        Log.d("udp-----","组装数据");
                       // Log.d("udp-----","组装数据"+linkedQueue.size());
                    }

                }else{
                    if (jpeg!=null){
                        System.arraycopy(datagramPacket.getData(), 0, jpeg, count, datagramPacket.getLength());
                        count =count+datagramPacket.getLength();

                    }
                }

                continue;
            }


        }
    }
    Request request;
    OkHttpClient client;
TextView zhuang;
boolean aBoolean=false;
//byte[] serip= {(byte)192,(byte)168,(byte)214,(byte) 9};
byte[] serip;
int port;
    @RequiresApi(api = Build.VERSION_CODES.P)
    @SuppressLint("NonConstantResourceId")
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.close:
                String data="iclose";
                    new Thread(()->{
                        try {
                            if (get_ip_port()==1){
                                DatagramPacket datagramPacket1=new DatagramPacket(data.getBytes(StandardCharsets.UTF_8),data.getBytes(StandardCharsets.UTF_8).length, InetAddress.getByAddress(serip),port);
                                datagramSocket.send(datagramPacket1);
                                aBoolean=false;
                                datagramSocket.close();
                            }

                        } catch (Exception ioException) {
                            ioException.printStackTrace();
                        }

                    }).start();

                break;
                case R.id.star:
                    if (get_ip_port()==1){
                        new Thread(()->{
                            try {
                                aBoolean=true;
                                startUdpServer();
                                /// Thread.sleep(10);
                            } catch (Exception ioException) {
                                ioException.printStackTrace();
                            }
                        }).start();
                        send();
                        jpg_out();
                    }

                break;
        }
    }
    ConcurrentLinkedQueue<Bitmap>linkedQueue=new ConcurrentLinkedQueue<>();
    ConcurrentLinkedQueue<JpegMode>linkedQueue_rec=new ConcurrentLinkedQueue<>();
    public void send(){
        new Thread(()->{
            while (true){
                if (linkedQueue.size()>0){
                    Message message=new Message();
                    message.what=4;
                    message.obj=linkedQueue.poll();
                    handler.sendMessage(message);
                    try {
                        Thread.sleep(5);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    Log.d("send-----","--------------------------------"+linkedQueue.size());
                }
            }
        }).start();

    }
    @RequiresApi(api = Build.VERSION_CODES.P)
    public void jpg_out(){
        new Thread(()->{
            while (true){
                if (linkedQueue_rec.size()>0){
                    JpegMode poll = linkedQueue_rec.poll();
                    if (poll!=null){
                        ImageDecoder.Source ds=ImageDecoder.createSource(ByteBuffer.wrap(poll.getJpeg(),0,poll.getCount()));
                        if (ds!=null){
                            try {
                                Bitmap bitmap = ImageDecoder.decodeBitmap(ds,(i_code,inf,sour)->{
                                    i_code.setTargetSize(1920,1080);

                                });
                                if (bitmap!=null){
                                    linkedQueue.add(bitmap);
                                }
                            } catch (IOException ioException) {
                                ioException.printStackTrace();
                            }
                        }
                    }
                    Log.d("ImageDecoder-----","--------------------------------"+linkedQueue.size());
                }
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }
@SuppressLint("WrongConstant")
int get_ip_port(){
        int ip_by[]=new int[4];
        String ip=null;
        int por=0;
        int ind=0;
    String s = ed.getText().toString();
    Log.d("dddddddddd",s);
    if ("".equals(s)) {
        Toast.makeText(MainActivity.this,"格式错误1",1).show();
        return -1;
    }else {
        if (s.lastIndexOf(".")!=-1&&s.lastIndexOf(":")!=-1){
            for (int i = 0; i <s.length() ; i++) {
                if (s.charAt(i)=='.'){
                    ind++;
                }
            }
            Log.d("dddddddddd",s);
            if (ind!=3){
                Toast.makeText(MainActivity.this,"格式错误"+ind,1).show();
                return -1;
            }
            String[] split = s.split(":");
            for (int i = 0; i <split.length ; i++) {
                if (split[i].lastIndexOf(".")!=-1){
                    ip=split[i];
                }else {
                    por=Integer.parseInt(split[i]);
                }
            }
            String[] ip_split = ip.split("\\.");
            for (int i = 0; i <ip_split.length ; i++) {
                ip_by[i]=Integer.parseInt(ip_split[i]);
            }
            serip=new byte[4];
            for (int i = 0; i < serip.length; i++) {
                serip[i]=(byte) ip_by[i];
            }
            port=por;
            Log.d("ddddddddddsss",serip[3]+"");
            Log.d("ddddddddddssssss",port+"gfg");
            return 1;
        }
        return -1;
    }

}``````y

最后

至于远程只需要把Java端部署到远程服务器开发板发送端IP改成远程服务器地址即可实现远程
卫生么不h264因为可能自己菜,h264解析是要时间的

──── 0人觉得很赞 ────

使用道具 举报

棒~
帧率能多少?
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28167 个
  • 话题数: 39941 篇