package com.casic.endoscope.service import android.app.Service import android.content.Intent import android.os.IBinder import android.util.Log import com.casic.endoscope.utils.FFmpegCommandHub import com.casic.endoscope.utils.ProjectConstant import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.writeToFile import io.microshow.rxffmpeg.RxFFmpegInvoke import io.microshow.rxffmpeg.RxFFmpegSubscriber import java.util.Timer import java.util.TimerTask class VideoTranscodeService : Service() { private val kTag = "VideoTranscodeService" override fun onBind(intent: Intent?): IBinder? { return null } override fun onCreate() { super.onCreate() Log.d(kTag, "onCreate => $kTag") } /** * 执行该方法后,Service 会启动并在后台无限期执行 * 需要调用 stopSelf() 或 stopService() 来结束Service * */ override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { //定时遍历缓存,看是否有新的视频被录制 Timer().schedule(object : TimerTask() { override fun run() { if (ProjectConstant.VIDEO_PATH_STACK.isNotEmpty()) { transcodeVideo(ProjectConstant.VIDEO_PATH_STACK.pop()) } } }, 0, 1000) return START_NOT_STICKY } //开始后台转码 private fun transcodeVideo(inputPath: String) { /** * //storage/emulated/0/Android/data/com.casic.endoscope/files/Movies/2024-02-21/20240221161555.mp4 * */ val lastIndex = inputPath.lastIndexOf("/") val fileName = inputPath.drop(lastIndex + 1) //文件名前面+t val newFileName = fileName.reversed().plus("t").reversed() val outputPath = inputPath.replace(fileName, newFileName) RxFFmpegInvoke.getInstance() .runCommandRxJava(FFmpegCommandHub.createVideoTranscodeCommand(inputPath, outputPath)) .subscribe(object : RxFFmpegSubscriber() { override fun onError(message: String?) { message?.writeToFile(createLogFile()) } override fun onFinish() { Log.d(kTag, "onFinish => $outputPath 转码完成") } override fun onProgress(progress: Int, progressTime: Long) { Log.d(kTag, "onProgress => $progress") } override fun onCancel() { } }) } override fun onDestroy() { super.onDestroy() Log.d(kTag, "onDestroy => $kTag") } }