程序员开发实例大全宝库

网站首页 > 编程文章 正文

Kotlin编写一个AudioMerger 在线音视频解析七

zazugpt 2024-09-08 11:33:16 编程文章 31 ℃ 0 评论

AudioMerger 音视频合并操作,上篇文章讲解了关于视频的音频提取功能,今天我们学习一下合并的处理,主要用到了 com.github.hiteshsondhi88.libffmpeg 这个开源库的一个方法,这个开源库主要也是为我们提供了ffmpeg 的功能封装。

class AudioMerger private constructor(private val context: Context) {

    private var audio1: File? = null
    private var audio2: File? = null
    private var callback: FFMpegCallback? = null
    private var outputPath = ""
    private var outputFileName = ""

    fun setFile1(originalFiles: File): AudioMerger {
        this.audio1 = originalFiles
        return this
    }

    fun setFile2(originalFiles: File): AudioMerger {
        this.audio2 = originalFiles
        return this
    }

    fun setCallback(callback: FFMpegCallback): AudioMerger {
        this.callback = callback
        return this
    }

    fun setOutputPath(output: String): AudioMerger {
        this.outputPath = output
        return this
    }

    fun setOutputFileName(output: String): AudioMerger {
        this.outputFileName = output
        return this
    }

    fun merge() {

        if ((audio1 == null || !audio1!!.exists()) || (audio2 == null || !audio2!!.exists())) {
            callback!!.onFailure(IOException("File not exists"))
            return
        }

        if (!audio1!!.canRead() || !audio2!!.canRead()) {
            callback!!.onFailure(IOException("Can't read the file. Missing permission?"))
            return
        }

        val outputLocation = Utils.getConvertedFile(outputPath, outputFileName)

        //Merge two audio files
        val cmd = arrayOf("-y", "-i", audio1!!.path, "-i", audio2!!.path, "-filter_complex", "amix=inputs=2:duration=first:dropout_transition=0", "-codec:a", "libmp3lame", "-q:a", "0", outputLocation.path)

        try {
            FFmpeg.getInstance(context).execute(cmd, object : ExecuteBinaryResponseHandler() {
                override fun onStart() {}

                override fun onProgress(message: String?) {
                    callback!!.onProgress(message!!)
                }

                override fun onSuccess(message: String?) {
                    Utils.refreshGallery(outputLocation.path, context)
                    callback!!.onSuccess(outputLocation, OutputType.TYPE_AUDIO)

                }

                override fun onFailure(message: String?) {
                    if (outputLocation.exists()) {
                        outputLocation.delete()
                    }
                    callback!!.onFailure(IOException(message))
                }

                override fun onFinish() {
                    callback!!.onFinish()
                }
            })
        } catch (e: Exception) {
            callback!!.onFailure(e)
        } catch (e2: FFmpegCommandAlreadyRunningException) {
            callback!!.onNotAvailable(e2)
        }

    }

    companion object {

        val TAG = "AudioMerger"

        fun with(context: Context): AudioMerger {
            return AudioMerger(context)
        }
    }
}

val cmd = arrayOf("-y", "-i", audio1!!.path, "-i", audio2!!.path, "-filter_complex", "amix=inputs=2:duration=first:dropout_transition=0", "-codec:a", "libmp3lame", "-q:a", "0", outputLocation.path)


主要是这条命令的讲解,arrayOf 是kotlin当中创建一个字符数组,这条命令的主要作用就是合并音视频。


写FFmpeg的命令,如果-y 和 -i 应该是很基础的指令,-y就是全局参数,覆盖输出文件而不询问,


-i就是置顶从哪儿采集数据,它相当于是一个采集前的入口文件,数据源。


amix相当于是一个滤波器


好了今天就讲解到这里,你的关注,点赞,收藏,转发是对我最大的支持,谢谢了。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表