本人不是用的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解析是要时间的