Android實時監控專案第四篇:後臺執行緒傳送預覽幀視訊資料
還記得上篇提到的setPreviewCallback(Camera.PreviewCallback cb)函式嗎?我們在開始預覽幀視訊之前,呼叫的它,這裡要注意其內部的Camera.PreviewCallback型別的引數,我們需要寫一個類繼承Camera.PreviewCallback的類,在該類中覆寫public void onPreviewFrame(byte[] data, Camera camera)方法,這裡的data引數儲存的即是預覽幀是視訊資料,一旦程式呼叫Camera.PreviewCallback介面,便會自動呼叫發方法,因此當我們在開始預覽幀視訊之前呼叫setPreviewCallback(Camera.PreviewCallback cb)函式時,便會回撥該方法,理論上來說我們在這個方法中寫傳送幀視訊的程式碼就行了,但實際上我們並不能這麼做,因為傳送視訊資料是一個很耗時的操作,為了防止UI執行緒阻塞,我們需要另外開啟一個執行緒,在該執行緒中實現視訊的傳送操作。
這裡我們採用AsyncTask<Void, Void, Void>後臺執行緒,因此我們需要再寫一個類,繼承AsyncTask<Void, Void, Void>抽象類,並覆寫其中的protected Void doInBackground(Void... params)方法,在該方法中編寫傳送視訊資料的程式即可,這裡要注意形參的含義,因為的專案中不需要用到這三個引數,因此全部傳入Void,關於AsyncTask的詳細使用,可以參見這兩篇部落格:http://blog.csdn.net/ns_code/article/details/12889455和http://blog.csdn.net/liuhe688/article/details/6532519,我在該方法中寫的程式碼如下:
- //該方法執行在後臺執行緒中,主要負責執行耗時的後臺計算傳輸等工作,
- //實際的後臺操作被UI Thread呼叫時,該方法被回撥
- @Override
- protected Void doInBackground(Void... params) {
- //cam = (CameraActivity)context;
- Size size = cam.getCamera().getParameters().getPreviewSize();
- int wide = size.width;
- int high = size.height;
- YuvImage image = new YuvImage(data, ImageFormat.NV21, wide, high, null);
- //因為要實時處理視訊流,因此用記憶體操作流比較合適
- ByteArrayOutputStream os = new ByteArrayOutputStream(data.length);
- if(!image.compressToJpeg(new Rect(0, 0, wide, high), 100, os)){
- return null;
- }
- send(os);
- return null;
- }
這裡倒數第三行的send(os)記為傳送視訊的操作,當然,如果你是做其他的操作,而不是傳輸視訊資料,你也可以將其改為其他的函式,比如做街景檢測、人臉車牌識別等,而其他程式碼基本不用修改,傳送視訊的send方法基本就是按照TCP協議編寫,在JAVA中是用Socket類編寫客戶端的程式碼:
- //傳送視訊流到PC端,這裡傳遞過來的引數os中儲存的是視訊輸出流資料
- private void send(ByteArrayOutputStream os) {
- //定義用來儲存從輸入流中讀取的視訊流資料的byte陣列
- byte[] buffer = new byte[1024];
- try {
- Socket client = new Socket(ipName,30000);
- OutputStream outSocket = client.getOutputStream();
- //例項化記憶體輸入流,將視訊流資料寫入到記憶體中
- ByteArrayInputStream inputFromOs = new ByteArrayInputStream(os.toByteArray());
- //不斷從記憶體中讀取資料到buffer中,不斷再從buffer中將視訊資料傳送到outSocket流中
- int amount;
- while((amount =inputFromOs.read(buffer) ) != -1)
- outSocket.write(buffer, 0, amount);
- //這裡需要重新整理用到緩衝區的輸出流
- os.flush();
- inputFromOs.close();
- os.close();
- outSocket.close();
- } catch (UnknownHostException e) {
- e.printStackTrace();
- System.out.println("無法找到要連線的伺服器");
- } catch (IOException e) {
- e.printStackTrace();
- System.out.println("IO錯誤");
- }
- }
最後,什麼時候呼叫protected Void doInBackground(Void... params)方法呢?看了上面那兩篇部落格,應該也會明白了,當呼叫execute(Params... params)方法時,便會自動回撥該方法,從而執行其內部程式碼。
至此,整個專案的Android客戶端程式碼已經編寫完畢,下篇將講述PC端(亦即服務端)程式碼的實現
相關文章
- Android實時監控專案第三篇:通過攝像頭實時預覽幀視訊Android
- dotnet 後臺執行緒傳送 X11 視窗訊息執行緒
- 編碼:執行緒執行監控執行緒
- MSSQL資料庫後臺程式(執行緒)SQL資料庫執行緒
- 使用多執行緒實現郵件傳送執行緒
- Flutter上線專案實戰——圖片視訊預覽Flutter
- Spark+Kafka實時監控Oracle資料預警SparkKafkaOracle
- Java利用執行緒工廠監控執行緒池Java執行緒
- 通過micrometer實時監控執行緒池的各項指標執行緒指標
- android 主執行緒和子執行緒之間的訊息傳遞Android執行緒
- socet簡訊傳送與執行緒設計的問題執行緒
- 短視訊平臺搭建,圖片進行預覽上傳、刪除,讀取本地檔案
- 後臺執行緒(daemon)執行緒
- 正常執行時間監控
- 監控長時間執行的查詢(監控資料庫效能的SQL ) -- 轉資料庫SQL
- Java調優—Btrace監控Java執行緒/方法執行引數、執行時間(Windows)Java執行緒Windows
- 執行緒池監控2-監控執行緒池狀態、執行緒數量和佇列任務數量等執行緒佇列
- java--多執行緒之後臺執行緒Java執行緒
- Oracle“並行執行”——監控檢視Oracle並行
- Android後臺執行緒輪詢伺服器獲取推送訊息Android執行緒伺服器
- Android專案實踐——簡訊傳送介面的封裝與設計Android封裝
- RestCloud監控平臺,專為微服務API打造的實時監控中心RESTCloud微服務API
- Android執行緒池的原理以及專案中實踐Android執行緒
- 實時檔案監控
- 請問如何實現兩個執行緒彼此監控?執行緒
- ionic3最小化並且監控到前臺執行和後臺執行
- JAMon監控SQL執行時間SQL
- 小飛魚開發 做一個定時監控資料傳送微信訊息的定時任務功能(圖文)
- vue專案上傳Github預覽VueGithub
- Golang原始碼學習:監控執行緒Golang原始碼執行緒
- iOS執行緒生命週期的監控iOS執行緒
- 武漢公安民生服務平臺資料安全監控專案
- Linux scp 後臺執行傳輸檔案Linux
- 03—執行時資料區概述及執行緒執行緒
- Android中後臺的服務和多執行緒Android執行緒
- 短視訊平臺開發,圖片上傳和圖片預覽功能實現
- sar效能監視命令-實時監控CPU
- Android執行緒間通訊Android執行緒