Android MJPEG Streaming App

今天要挑戰活化舊 Android 手機,充當 ip cam,當作寶寶監視器,以下為我的摸索過程,
一開始我找到的是 https://github.com/Teaonly/android-eye 這專案,把它編譯起來費了好大功夫,
還要編譯 x264,總之搞定後實測效果不好,
影像延遲很嚴重,慢了2-3秒,但我家 WiFi 是 5G,我並不覺得會慢到這樣。

後來想到之前寫過攝影機影像即時串流 MJPEG streaming 的 side project,便想找找看有沒有 MJPEG (Motion JPEG) streaming 的 Android App 開源專案,最後被我找到一個效果不錯的,是使用 MJPEG streaming 的 Android App
https://github.com/arktronic/cameraserve

後來便稍微研究一下如何在 Android 裡拿到 Camera 影像,以及轉換成 Jpeg 的程式碼流程,
實作 Camera.onPreviewFrame() Callback 並且註冊,之後將會得到預覽前的 frame,可以在這邊作你想要的處理,
關於 preview callback 這篇也講解的不錯,
在這個專案裡它是在 onPreviewFrame 裡將 YuvImage 影像直接轉成 Jpeg,

臨時要看 AOSP 原始碼可以使用 http://androidxref.com/ 網頁來看 Android 的原始碼,好處是它可以點擊函式名稱就可以跳至定義處,

YuvImage.java 裡面的 compressToJpeg 最後會呼叫 nativeCompressToJpeg
nativeCompressToJpeg的原始碼位置在 frameworks/base/core/jni/android/graphics/YuvToJpegEncoder.cpp

在網路上找專案用 android studio 開啟時時常用到 android gradle 版本批配問題,這邊列出官方的對應表

1
2
3
插件版本	所需的 Gradle 版本
4.1.0+ 6.5+
4.2.0+ 6.7.1+

其它參考
Android 系统Api YuvImage.compressToJpeg 存在native级别的内存泄漏_ChineseBoy_LY的博客-CSDN博客
https://blog.csdn.net/q979713444/article/details/80446404

其它相關文章推薦
Python Flask OpenCV 攝影機影像即時串流