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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。