desc:yuv添加水印方式
parent
4738d911a3
commit
449ca7b28e
@ -1,92 +1,65 @@
|
|||||||
package com.yinuo.safetywatcher.watcher.utils
|
package com.yinuo.safetywatcher.watcher.utils
|
||||||
|
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.opengl.EGL14
|
import android.view.TextureView
|
||||||
import android.os.Handler
|
import com.common.commonlib.utils.LogUtils
|
||||||
import android.os.HandlerThread
|
import com.yinuo.library.vlc.encoder.MediaCodecManager
|
||||||
import android.view.PixelCopy
|
|
||||||
import android.view.PixelCopy.OnPixelCopyFinishedListener
|
|
||||||
import android.view.SurfaceView
|
|
||||||
import com.common.commonlib.CommonApplication
|
|
||||||
import com.common.commonlib.utils.BitmapUtils
|
|
||||||
import com.yinuo.library.vlc.encoder.BaseMovieEncoder.EncoderConfig
|
|
||||||
import com.yinuo.library.vlc.encoder.MovieEncoder1
|
|
||||||
import org.easydarwin.TxtOverlay
|
import org.easydarwin.TxtOverlay
|
||||||
import java.nio.ByteBuffer
|
|
||||||
|
|
||||||
|
|
||||||
object RecordHelper {
|
object RecordHelper {
|
||||||
private val mVideoEncoder: MovieEncoder1
|
private val codecManager: MediaCodecManager = MediaCodecManager.getInstance()
|
||||||
private const val width = 1920
|
private const val width = 1920
|
||||||
private const val height = 1080
|
private const val height = 1080
|
||||||
|
private var recording = false;
|
||||||
val utils by lazy {
|
|
||||||
NV21ToBitmap(CommonApplication.getContext())
|
|
||||||
}
|
|
||||||
|
|
||||||
private val workHandler by lazy {
|
|
||||||
val mHandlerThread = HandlerThread("recordAndEncode")
|
|
||||||
mHandlerThread.start()
|
|
||||||
Handler(mHandlerThread.looper)
|
|
||||||
}
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
mVideoEncoder = MovieEncoder1(CommonApplication.getContext(), width, height, true)
|
codecManager.initCodecManager(width, height, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onFrameAvailable(view: SurfaceView) {
|
fun onFrameAvailable(view: TextureView, nv12Data: ByteArray) {
|
||||||
if (!mVideoEncoder.isRecording) {
|
if (!recording) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// workHandler.post {
|
LogUtils.w("onI420Data 11111")
|
||||||
// val nanoTime = System.nanoTime()
|
|
||||||
// var bitmap = view.bitmap
|
|
||||||
// bitmap?.let {
|
|
||||||
// val overLayBitmap: Bitmap? = TxtOverlay.getOverlayBitmap()
|
|
||||||
// overLayBitmap?.let {
|
|
||||||
// bitmap = BitmapUtils.mergeBitmap(bitmap!!, overLayBitmap)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// val buffer = ByteBuffer.allocate(bitmap!!.getByteCount())
|
|
||||||
// bitmap!!.copyPixelsToBuffer(buffer)
|
|
||||||
// bitmap!!.recycle()
|
|
||||||
// mVideoEncoder.frameAvailable(buffer.array(), nanoTime)
|
|
||||||
// }
|
|
||||||
workHandler.post {
|
|
||||||
var bitmap = Bitmap.createBitmap(
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
Bitmap.Config.ARGB_8888
|
|
||||||
)
|
|
||||||
PixelCopy.request(
|
|
||||||
view.holder.surface, bitmap, { copyResult ->
|
|
||||||
val nanoTime = System.nanoTime()
|
|
||||||
if (copyResult == PixelCopy.SUCCESS) {
|
|
||||||
bitmap?.let {
|
|
||||||
val overLayBitmap: Bitmap? = TxtOverlay.getOverlayBitmap()
|
val overLayBitmap: Bitmap? = TxtOverlay.getOverlayBitmap()
|
||||||
overLayBitmap?.let {
|
overLayBitmap?.let {
|
||||||
bitmap = BitmapUtils.mergeBitmap(bitmap!!, overLayBitmap)
|
val yuv = TxtOverlay.getOverlayYuv()
|
||||||
|
yuv?.let {
|
||||||
|
for ((j, i) in (100 until overLayBitmap.height + 100).withIndex()) {
|
||||||
|
for (c in 0 until overLayBitmap.width) {
|
||||||
|
//去掉PNG水印的黑边
|
||||||
|
if (yuv[j * overLayBitmap.width + c]
|
||||||
|
.toInt() != 0x10 && yuv[j * overLayBitmap.width + c]
|
||||||
|
.toInt() != 0x80 && yuv[j * overLayBitmap.width + c].toInt() != 0xeb
|
||||||
|
) {
|
||||||
|
System.arraycopy(
|
||||||
|
yuv,
|
||||||
|
j * overLayBitmap.width + c,
|
||||||
|
nv12Data,
|
||||||
|
100 + i * 1920 + c,
|
||||||
|
1
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val buffer = ByteBuffer.allocate(bitmap!!.byteCount)
|
|
||||||
bitmap!!.copyPixelsToBuffer(buffer)
|
|
||||||
bitmap!!.recycle()
|
|
||||||
mVideoEncoder.frameAvailable(buffer.array(), nanoTime)
|
|
||||||
}
|
}
|
||||||
}, workHandler
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
codecManager.addFrameData(nv12Data)
|
||||||
|
LogUtils.w("onI420Data 44444")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun startRecording() {
|
fun startRecording() {
|
||||||
if (!mVideoEncoder.isRecording) {
|
if (!recording) {
|
||||||
mVideoEncoder.startRecording(EncoderConfig(EGL14.eglGetCurrentContext()))
|
recording = true
|
||||||
|
codecManager.startMediaCodec()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun stopRecording() {
|
fun stopRecording() {
|
||||||
if (mVideoEncoder.isRecording) {
|
if (recording) {
|
||||||
mVideoEncoder.stopRecording()
|
recording = false
|
||||||
|
codecManager.pauseMediaCodec()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue