Android手机通过usb线与otg线的区别外接usb摄像头需要怎么做

红米手机 &
电视盒子 &
智能硬件 &
潜力级手机控
扫码下载App一键签到 升级加速
手机通过OTG连接摄像头,用拍照功能实现倒车影像
&来自老版论坛
扫一扫!手机看帖更爽
& && &最近在考虑买车,对好多汽车的导航不太满意,所以就想手机或者平板不也可以做导航吗?然后新手撕鸡~的倒车技术还是需要倒车影像辅助的呃!& && &So~就想手机+外接摄像头能不能实现倒车影像呢?考虑过蓝牙摄像头,供电麻烦和信号不行放弃了,而且需要一直开着很浪费。后来想在车尾部装一个摄像头,将线拉到汽车控制台将摄像头的USB接口通过OTG与手机连接,然后倒车时使用拍照不就可以通过摄像头看到汽车后方了吗?
& && &这时想到了三个问题:1.OTG是否可以实现摄像头的供电;2.如何才能在拍照时选择使用外接摄像头;3.如何在有外接摄像头的情况下,可以像设置默认使用 前/后 摄像头一样,设为默认。& && && &*对了应该还需要将图像左右倒置,就像前置镜头照镜子一样,不然障碍物明明在左边,屏幕却显示在右边,要像照镜子一样。
& && &解决了这几个问题手机做倒车影像就可以实现了~也可以推广应用到窥视管道等领域。
& && &还望有大神出现,帮助解决~{:6_211:}
扫描二维码,手机查看本帖
京ICP证110507号 京ICP备号原文地址:
这段时间做一个Android项目,需要在一台Android 4.4.4系统设备上链接usb摄像头,用作人脸识别,
于是作为Android项目组“骨干”(哈哈臭屁一下^-^)的我开始了usb摄像头攻坚战,爬帖子,找博客,
最后眼睛瞅准了一篇博客(感谢)
在他的帮助下我找到了
然后下载源码开始了我的usb摄像头驱动之旅
我整理的库文件下载
首先是在Linux Ubuntu系统下面配置环境,AS,NDK,如果想写C代码方便可以安装QT(个人推荐,其他都行,比如gedit就很好使)
软件安装,环境配置,这些自当不必多说。。。网上有N多种方式可以搞定
接下来就开始代码改造
找到jni文件夹下的ImageProc.c文件修改其中的jni接口方法名,使之指向CameraPreview.java
我修改后如下所示,找到其他的jni方法用同样方式修改方法名(不要忘了同步.h文件中的方法名哦。。。):
void Java_com_mojsoft_usbcamera_view_CameraPreview_pixeltobmp( JNIEnv* env,jobject thiz,jobject bitmap)
Ctrl+Alt+T打开终端,cd到你的jni目录下,运行ndk-build,编译成功
cd .. 回到jni目录外面,运行ls就可以看到libs,obj两个目录,将libs中的libImageProc.so文件拷贝到你项目中的jniLibs目录下(AS)
接下来是java调用 [注意:java包名和C文件方法格式一致]
将CameraPreview文件放到布局中,编译运行。。。
接下来就是盯着屏幕。。。
满满的惊喜,问题就这么解决了,哈哈
下面是主要的CameraSurfaView类:
class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, Runnable {
private static final boolean DEBUG =
private static final String TAG = "WebCam";
protected C
private SurfaceH
Thread mainLoop =
private Bitmap bmp =
private byte[] byteA
private boolean cameraExists =
private boolean shouldStop =
// /dev/videox (x=cameraId+cameraBase) is used.
// In some omap devices, system uses /dev/video[0-3],
// so users must use /dev/video[4-].
// In such a case, try cameraId=0 and cameraBase=4
private int cameraId = 0;
private int cameraBase = 0;
// This definition also exists in ImageProc.h.
// Webcam must support the resolution 640x480 with YUYV format.
static final int IMG_WIDTH = 640;
static final int IMG_HEIGHT = 480;
// The following variables are used to draw camera images.
private int winWidth = 0;
private int winHeight = 0;
private int dw,
private boolean isFramAready =
private AlreadyRGBL
// JNI functions
public native int prepareCamera(int videoid);
public native int prepareCameraWithBase(int videoid, int camerabase);
public native void processCamera();
public native void stopCamera();
public native void pixeltobmp(Bitmap bitmap);
public native byte[] getRgb();
System.loadLibrary("ImageProc");
public CameraPreview(Context context) {
super(context);
this.context =
if (DEBUG) Log.d(TAG, "CameraPreview constructed");
setFocusable(true);
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
public CameraPreview(Context context, AttributeSet attrs) {
super(context, attrs);
this.context =
if (DEBUG) Log.d(TAG, "CameraPreview constructed");
setFocusable(true);
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
public void run() {
while (true && cameraExists) {
//obtaining display area to draw a large image
if (winWidth == 0) {
winWidth = this.getWidth();
winHeight = this.getHeight();
if (winWidth * 3 / 4 &= winHeight) {
dh = (winHeight - winWidth * 3 / 4) / 2;
rate = ((float) winWidth) / IMG_WIDTH;
rect = new Rect(dw, dh, dw + winWidth - 1, dh + winWidth * 3 / 4 - 1);
dw = (winWidth - winHeight * 4 / 3) / 2;
rate = ((float) winHeight) / IMG_HEIGHT;
rect = new Rect(dw, dh, dw + winHeight * 4 / 3 - 1, dh + winHeight - 1);
// obtaining a camera image (pixel data are stored in an array in JNI).
processCamera();
// camera image to bmp
pixeltobmp(bmp);
byte[] arr = getRgb();
isFramAready =
Canvas canvas = getHolder().lockCanvas();
if (canvas != null) {
// draw camera bmp on canvas
canvas.drawBitmap(bmp, null, rect, null);
getHolder().unlockCanvasAndPost(canvas);
listener.alreadyRGB(arr);
if (shouldStop) {
shouldStop =
public void surfaceCreated(SurfaceHolder holder) {
if (DEBUG) Log.d(TAG, "surfaceCreated");
if (bmp == null) {
bmp = Bitmap.createBitmap(IMG_WIDTH, IMG_HEIGHT, Bitmap.Config.ARGB_8888);
if (byteArrary == null) {
byteArrary = new byte[IMG_WIDTH * IMG_HEIGHT];
// /dev/videox (x=cameraId + cameraBase) is used
//下面一句是原代码,我尝试失败,于是我将其修改为 int ret = prepareCamera(0);后成功调用
// int ret = prepareCameraWithBase(cameraId, cameraBase);
int ret = prepareCamera(0);
if (ret != -1) cameraExists =
mainLoop = new Thread(this);
mainLoop.start();
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (DEBUG) Log.d(TAG, "surfaceChanged");
public void surfaceDestroyed(SurfaceHolder holder) {
if (DEBUG) Log.d(TAG, "surfaceDestroyed");
if (cameraExists) {
shouldStop =
while (shouldStop) {
Thread.sleep(50); // wait for thread stopping
} catch (Exception e) {
stopCamera();
public void setGetBitmapListener(AlreadyRGBListener listener){
this.listener =
本文已收录于以下专栏:
相关文章推荐
linux-2.6.14下USB驱动移植心得
驱动移植心得
一、代码修改
主要是按照这个贴来做:
http://www.hfrk.net/S3C2410/kaifa/06315...
USB摄像头驱动的移植
1、USB摄像头的配置
UVC,全称为:USB video class 或USB video device class,是Microsoft与另外几家设备厂商联合推出的为USB...
USB摄像头驱动的移植
原文地址:
http://blog.csdn.net/woshidahuaidan2011/article/details/
/thread--1.html?_dsign=44f35f3b
多亏了stackoverflow看到的一篇帖子,其中有几...
多亏了stackoverflow看到的一篇帖子,其中有几句关键的话,然后顺藤摸瓜解决了问题。
帖子大意:
讨论的前提是你的USB摄像头是UVC兼容的(如今大部分摄像头兼容)
默认Android不...
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)分享给朋友:Android视频采集卡视频2,Android外接摄像头,无需root,USB camera android下载至电脑扫码用手机看用或微信扫码在手机上继续观看二维码2小时内有效Android视频采集卡视频2,Android外接摄像头,无需root,USB camera android扫码用手机继续看用或微信扫码在手机上继续观看二维码2小时内有效,扫码后可分享给好友没有优酷APP?立即下载请根据您的设备选择下载版本
药品服务许可证(京)-经营- 请使用者仔细阅读优酷、、、Copyright(C)2017 优酷
版权所有不良信息举报电话:

我要回帖

更多关于 usb线与otg线的区别 的文章

 

随机推荐