基於android的遠程視頻監控系統——實現Camera預覽

來源:互聯網
上載者:User

如標題所述,學習如何開啟網路攝影機,並在螢幕上預覽映像。使用Camera的步驟:
(1)調用Camera的open()方法開啟相機;
(2)調用Camera的getParameters()方法擷取拍照參數,該方法返回一個Camera.Parameters對象;
(3)調用Camera的setParameters()方法//android2.3.3以後無需此步;
(4)調用Camera的startPreview()方法開始預覽取景,在預覽取景之前需要調用Camera的setPreviewDisplay(SurfaceHolder holder)方法設定使用哪個surfaceview來顯示取景圖片;
(5)結束程式時,調用Camera的stopPreview()結束取景預覽,並調用release()方法釋放資源。
以上過程參考《瘋狂android講義》,這本書確實不錯,能夠快速入門。整個系統大部分架構是參考此書的,部分問題在網上搜的資料。

1.在AndroidManifest.xml檔案中添加camera的許可權

    <!-- 授予程式使用網路攝影機的許可權 -->        <uses-permission android:name="android.permission.CAMERA" />         <uses-feature android:name="android.hardware.camera" />         <uses-feature android:name="android.hardware.camera.autofocus" />

2.在介面布局檔案中添加一個surfaceview用於顯示預覽圖片

<SurfaceView        android:id="@+id/sView"        android:layout_width="fill_parent"         android:layout_height="fill_parent"        />

3.程式主體
在這裡我們定義了一個SurfaceView變數sView用於擷取布局檔案中定義的SurfaceView組件。關於SurfaceView的基本問題,論壇上http://www.apkbus.com/android-43293-1-1.html這個文章講的蠻好的。
我們在SurfaceView被建立時調用initcamera()初始化網路攝影機,在SurfaceView被銷毀時釋放網路攝影機。而這兩個時間是通過surfaceHolder.addCallback得到的,看看下面代碼就明白了。

public class MainActivity extends Activity {        SurfaceView sView;        SurfaceHolder surfaceHolder;        int screenWidth, screenHeight;        // 定義系統所用的照相機        Camera camera;        //是否在瀏覽中        boolean isPreview = false;    @Override        public void onCreate(Bundle savedInstanceState)        {                super.onCreate(savedInstanceState);                // 設定全屏                requestWindowFeature(Window.FEATURE_NO_TITLE);                getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                        WindowManager.LayoutParams.FLAG_FULLSCREEN);                setContentView(R.layout.activity_main);                WindowManager wm = (WindowManager) getSystemService(                        Context.WINDOW_SERVICE);                Display display = wm.getDefaultDisplay();                // 擷取螢幕的寬和高                screenWidth = display.getWidth();                screenHeight = display.getHeight();                // 擷取介面中SurfaceView組件                sView = (SurfaceView) findViewById(R.id.sView);                // 獲得SurfaceView的SurfaceHolder                surfaceHolder = sView.getHolder();                // 為surfaceHolder添加一個回調監聽器                surfaceHolder.addCallback(new Callback()                {                        @Override                        public void surfaceChanged(SurfaceHolder holder, int format, int width,                                int height)                        {                        }                        @Override                        public void surfaceCreated(SurfaceHolder holder)                        {                                // 開啟網路攝影機                                initCamera();                        }                        @Override                        public void surfaceDestroyed(SurfaceHolder holder)                        {                                // 如果camera不為null ,釋放網路攝影機                                if (camera != null)                                {                                        if (isPreview)                                                camera.stopPreview();                                        camera.release();                                        camera = null;                                }                        }                                });                // 設定該SurfaceView自己不維護緩衝                    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        }        private void initCamera()        {                if (!isPreview)                {                        camera = Camera.open();                }                if (camera != null && !isPreview)                {                        try                        {                                Camera.Parameters parameters = camera.getParameters();                                // 設定預覽照片的大小                                parameters.setPreviewSize(screenWidth, screenHeight);                                // 每秒顯示4幀                                parameters.setPreviewFrameRate(4);                                // 設定圖片格式                                parameters.setPictureFormat(PixelFormat.JPEG);                                // 設定JPG照片的品質                                parameters.set("jpeg-quality", 85);                                //設定照片的大小                                parameters.setPictureSize(screenWidth, screenHeight);                                //android2.3.3以後無需下步                                //camera.setParameters(parameters);                                //通過SurfaceView顯示取景畫面                                camera.setPreviewDisplay(surfaceHolder);                                // 開始預覽                                camera.startPreview();                                // 自動對焦                                camera.autoFocus(null);                        }                        catch (Exception e)                        {                                e.printStackTrace();                        }                        isPreview = true;                }        }    }

  就這樣你就可以使用網路攝影機預覽了。當然你會發現預覽的映像轉了90度,方向不對。我們在AndroidManifest.xml檔案的activity屬性設定中添加

android:screenOrientation="landscape"

  設定成橫屏就OK了。如果黑屏請檢查camera.setParameters(parameters);這步是否與自己系統匹配,2.3.3以後是不須此步的。
就這樣簡單,我們就完成了無線視頻監控的第一步,實現了網路攝影機映像的預覽。在這裡我們設定了預覽但是卻沒有對每幀映像資料進行處理,下次將講如何獲得網路攝影機的每一幀映像以及如何處理。

下面是sdk2.3.3下的源碼,在我android4.04系統的手機上也能運行。由於android開發工具的升級,這個源碼包跟以前版本有所不同,不知道和舊版本是否有衝突。如過不行大家建立個工程,再把3個關鍵檔案的內容複寫過去應該沒問題。

 源碼下載:http://files.cnblogs.com/feifei1010/CameraPreview.rar

另附:

歡迎大家關注微博:http://e.weibo.com/u/2975543812

#安卓巴士#寫部落格活動繼續進行中,想要米2&魅族MX的童鞋們抓緊參與咯~還有可愛的小海豚、優盤、書籍獎勵哦~~

詳見http://www.apkbus.com/android-64183-1-1.html

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.