`
xujinquan19
  • 浏览: 149996 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android摄像头采集Demo

阅读更多

定义MyCameraContext类,该类必须继承CameraListener,采集到数据时,将会触发该类内部定义的回调函数:postData。注意android2.3,和2.2在构造函数上是有区别的

 

//MyCameraContext.h 


#ifndef MY_CAMERA_H

#define  MY_CAMERA_H

#include "jni.h"

//#include "JNIHelp.h"

#include "android_runtime/AndroidRuntime.h"



#include <utils/Vector.h>



#include <surfaceflinger/Surface.h>

#include <camera/Camera.h>

#include <binder/IMemory.h>

#include <stdint.h>

using namespace android;

class MyCameraContext: public CameraListener

{

public:

    MyCameraContext(const sp<Camera>& camera);

    ~MyCameraContext() { ; }

    //特殊事件通知回调,包括错误之类....目前在Demo中未使用

    virtual void notify(int32_t msgType, int32_t ext1, int32_t ext2);

    //采集数据回调....

    virtual void postData(int32_t msgType, const sp<IMemory>& dataPtr);

    //获取时间回调........目前在Demo中未使用

    virtual void postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);

    void setCallbackMode();

    void getcallbackfunc(void(*p)(void* lpdata,int len) ){mcallbackfunc=p; };

    sp<Camera> getCamera() { return mCamera; }

private:

        void(*mcallbackfunc)(void* lpdata,int len) ;

    void copyAndPost(const sp<IMemory>& dataPtr, int msgType);

    sp<Camera>  mCamera;                // strong reference to native object

   // Mutex       mLock;



};



sp<Camera> CreateCamera();



sp<MyCameraContext> CreateCameraContext(sp<Camera>& spCamera);



int setPreviewDisplaysurface(sp<Camera>& spCamera, sp<Surface>& surface);


#endif




//MyCameraContext.cpp 


#include "MyCamera.h"





MyCameraContext::MyCameraContext(const sp<Camera>& camera)

{



    mCamera = camera;

}







void MyCameraContext::notify(int32_t msgType, int32_t ext1, int32_t ext2)

{



}



void MyCameraContext::copyAndPost( const sp<IMemory>& dataPtr, int msgType)

{

    jbyteArray obj = NULL;

    if (dataPtr != NULL) {

        ssize_t offset;

        size_t size;

        sp<IMemoryHeap> heap = dataPtr->getMemory(&offset, &size);

        mcallbackfunc((void*)(heap->getBase()+offset),size);

        uint8_t *heapBase = (uint8_t*)heap->base();

        }

}



void MyCameraContext::postData(int32_t msgType, const sp<IMemory>& dataPtr)

{

    copyAndPost(dataPtr, msgType);



}



void MyCameraContext::postDataTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)

{

    postData(msgType, dataPtr);

}



void MyCameraContext::setCallbackMode()

{

    mCamera->setPreviewCallbackFlags(FRAME_CALLBACK_FLAG_CAMERA);

}

#ifdef ANDROID2_3  //android2.3

sp<Camera> CreateCamera()

{

        int NumberOfCameras=Camera::getNumberOfCameras();

        CameraInfo cameraInfo;

        for (int i = 0; i < NumberOfCameras; i++) {

                    status_t rc = Camera::getCameraInfo(i, &cameraInfo);

                    if (rc != NO_ERROR) {                

                        break;

                     }

                if(cameraInfo.facing==CAMERA_FACING_BACK) {

                        sp<Camera> camera = Camera::connect(i);

                        return camera;

                }

        }

        return NULL;

}

#else //android 2.2

sp<Camera> CreateCamera()

{



        sp<Camera> camera = Camera::connect();

        if(camera->get())

                return camera;

        return NULL;

}

#endif



sp<MyCameraContext> CreateCameraContext(sp<Camera>& spCamera)

{

    sp<MyCameraContext> context = new MyCameraContext(spCamera);

    spCamera->setListener(context);

    return context;

}



int setPreviewDisplaysurface(sp<Camera>& spCamera, sp<Surface>& surface)

{

        if (spCamera->setPreviewDisplay(surface) != NO_ERROR)

                return -1;

        return 1;

}





//测试demo:


#include "MyCamera.h"

void databackfunc(void *base,int size);



void databackfunc(void *base,int size)

{

  //注意数据格式的处理

  //spCamera->getParameters(); 获取各种采集参数包括格式

   //数据处理

}



JNIEXPORT  jint Java_lpc_bairui_android_lpc_camera(JNIEnv* env, jclass clazz)

{



        sp<Surface> sps;

        sp<Camera> spCamera=CreateCamera();

        if(spCamera.get()){        

                spCameraContext=CreateCameraContext(spCamera);

                if(spCameraContext.get()){

                        /*并没有为sps赋值,所以它不指向任何Surface,所以将不会创建预览格式,仅仅获取数据

                        setPreviewDisplaysurface函数在*/

                        if( setPreviewDisplaysurface(spCamera,sps)==1){

                                //String8  str("preview-size=240x320");

                                //spCamera->setParameters(str);

                                //spCamera->getParameters().string();

                                spCameraContext->setCallbackMode();

                                //设置处理采集到数据的回调函数

                                spCameraContext->getcallbackfunc(databackfunc);

                                //开始采集

                                spCamera->startPreview();

                                

                                return 1;

                        }

                        

                }

        }

        return 0;

}

 

分享到:
评论

相关推荐

    Android Camera1 Demo - 实现预览、拍照、录制视频功能

    资源中有个MyCamera1Demo.apk可以直接安装运行,MyCamera1Demo.zip是Demo源码。 具体详见我的博客 : https://blog.csdn.net/EthanCo/article/details/132651833 使用的Android Studio版本是Android Studio Giraffe |...

    外接USB摄像头Demo

    本Demo旨在展示如何在Android设备上通过USB接口连接并使用外置摄像头,实现自动对焦及拍照功能。下面将详细阐述这一过程中的关键知识点。 首先,了解UVCCamera。UVCCamera是UVC(USB Video Class)标准的一个实现,...

    Android摄像头采集编码H264及H264解码播放

    包含两个Demo,一个是H264TestCameraSaveH264工程,运行可以开启摄像头录制编码H264文件,输出为SD卡中encoder.h264;另一个是testService工程,读取SD下的encoder.h264解码为RGB绘图播放。附加一个encoder.h264文件...

    Android 外接基于UVC协议的摄像头并实现预览 demo

    在Android平台上,外接基于UVC(Universal Video Class)协议的摄像头并实现预览功能是一项技术挑战,但通过一些特定的API和库可以实现。UVC协议是USB设备类定义的一部分,它允许USB设备(如摄像头)以统一的方式与...

    Android CameraX Demo : 实现预览/拍照/录制视频/图片分析/对焦/切换摄像头等操作

    我自己写的Android CameraX Demo,实现了预览/拍照/录制视频/图片分析/对焦/切换摄像头等操作。 具体详见我的博客 : https://blog.csdn.net/EthanCo/article/details/125603671

    android 直播sdkdemo

    在Android平台上进行直播开发时,通常会...总的来说,"android 直播sdkdemo"是一个涵盖音视频采集、编码、传输和UI设计等多个方面技术的综合实例,开发者可以通过研究这个demo了解并实现Android直播应用的基本功能。

    RTSP-Camera-for-Android-视频监控demo

    RTSP camera aims to establish an Android platform as a streaming server for the device's camera output. In order to register for receiving the camera stream, the Real-Time streaming protocol (RTSP) is...

    Android 短视频录制demo

    首先,Android短视频录制涉及到的主要技术包括音视频采集、编码、合成以及文件保存。在Android系统中,这些任务主要由MediaRecorder和Camera API来完成。 1. **MediaRecorder**: MediaRecorder是Android系统提供的...

    海思网络摄像头源码

    在"android Demo"这个子文件夹中,我们可以推测源码可能包含了一个运行在Android操作系统上的摄像头演示程序。 1. **海思芯片与摄像头驱动**: 海思芯片因其高效能和低功耗而广泛应用于网络摄像头领域。源码中的...

    安卓下 android webRTC-Demo

    标题“安卓下 android WebRTC-Demo”指的是一个Android应用示例,展示了如何在Android设备上使用WebRTC技术进行实时通信。这个Demo适用于开发者,特别是对WebRTC不熟悉的Android开发者,他们可以直接导入Eclipse IDE...

    android 视频通讯demo

    【Android 视频通讯Demo详解】 在Android平台上开发视频通讯应用是一项复杂且技术密集的任务,涉及到多媒体处理、网络传输、实时通信等多个领域的知识。这里我们主要探讨的是一个基础的视频通讯Demo,它专注于视频...

    android webrtcdemo

    "android webrtcdemo"是一个专为Android平台设计的WebRTC学习示例,它展示了如何实现多人视频通话和一对一通话功能。 首先,我们需要理解WebRTC的基本组件和流程。WebRTC系统主要包含以下部分: 1. **User Agent ...

    Webrtc 视频demo(Android)

    本篇文章将深入探讨基于Android的WebRTC视频demo的相关知识点。 1. **WebRTC架构**: WebRTC系统由三大部分组成:客户端堆栈、服务器信令以及数据传输。客户端堆栈包括采集模块(捕获音频和视频)、编码和解码模块...

    android-webrtc-demo,基于chrome64

    为了运行这个Demo,你需要确保你的Android设备支持WebRTC,并且已经正确地配置了必要的权限,如访问摄像头和麦克风的权限。同时,你还需要一个运行着类似服务器的角色来交换SDP和ICE信息,以完成两端的连接建立。...

    Android身份证识别demo,文字识别

    这个"Android身份证识别demo"正是为此目的而设计的。它利用了百度的文字识别技术(OCR,Optical Character Recognition),能够从身份证图片中提取出关键信息,如姓名、性别、地址以及身份证号码。 一、文字识别...

    摄像头双开获取当前帧CameraDemo.rar

    在CameraDemo压缩包中的源代码可能包含了实现上述功能的示例,通过对代码的分析和学习,开发者可以理解如何在Android平台上实现摄像头双开预览和获取当前帧。这种技术在AR应用、视频会议、3D扫描等领域有广泛应用。

    Android离线人脸识别源码Demo编译的APP

    Android离线人脸识别源码Demo编译的APP。...用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部的一系列相关技术,通常也叫做人像识别、面部识别。

    uvc摄像头查询支持分辨率

    在IT领域,尤其是在嵌入式系统和Linux驱动开发中,"uvc摄像头查询支持分辨率"是一个常见的需求。UVC(Universal Video Class)是USB设备类定义的一种,用于处理视频流设备,如网络摄像头。V4L2(Video for Linux Two...

    openh264 android demo

    【标题】"openh264 android demo"是一个基于OpenH264库的Android应用程序示例,它展示了如何在Android设备上实现H264视频编码和解码功能。OpenH264是由思科系统开发并开源的一个高效、高质量的H.264编解码器,适用于...

    Android版美颜rtsp直播demo

    总的来说,"Android版美颜rtsp直播demo"整合了Android Camera2 API、MediaCodec、OpenGLES和RTSP协议等多个关键组件,实现了从摄像头采集、美颜处理到实时流传输的完整流程。这个项目对于理解和掌握Android多媒体...

Global site tag (gtag.js) - Google Analytics