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)

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

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

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

amix相当于是一个滤波器

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

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: wxii2p22