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

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

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

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相当于是一个滤波器


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

展开阅读全文

页面更新:2024-02-25

标签:在线   滤波器   数据源   数组   置顶   全局   指令   字符   入口   命令   音频   作用   参数   操作   功能   文件   数码

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top