From b4b896bc3ab4c43072c57674f7cb4c00db485240 Mon Sep 17 00:00:00 2001 From: xiaowusky Date: Sat, 7 Oct 2023 09:38:39 +0800 Subject: [PATCH] =?UTF-8?q?desc:record=E3=80=81push=E4=BB=A3=E7=A0=81=20?= =?UTF-8?q?=20=20=E6=96=B9=E5=BC=8F2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../safetywatcher/watcher/ui/HomeActivity.kt | 47 ++++++++++++---- .../watcher/utils/RecordHelper.kt | 54 ++++++++++++++----- app/src/main/res/layout/activity_home.xml | 2 +- .../easydarwin/video/EasyPlayerClient.java | 4 ++ 4 files changed, 83 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt index cf42614..46ab4bb 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/ui/HomeActivity.kt @@ -3,6 +3,8 @@ package com.yinuo.safetywatcher.watcher.ui import android.content.Intent import android.os.Build import android.os.Process +import android.view.SurfaceHolder +import android.view.SurfaceHolder.Callback import android.view.View import androidx.annotation.RequiresApi import androidx.lifecycle.lifecycleScope @@ -101,16 +103,33 @@ class HomeActivity : NoOptionsActivity() { * 设置摄像头 */ private fun setForCamera() { - mClient = EasyPlayerClient(this@HomeActivity, mBinding.surface, null) { - RecordHelper.onFrameAvailable(mBinding.surface) - if (!AppData.hasCameraData()) { - AppData.setCameraData(true) - changeViewStatus() - closeLoadingDialog() + mBinding.surface.holder.addCallback(object : Callback{ + override fun surfaceCreated(holder: SurfaceHolder) { + mClient = EasyPlayerClient(this@HomeActivity, mBinding.surface.holder.surface, null) { + RecordHelper.onFrameAvailable(mBinding.surface) + if (!AppData.hasCameraData()) { + AppData.setCameraData(true) + changeViewStatus() + closeLoadingDialog() + } + watchCamera(DELAY_TIME_CHECK_CAMERA) + } + mClient?.play(CAMERA_URL) } - watchCamera(DELAY_TIME_CHECK_CAMERA) - } - mClient?.play(CAMERA_URL) + + override fun surfaceChanged( + holder: SurfaceHolder, + format: Int, + width: Int, + height: Int + ) { + } + + override fun surfaceDestroyed(holder: SurfaceHolder) { + mClient?.stop() + } + + }) // 第一次很慢,所以10秒 watchCamera(DELAY_TIME_OPEN_CAMERA) showLoadingDialog(R.string.connecting_camera) @@ -250,4 +269,14 @@ class HomeActivity : NoOptionsActivity() { warnDialog?.dismiss() Process.killProcess(Process.myPid()) } + + override fun onPause() { + super.onPause() + mClient?.pause() + } + + override fun onResume() { + super.onResume() + mClient?.resume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/RecordHelper.kt b/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/RecordHelper.kt index 3fecc41..54f735b 100644 --- a/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/RecordHelper.kt +++ b/app/src/main/java/com/yinuo/safetywatcher/watcher/utils/RecordHelper.kt @@ -4,7 +4,9 @@ import android.graphics.Bitmap import android.opengl.EGL14 import android.os.Handler import android.os.HandlerThread -import android.view.TextureView +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 @@ -32,23 +34,47 @@ object RecordHelper { mVideoEncoder = MovieEncoder1(CommonApplication.getContext(), width, height, true) } - fun onFrameAvailable(view: TextureView) { + fun onFrameAvailable(view: SurfaceView) { if (!mVideoEncoder.isRecording) { return } +// workHandler.post { +// 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 { - 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) + 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() + overLayBitmap?.let { + bitmap = BitmapUtils.mergeBitmap(bitmap!!, overLayBitmap) + } + } + val buffer = ByteBuffer.allocate(bitmap!!.byteCount) + bitmap!!.copyPixelsToBuffer(buffer) + bitmap!!.recycle() + mVideoEncoder.frameAvailable(buffer.array(), nanoTime) + } + }, workHandler + ) } } diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 59a991c..99a54f8 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -3,7 +3,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - diff --git a/library-rtsp/src/main/java/org/easydarwin/video/EasyPlayerClient.java b/library-rtsp/src/main/java/org/easydarwin/video/EasyPlayerClient.java index 8199529..f62c02b 100644 --- a/library-rtsp/src/main/java/org/easydarwin/video/EasyPlayerClient.java +++ b/library-rtsp/src/main/java/org/easydarwin/video/EasyPlayerClient.java @@ -378,6 +378,10 @@ public class EasyPlayerClient implements Client.SourceCallBack { * @return */ public void play(final String url) { + if (lifecycler == null){ + start(url, TRANSTYPE_TCP, 0, Client.EASY_SDK_VIDEO_FRAME_FLAG | Client.EASY_SDK_AUDIO_FRAME_FLAG, "", "", null); + return; + } if (lifecycler.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.CREATED)) { start(url, TRANSTYPE_TCP, 0, Client.EASY_SDK_VIDEO_FRAME_FLAG | Client.EASY_SDK_AUDIO_FRAME_FLAG, "", "", null); } else {