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 ...@@ -2,16 +2,21 @@ package com.intergration.test
import android.Manifest import android.Manifest
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.media.CamcorderProfile
import android.os.Bundle import android.os.Bundle
import android.os.Environment
import android.util.Size
import android.widget.Toast import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.arcsoft.visdrive.sdk.ArcErrorInfo import com.arcsoft.visdrive.sdk.ArcErrorInfo
import com.arcsoft.visdrive.sdk.ArcVisDriveEngine import com.arcsoft.visdrive.sdk.ArcVisDriveEngine
import com.arcsoft.visdrive.sdk.constant.common.ArcModType import com.arcsoft.visdrive.sdk.constant.common.ArcModType
import com.arcsoft.visdrive.sdk.model.common.ArcActiveEnvParam import com.arcsoft.visdrive.sdk.model.common.ArcActiveEnvParam
import com.blankj.utilcode.util.LogUtils import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.TimeUtils
import com.intergration.test.databinding.ActivityMainBinding import com.intergration.test.databinding.ActivityMainBinding
import com.intergration.test.dms.CAMERA_ID_DMS import com.intergration.test.dms.CAMERA_ID_DMS
import com.intergration.test.dms.COROUTINE_DMS import com.intergration.test.dms.COROUTINE_DMS
...@@ -23,15 +28,23 @@ import com.intergration.test.dms.setDmsAlarmParams ...@@ -23,15 +28,23 @@ import com.intergration.test.dms.setDmsAlarmParams
import com.intergration.test.dms.setDmsDistractScope import com.intergration.test.dms.setDmsDistractScope
import com.intergration.test.dms.setDmsDrivingStatus import com.intergration.test.dms.setDmsDrivingStatus
import com.intergration.test.dms.startDms 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.PreviewSource
import com.mediatek.smartplatform.RecordConfiguration
import com.mediatek.smartplatform.RecordSource
import com.mediatek.smartplatform.SmartPlatformManager 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.Dispatchers
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.concurrent.CancellationException import java.util.concurrent.CancellationException
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity(),VideoCallback{
private var dmsCoroutineScope: DmsCoroutineScope? =null private var dmsCoroutineScope: DmsCoroutineScope? =null
...@@ -41,6 +54,12 @@ class MainActivity : AppCompatActivity() { ...@@ -41,6 +54,12 @@ class MainActivity : AppCompatActivity() {
SmartPlatformManager.get() 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 var dmsJob:Job? = null
private val requestCameraPermission = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()){ granted-> private val requestCameraPermission = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()){ granted->
...@@ -54,12 +73,8 @@ class MainActivity : AppCompatActivity() { ...@@ -54,12 +73,8 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
if (ActivityCompat.checkSelfPermission( if (!allPermissionsGranted()) {
baseContext, requestCameraPermission.launch(REQUIRED_PERMISSIONS)
Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
) {
requestCameraPermission.launch(arrayOf(Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE))
} }
binding.startDms.setOnClickListener { binding.startDms.setOnClickListener {
if (dmsCoroutineScope == null) { if (dmsCoroutineScope == null) {
...@@ -69,11 +84,14 @@ class MainActivity : AppCompatActivity() { ...@@ -69,11 +84,14 @@ class MainActivity : AppCompatActivity() {
) )
} }
dmsJob = dmsCoroutineScope?.launch { dmsJob = dmsCoroutineScope?.launch {
LogUtils.dTag("dms","startDms") LogUtils.d("startDms")
try { try {
coroutineContext[DmsCoroutineContext]?.spmCameraDevice?.setPreviewSurface(binding.dmsPreview.holder.surface, coroutineContext[DmsCoroutineContext]?.spmCameraDevice?.setPreviewSurface(binding.dmsPreview.holder.surface,
PreviewSource.GENERAL_CAMERA_EX) PreviewSource.GENERAL_CAMERA)
coroutineContext[DmsCoroutineContext]?.spmCameraDevice?.startPreview() 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), var result = ArcVisDriveEngine.activate(APP_ID, APP_SECRET, arrayOf(ArcModType.TYPE_DMS,ArcModType.TYPE_FR),
ArcActiveEnvParam().apply { ArcActiveEnvParam().apply {
this.IMEI = DEVICE_IMEI this.IMEI = DEVICE_IMEI
...@@ -99,6 +117,19 @@ class MainActivity : AppCompatActivity() { ...@@ -99,6 +117,19 @@ class MainActivity : AppCompatActivity() {
coroutineContext[DmsCoroutineContext]?.engine?.let {engine-> coroutineContext[DmsCoroutineContext]?.engine?.let {engine->
coroutineContext[DmsCoroutineContext]?.spmCameraDevice?.startDms(engine)?.collect{result-> coroutineContext[DmsCoroutineContext]?.spmCameraDevice?.startDms(engine)?.collect{result->
binding.detectResult.text = 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) { } catch (e: CancellationException) {
...@@ -121,10 +152,50 @@ class MainActivity : AppCompatActivity() { ...@@ -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{ companion object{
const val TAG = "dms" const val TAG = "dms"
const val APP_ID = "vdpoYwdwW15s8seKveftWJfsarrre9" const val APP_ID = "vdpoYwdwW15s8seKveftWJfsarrre9"
const val APP_SECRET = "dCdVvhH6tqgWuPMpsvuihPQDHkssWi" const val APP_SECRET = "dCdVvhH6tqgWuPMpsvuihPQDHkssWi"
const val DEVICE_IMEI = "d5e2f07694f674c4" 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 ...@@ -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.ArcDMSAlarmType
import com.arcsoft.visdrive.sdk.constant.dms.ArcDMSDetectMaskType import com.arcsoft.visdrive.sdk.constant.dms.ArcDMSDetectMaskType
import com.arcsoft.visdrive.sdk.model.common.ArcDrivingStatus 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.ArcInitParamInfo
import com.arcsoft.visdrive.sdk.model.common.ArcInitParamInfoDetail import com.arcsoft.visdrive.sdk.model.common.ArcInitParamInfoDetail
import com.arcsoft.visdrive.sdk.model.dms.ArcDMSAlarmParam import com.arcsoft.visdrive.sdk.model.dms.ArcDMSAlarmParam
...@@ -18,6 +17,8 @@ import com.arcsoft.visdrive.sdk.model.dms.ArcDMSDistractScope ...@@ -18,6 +17,8 @@ import com.arcsoft.visdrive.sdk.model.dms.ArcDMSDistractScope
import com.arcsoft.visdrive.sdk.model.dms.ArcDMSInitParam import com.arcsoft.visdrive.sdk.model.dms.ArcDMSInitParam
import com.blankj.utilcode.util.FileUtils import com.blankj.utilcode.util.FileUtils
import com.blankj.utilcode.util.LogUtils 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.intergration.test.utils.toByteBuffer
import com.mediatek.smartplatform.ImageReaderEx import com.mediatek.smartplatform.ImageReaderEx
import com.mediatek.smartplatform.PictureConfiguration import com.mediatek.smartplatform.PictureConfiguration
...@@ -26,28 +27,18 @@ import com.mediatek.smartplatform.SmartPlatformManager ...@@ -26,28 +27,18 @@ import com.mediatek.smartplatform.SmartPlatformManager
import com.mediatek.smartplatform.SpmCameraDevice import com.mediatek.smartplatform.SpmCameraDevice
import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel import kotlinx.coroutines.cancel
import kotlinx.coroutines.channels.awaitClose 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.flow.callbackFlow
import kotlinx.coroutines.launch
import java.io.Closeable import java.io.Closeable
import java.io.File import java.io.File
import java.nio.ByteBuffer
import java.util.concurrent.Executors import java.util.concurrent.Executors
import kotlin.coroutines.AbstractCoroutineContextElement import kotlin.coroutines.AbstractCoroutineContextElement
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
val COROUTINE_DMS = CoroutineName("dms") val COROUTINE_DMS = CoroutineName("dms")
const val DMS_PIC_WIDTH = 1280
const val DMS_PIC_HEIGHT = 720
const val CAMERA_ID_DMS = "0" const val CAMERA_ID_DMS = "0"
val dmsResult by lazy { val dmsResult by lazy {
...@@ -127,12 +118,12 @@ fun ArcVisDriveEngine.setDmsDrivingStatus(speed:Int = 50):Int{ ...@@ -127,12 +118,12 @@ fun ArcVisDriveEngine.setDmsDrivingStatus(speed:Int = 50):Int{
} }
fun SpmCameraDevice.startDms(engin:ArcVisDriveEngine) = callbackFlow{ fun SpmCameraDevice.startDms(engin:ArcVisDriveEngine) = callbackFlow{
val frDir = File(Environment.getExternalStorageDirectory(),"dms/") val dmsDir = File(Environment.getExternalStorageDirectory(),"dms/")
if (!FileUtils.isFileExists(frDir)) { if (!FileUtils.isFileExists(dmsDir)) {
FileUtils.createOrExistsDir(frDir) FileUtils.createOrExistsDir(dmsDir)
} }
val pictureConfig = PictureConfiguration.get(PictureSequenceSource.GENERAL_CAMERA) val pictureConfig = PictureConfiguration.get(PictureSequenceSource.GENERAL_CAMERA)
pictureConfig.mPath = frDir.absolutePath pictureConfig.mPath = dmsDir.absolutePath
pictureConfig.mImageFormat = SpmCameraDevice.ImageDataCallback.IMAGE_FORMAT_NV21 pictureConfig.mImageFormat = SpmCameraDevice.ImageDataCallback.IMAGE_FORMAT_NV21
pictureConfig.mPicWidth = DMS_PIC_WIDTH pictureConfig.mPicWidth = DMS_PIC_WIDTH
pictureConfig.mPicHeight = DMS_PIC_HEIGHT pictureConfig.mPicHeight = DMS_PIC_HEIGHT
...@@ -192,6 +183,7 @@ fun SpmCameraDevice.startDms(engin:ArcVisDriveEngine) = callbackFlow{ ...@@ -192,6 +183,7 @@ fun SpmCameraDevice.startDms(engin:ArcVisDriveEngine) = callbackFlow{
startPictureSequence(PictureSequenceSource.GENERAL_CAMERA,pictureConfig) startPictureSequence(PictureSequenceSource.GENERAL_CAMERA,pictureConfig)
awaitClose { awaitClose {
LogUtils.dTag("dms","dms detect ended") LogUtils.dTag("dms","dms detect ended")
stopPictureSequence(PictureSequenceSource.GENERAL_CAMERA)
engin.unInit() engin.unInit()
} }
} }
\ No newline at end of file
package com.intergration.test.utils 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 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{ fun ByteArray.toByteBuffer():ByteBuffer{
val buffer = ByteBuffer.allocateDirect(size).also { val buffer = ByteBuffer.allocateDirect(size).also {
it.put(this) 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