浮水印 WaterMark
浮水印最簡易的用途就在影片加入錄製時的時間。MediaMuxer 可以加入視軌,音軌及字幕軌,所以很容易讓人聯想到把時間加到字幕軌。但字幕的資訊很耗人力編輯,需記載起始時間及結束時間,然後在這段時間加入要顯示的文字,最後儲存成 srt 檔案(其實就是一般的文字檔)。所以想在影片中加入時間,字幕軌是行不通的。
最佳的解決方案就是在 imageAnalysis 產生 YUV 圖像時(A 圖),手動繪製一張有目前時間的 Bitmap 圖像,然後把 Bitmap 轉成 YUV格式 (B 圖),然後把 B 圖合併到 A 圖中,最後再將 A 圖送入編碼器中。
效能
產生有繪製時間的 Bitmap 大小約為 350*36 = 12,600個像素。將1萬多個像素轉成 YUV 再加入影片的 YUV 圖像中,對目前的手機而言是不費吹灰之力的,效能非常的高。
RGBA_8888
在相機的 ImageAnalysis 設定裏,可以指定輸出格式為 RGBA_8888,如下
val imageAnalysis= ImageAnalysis.Builder()
.setTargetResolution(Size(width,height))
//產生 RGBA 格式,可以直接儲存成 bitmap
.setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_RGBA_8888)
//.setOutputImageFormat(ImageAnalysis.OUTPUT_IMAGE_FORMAT_YUV_420_888)
.build()
此法在 setAnalyzer 中,只會產生 it.planes[0].buffer 的資訊,裏面其實就是 Bitmap 的格式,然後再把文字寫入 Bitmap,確實方便很多。
但是進行編碼時,雖說 MediaCodec 的 Key_COLOR_FORMAT 也能設定成
MediaCodecInfo.CodecCapabilities.COLOR_Format24bitBGR888
但經本人測試就是編不成功,只能吃 YUV 格式。因為必需把 1920*1080 = 2,073,600 個值轉成 YUV,非常耗時,所以不建議。
MahalCameraX 修改
加入浮水印要修改 MahalCameraX 類別中 startRecordVideo() 藍色部份
