android手机连接esp32视频
之前无意中买了个esp32的板子 还带了个小摄像头 ,跑了它的例子后可以在电脑上看到视频,下面是记录的使用方法。
esp32摄像头的使用
后来想在手机上直接查看视频,但一直没有成功,直到我看了b站上的稚晖君的一个视频
【自制】吃完的螃蟹不要扔,裹上黑科技,可以做一台火星车~【硬核】
里面刚好用到了esp32的摄像头模块,于是找到他的githup地址,
地址
里面有这个的整个开源项目,copy下来。
第一次跑也没能成功,问题在他使用的摄像头与我的不一样,
根据之前的esp32摄像头的使用例子代码,我的摄像头是
#define CAMERA_MODEL_AI_THINKER
在camera_pins.h中找到与该定义对应的宏
再打开稚晖君的esp32代码,修改其中pins.h中的宏定义与我所使用摄像头定义的一样:
#ifndef PIN_H
#define PIN_H#define I2C0_SDA 32
#define I2C0_SCL 33#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22#endif
后来还是不行,问题出在就出在android的读写权限上,
所以修改了读写权限 :
android 读写权限问题 :java.io.IOException: Permission denied 解决方法
并修改了其中的一些代码。
去掉esp32代码中不需要的部分,修改后如下:
#include <WiFi.h>
// #include <U8g2lib.h>
#include <I2Cdev.h>
#include <Wire.h>
// #include <MPU6050.h>
#include "Pins.h"
#include "Camera.h"
#include "Motor.h"const char* ssid = ""; //填你自己的局域网名
const char* password = ""; //局域网密码WiFiServer server(81);// OV2640 camera
Camera ov2640;void setup()
{Serial.begin(115200);Wire.begin(I2C0_SDA, I2C0_SCL);Wire.setClock(400000);// while (!mpu6050.testConnection());// mpu6050.initialize();ov2640.initialize();int n = WiFi.scanNetworks();Serial.println("scan done");if (n == 0){Serial.println("no networks found");}else{Serial.print(n);Serial.println(" networks found");for (int i = 0; i < n; ++i){// Print SSID and RSSI for each network foundSerial.print(i + 1);Serial.print(": ");Serial.print(WiFi.SSID(i));Serial.print(" (");Serial.print(WiFi.RSSI(i));Serial.print(")");Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");delay(10);}}WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("");Serial.println("WiFi connected");ov2640.startCameraServer();Serial.print("Camera Ready! Use 'http://");Serial.print(WiFi.localIP());Serial.println("' to connect");server.begin();
}float i = -1;
long heart_beat = 0;
void loop()
{Serial.println(analogRead(38));WiFiClient client = server.available(); // listen for incoming clientsif (client){// if you get a client,Serial.println("New Client."); // print a message out the serial portString currentLine = ""; // make a String to hold incoming data from the clientwhile (client.connected()){ // loop while the client's connectedif (client.available()){ // if there's bytes to read from the client,}}}delay(50);
}
String getValue(String data, char separator, int index)
{int found = 0;int strIndex[] = { 0, -1 };int maxIndex = data.length() - 1;for (int i = 0; i <= maxIndex && found <= index; i++){if (data.charAt(i) == separator || i == maxIndex){found++;strIndex[0] = strIndex[1] + 1;strIndex[1] = (i == maxIndex) ? i + 1 : i;}}return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}
android studio代码修改如下:
主要是添加了申请权限部分与去掉了他多余的代码。
package xyz.pengzhihui.esp32ipcam;import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;public class MainActivity extends Activity implements View.OnClickListener
{private static final String TAG = "MainActivity::";private HandlerThread handlerThread;private Handler handler;private ImageView imageView;private final int DOWNDLOAD = 1;private final int REGISTER = 2;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.downloadFile).setOnClickListener(this);imageView = findViewById(R.id.img);handlerThread = new HandlerThread("http");handlerThread.start();handler = new HttpHandler(handlerThread.getLooper());}@Overridepublic void onClick(View v){switch (v.getId()){case R.id.downloadFile:handler.sendEmptyMessage(DOWNDLOAD);break;default:break;}}//动态申请权限public static boolean isGrantExternalRW(Activity activity) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {activity.requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);return false;}return true;}private class HttpHandler extends Handler{public HttpHandler(Looper looper){super(looper);}@Overridepublic void handleMessage(Message msg){switch (msg.what){case DOWNDLOAD:downloadFile();break;default:break;}}}private void downloadFile(){String downloadUrl = "http://192.168.50.26:80/stream";String savePath = "/sdcard/pic.jpg";File file = new File(savePath);if (file.exists()){file.delete();}if(!isGrantExternalRW(this)){return;}BufferedInputStream bufferedInputStream = null;FileOutputStream outputStream = null;try{URL url = new URL(downloadUrl);try{HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();httpURLConnection.setRequestMethod("GET");httpURLConnection.setConnectTimeout(1000 * 5);httpURLConnection.setReadTimeout(1000 * 5);httpURLConnection.setDoInput(true);httpURLConnection.connect();if (httpURLConnection.getResponseCode() == 200){InputStream in = httpURLConnection.getInputStream();InputStreamReader isr = new InputStreamReader(in);BufferedReader bufferedReader = new BufferedReader(isr);String line;StringBuffer stringBuffer = new StringBuffer();int i = 0;int len;byte[] buffer;while ((line = bufferedReader.readLine()) != null){if (line.contains("Content-Type:")){line = bufferedReader.readLine();len = Integer.parseInt(line.split(":")[1].trim());bufferedInputStream = new BufferedInputStream(in);buffer = new byte[len];int t = 0;while (t < len){t += bufferedInputStream.read(buffer, t, len - t);}bytesToImageFile(buffer, "0A.jpg");final Bitmap bitmap = BitmapFactory.decodeFile("sdcard/0A.jpg");runOnUiThread(new Runnable(){@Overridepublic void run(){imageView.setImageBitmap(bitmap);}});}}}} catch (IOException e){e.printStackTrace();}} catch (MalformedURLException e){e.printStackTrace();} finally{try{if (bufferedInputStream != null){bufferedInputStream.close();}if (outputStream != null){outputStream.close();}} catch (IOException e){e.printStackTrace();}}}private void bytesToImageFile(byte[] bytes, String fileName){try{File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + fileName);FileOutputStream fos = new FileOutputStream(file);fos.write(bytes, 0, bytes.length);fos.flush();fos.close();} catch (Exception e){e.printStackTrace();}}}
最后结果
android手机连接esp32视频相关推荐
- Android 手机采集摄像头视频 socket 视频传输实时传播
这里搜集了两种实现Android 手机采集摄像头视频 socket 视频传输实时传播的方法,两种都可以使用. 第一种如下: 1.通过客户端socket请求,服务端接受到请求后,获取socket的输出流 ...
- android手机连接无线路由器上网设置,手机连接无线网络怎么设置?手机Wifi无线网设置教程...
随着智能手机无线上网的流行,如今很多家庭都会组建Wifi无线网络,目前组建Wifi网络,大致有两种情况,一种是使用无线路由器,另外一种是将笔记本变身无线无路由器,从而实现智能手机也可以免费Wifi上网 ...
- android手机连接PC后怎样切换为U 盘模式
android手机连接PC后怎样切换为U 盘模式 之前已经发过关于 APK文件怎样安装程序到手机上 已经介绍过了怎样通过手机与 PC 的连接将软件安装至手机.这一次再来讲解一下怎样将你的手机变为&q ...
- Android 手机连接电脑
将Android手机连接到电脑需要安装驱动程序,主要有两种方法,一种是手动安装驱动,另一种是使用软件工具自动安装驱动. 在"设备管理器"面板我们可以看到其中"Androi ...
- 【经验】为什么Android手机连接USB后查看手机内部图片有些有缩略图,有些显示图标?
[经验]为什么Android手机连接USB后查看手机内部图片有些有缩略图,有些显示图标? 一.图片内嵌缩略图原理 这是什么原理呢?因为现在JPEG的文件采用了压缩的方式,其过程比较复杂.为了能让大家快 ...
- android手机连接PC无法正常安装驱动
工作当中我们经常会遇到Android手机连接PC的时候无法正确安装驱动,或者安装失败.当然找到正确的驱动文件时首选的解决方案,如果正确的驱动文件依旧无法安装成功我们可以打开我的电脑-->属性-- ...
- android手机连接电脑时直接截屏到电脑
如题,android手机连接mac,直接快速截屏到mac. 解决方法: 利用android的adb命令即可: #截取手机屏幕保存到SDCard adb shell /system/bin/screen ...
- android手机连接windows,将Android手机投影到Windows 10 PC [夏昆冈]
Windows 10 预览版Build 14328加入了原生的Miracast投影功能,简单说,任意加入无线网络的Win10设备都可以成为一台无线显示器设备.这样一来,几乎所有Android手机和Wi ...
- android手机连接windows,四种方式将数据从Windows手机免费传输到Android设备
解决方案3.使用OneDrive将内容从Windows Phone传输到Android 微软的智能手机操作系统可能不如Android或iOS那么受欢迎.但是,微软的一些应用确实令人印象深刻!微软的On ...
最新文章
- Java判断文本文件编码格式以及读取
- 飞书×品玩邀请多位行业大咖,共谈跨境企业“战疫”秘籍!
- ClassLoader工作机制
- 全球及中国液压磁路保护器行业发展规划与产销需求预测报告2022版
- Linux中printk和strace命令调试的一些技巧
- python下selenium测试报告整合
- SqlSever分页查询,仅扫描一次表
- 2020护网参考学习 关于护网行动的总结
- C++:vs2017编写代码时的光标变成了黑块,选中字时替换掉了黑块选中的字【解决办法】
- Golang开发环境配置
- 4.1 选择IDC机房 4.2 硬件服务器选型 4.3 上架服务器 4.4/4.5 装系统
- 《C语言程序设计》(谭浩强第五版) 第5章 循环结构程序设计 习题解析与答案
- 腾讯文档快捷键在哪里
- Linux从删库到跑路的命令,从删库到跑路——重写 rm -rf
- Apache Tomcat 文件包含漏洞(CNVD-2020-10487,对应 CVE-2020-1938)
- SEO搜索引擎优化步骤建议
- 看淡生死,弥争当下!
- android---转轮菜单
- DAZ STUDIO 4.12 NVIDIA Iray 渲染设置
- HDU 5514	 Frogs