Newer
Older
Endoscope / app / src / main / java / com / casic / endoscope / service / VideoTranscodeService.kt
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")
    }
}