Commit b4c399e3 authored by 马乐's avatar 马乐

1.增加3张拍照

2.增加10s视频录制
parent 1b04ad55
package com.intergration.test
import android.app.Application
import com.blankj.utilcode.util.CrashUtils
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.Utils
class DmsApp: Application() {
override fun onCreate() {
super.onCreate()
Utils.init(this)
CrashUtils.init()
LogUtils.getConfig().globalTag = "dms"
}
}
\ No newline at end of file
......@@ -2,16 +2,21 @@ package com.intergration.test
import android.Manifest
import android.content.pm.PackageManager
import android.media.CamcorderProfile
import android.os.Bundle
import android.os.Environment
import android.util.Size
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.arcsoft.visdrive.sdk.ArcErrorInfo
import com.arcsoft.visdrive.sdk.ArcVisDriveEngine
import com.arcsoft.visdrive.sdk.constant.common.ArcModType
import com.arcsoft.visdrive.sdk.model.common.ArcActiveEnvParam
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.TimeUtils
import com.intergration.test.databinding.ActivityMainBinding
import com.intergration.test.dms.CAMERA_ID_DMS
import com.intergration.test.dms.COROUTINE_DMS
......@@ -23,15 +28,23 @@ import com.intergration.test.dms.setDmsAlarmParams
import com.intergration.test.dms.setDmsDistractScope
import com.intergration.test.dms.setDmsDrivingStatus
import com.intergration.test.dms.startDms
import com.intergration.test.utils.DOT_PREFACE_DURATION
import com.intergration.test.utils.VIDEO_FOLDER
import com.mediatek.smartplatform.PreviewSource
import com.mediatek.smartplatform.RecordConfiguration
import com.mediatek.smartplatform.RecordSource
import com.mediatek.smartplatform.SmartPlatformManager
import com.mediatek.smartplatform.SpmCameraDevice
import com.mediatek.smartplatform.SpmCameraDevice.VideoCallback
import com.mediatek.smartplatform.VideoInfoMap
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.util.concurrent.CancellationException
class MainActivity : AppCompatActivity() {
class MainActivity : AppCompatActivity(),VideoCallback{
private var dmsCoroutineScope: DmsCoroutineScope? =null
......@@ -41,6 +54,12 @@ class MainActivity : AppCompatActivity() {
SmartPlatformManager.get()
}
private val recordConfiguration = RecordConfiguration.get(RecordSource.GENERAL_CAMERA).apply {
mCamcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P)
mOutPutFilePath = VIDEO_FOLDER
mVideoCycleDeleteFileNum = 3
}
private var dmsJob:Job? = null
private val requestCameraPermission = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()){ granted->
......@@ -54,12 +73,8 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
if (ActivityCompat.checkSelfPermission(
baseContext,
Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
) {
requestCameraPermission.launch(arrayOf(Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE))
if (!allPermissionsGranted()) {
requestCameraPermission.launch(REQUIRED_PERMISSIONS)
}
binding.startDms.setOnClickListener {
if (dmsCoroutineScope == null) {
......@@ -69,11 +84,14 @@ class MainActivity : AppCompatActivity() {
)
}
dmsJob = dmsCoroutineScope?.launch {
LogUtils.dTag("dms","startDms")
LogUtils.d("startDms")
try {
coroutineContext[DmsCoroutineContext]?.spmCameraDevice?.setPreviewSurface(binding.dmsPreview.holder.surface,
PreviewSource.GENERAL_CAMERA_EX)
PreviewSource.GENERAL_CAMERA)
coroutineContext[DmsCoroutineContext]?.spmCameraDevice?.startPreview()
recordConfiguration.mLockFileNamePrefix = "dms"
recordConfiguration.mVideoCallback = this@MainActivity
coroutineContext[DmsCoroutineContext]?.spmCameraDevice?.startRecord(RecordSource.GENERAL_CAMERA,recordConfiguration)
var result = ArcVisDriveEngine.activate(APP_ID, APP_SECRET, arrayOf(ArcModType.TYPE_DMS,ArcModType.TYPE_FR),
ArcActiveEnvParam().apply {
this.IMEI = DEVICE_IMEI
......@@ -99,6 +117,19 @@ class MainActivity : AppCompatActivity() {
coroutineContext[DmsCoroutineContext]?.engine?.let {engine->
coroutineContext[DmsCoroutineContext]?.spmCameraDevice?.startDms(engine)?.collect{result->
binding.detectResult.text = result
launch(Dispatchers.IO){
coroutineContext[DmsCoroutineContext]?.spmCameraDevice?.lockRecordingVideo(
DOT_PREFACE_DURATION,"",RecordSource.GENERAL_CAMERA)
}
launch(Dispatchers.IO) {
repeat(3){
coroutineContext[DmsCoroutineContext]?.spmCameraDevice?.takePicture(
"${Environment.getExternalStorageDirectory().path}/waytous/alarm/dms-${TimeUtils.millis2String(System.currentTimeMillis(),"yyyyMMddHHmmss")}.jpg",
{ }, { i, s, s2 -> }
)
delay(1000)
}
}
}
}
} catch (e: CancellationException) {
......@@ -121,10 +152,50 @@ class MainActivity : AppCompatActivity() {
}
}
override fun onVideoTaken(videoInfo: VideoInfoMap?) {
when(videoInfo?.getInt(VideoInfoMap.KEY_RECORDER_EVENT_TYPE)){
VideoCallback.VIDEO_EVENT_SDCARD_FULL-> {
LogUtils.e("SDCard已满")
smartPlatformManager.openCameraDevice(CAMERA_ID_DMS).stopRecord(RecordSource.GENERAL_CAMERA)
}
VideoCallback.VIDEO_EVENT_RECORD_SDCARD_DAMAGED-> {
LogUtils.e("SDCard损坏")
smartPlatformManager.openCameraDevice(CAMERA_ID_DMS).stopRecord(RecordSource.GENERAL_CAMERA)
}
VideoCallback.VIDEO_EVENT_RECORD_RECORDING_ERROR-> {
LogUtils.e("录制视频过程中发生错误")
smartPlatformManager.openCameraDevice(CAMERA_ID_DMS).stopRecord(RecordSource.GENERAL_CAMERA)
}
VideoCallback.VIDEO_EVENT_KEYPOINT_STOP ->{
LogUtils.d("录制打点视频结束")
}
}
}
override fun onVideoFrame(p0: ByteArray?, p1: Int, p2: Int, p3: String?, p4: Int) {
}
private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {
ContextCompat.checkSelfPermission(
baseContext, it) == PackageManager.PERMISSION_GRANTED
}
companion object{
const val TAG = "dms"
const val APP_ID = "vdpoYwdwW15s8seKveftWJfsarrre9"
const val APP_SECRET = "dCdVvhH6tqgWuPMpsvuihPQDHkssWi"
const val DEVICE_IMEI = "d5e2f07694f674c4"
private val REQUIRED_PERMISSIONS =
mutableListOf (
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_WIFI_STATE,
Manifest.permission.CHANGE_WIFI_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
).toTypedArray()
}
}
\ No newline at end of file
......@@ -9,7 +9,6 @@ import com.arcsoft.visdrive.sdk.constant.common.ArcModType
import com.arcsoft.visdrive.sdk.constant.dms.ArcDMSAlarmType
import com.arcsoft.visdrive.sdk.constant.dms.ArcDMSDetectMaskType
import com.arcsoft.visdrive.sdk.model.common.ArcDrivingStatus
import com.arcsoft.visdrive.sdk.model.common.ArcImportLicenseInfo
import com.arcsoft.visdrive.sdk.model.common.ArcInitParamInfo
import com.arcsoft.visdrive.sdk.model.common.ArcInitParamInfoDetail
import com.arcsoft.visdrive.sdk.model.dms.ArcDMSAlarmParam
......@@ -18,6 +17,8 @@ import com.arcsoft.visdrive.sdk.model.dms.ArcDMSDistractScope
import com.arcsoft.visdrive.sdk.model.dms.ArcDMSInitParam
import com.blankj.utilcode.util.FileUtils
import com.blankj.utilcode.util.LogUtils
import com.intergration.test.utils.DMS_PIC_HEIGHT
import com.intergration.test.utils.DMS_PIC_WIDTH
import com.intergration.test.utils.toByteBuffer
import com.mediatek.smartplatform.ImageReaderEx
import com.mediatek.smartplatform.PictureConfiguration
......@@ -26,28 +27,18 @@ import com.mediatek.smartplatform.SmartPlatformManager
import com.mediatek.smartplatform.SpmCameraDevice
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.channels.produce
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.launch
import java.io.Closeable
import java.io.File
import java.nio.ByteBuffer
import java.util.concurrent.Executors
import kotlin.coroutines.AbstractCoroutineContextElement
import kotlin.coroutines.CoroutineContext
val COROUTINE_DMS = CoroutineName("dms")
const val DMS_PIC_WIDTH = 1280
const val DMS_PIC_HEIGHT = 720
const val CAMERA_ID_DMS = "0"
val dmsResult by lazy {
......@@ -127,12 +118,12 @@ fun ArcVisDriveEngine.setDmsDrivingStatus(speed:Int = 50):Int{
}
fun SpmCameraDevice.startDms(engin:ArcVisDriveEngine) = callbackFlow{
val frDir = File(Environment.getExternalStorageDirectory(),"dms/")
if (!FileUtils.isFileExists(frDir)) {
FileUtils.createOrExistsDir(frDir)
val dmsDir = File(Environment.getExternalStorageDirectory(),"dms/")
if (!FileUtils.isFileExists(dmsDir)) {
FileUtils.createOrExistsDir(dmsDir)
}
val pictureConfig = PictureConfiguration.get(PictureSequenceSource.GENERAL_CAMERA)
pictureConfig.mPath = frDir.absolutePath
pictureConfig.mPath = dmsDir.absolutePath
pictureConfig.mImageFormat = SpmCameraDevice.ImageDataCallback.IMAGE_FORMAT_NV21
pictureConfig.mPicWidth = DMS_PIC_WIDTH
pictureConfig.mPicHeight = DMS_PIC_HEIGHT
......@@ -192,6 +183,7 @@ fun SpmCameraDevice.startDms(engin:ArcVisDriveEngine) = callbackFlow{
startPictureSequence(PictureSequenceSource.GENERAL_CAMERA,pictureConfig)
awaitClose {
LogUtils.dTag("dms","dms detect ended")
stopPictureSequence(PictureSequenceSource.GENERAL_CAMERA)
engin.unInit()
}
}
\ No newline at end of file
package com.intergration.test.utils
import com.blankj.utilcode.util.LogUtils
import com.mediatek.smartplatform.RecordConfiguration
import com.mediatek.smartplatform.RecordSource
import com.mediatek.smartplatform.SpmCameraDevice
import com.mediatek.smartplatform.VideoInfoMap
import java.nio.ByteBuffer
const val DMS_PIC_WIDTH = 1280
const val DMS_PIC_HEIGHT = 720
const val DOT_PREFACE_DURATION = 5
const val VIDEO_FOLDER = "sdcard/waytous/alarm/"
fun SpmCameraDevice.recordVideo(prefix:String){
val recordConfiguration = RecordConfiguration.get(RecordSource.GENERAL_CAMERA).apply {
mLockFileNamePrefix = prefix
mOutPutFilePath = VIDEO_FOLDER
mVideoCycleDeleteFileNum = 3
}
recordConfiguration.mVideoCallback = object: SpmCameraDevice.VideoCallback {
override fun onVideoTaken(videoInfo: VideoInfoMap?) {
when(videoInfo?.getInt(VideoInfoMap.KEY_RECORDER_EVENT_TYPE)){
SpmCameraDevice.VideoCallback.VIDEO_EVENT_SDCARD_FULL-> LogUtils.e("SDCard已满")
SpmCameraDevice.VideoCallback.VIDEO_EVENT_RECORD_SDCARD_DAMAGED-> LogUtils.e("SDCard损坏")
SpmCameraDevice.VideoCallback.VIDEO_EVENT_RECORD_RECORDING_ERROR-> LogUtils.e("录制视频过程中发生错误")
}
stopRecord(RecordSource.GENERAL_CAMERA)
}
override fun onVideoFrame(p0: ByteArray?, p1: Int, p2: Int, p3: String?, p4: Int) {
}
}
startRecord(RecordSource.GENERAL_CAMERA,recordConfiguration)
}
fun ByteArray.toByteBuffer():ByteBuffer{
val buffer = ByteBuffer.allocateDirect(size).also {
it.put(this)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment