我就是这样做的。
首先使用下面的方法合并输入的音频文件。
private fun mergeAudios() {
//ffmpeg -i one.mp3 -i two.mp3 -shortest -filter_complex \
//"[0:a]adelay=10000|10000,volume=0.4[a0]; \
// [1:a]volume=5.0[a1]; \
// [a0][a1]amix=inputs=2[out]" \
// -map "[out]" -ac 2 -c:a libfdk_aac output.m4a
val finalAudio =
File(Environment.getExternalStorageDirectory().absolutePath + "/" + System.currentTimeMillis() + ".mp3")
val command = arrayOf(
"-i",
Environment.getExternalStorageDirectory().absolutePath + "/2.mp3",
"-i",
Environment.getExternalStorageDirectory().absolutePath + "/1543575307959.mp3",
"-shortest",
"-filter_complex",
"[0:a]volume=0.4[a0];[1:a]volume=5.0[a1];[a0][a1]amix=inputs=2:duration=shortest",
finalAudio.absolutePath
)
Log.d("ffmpeg", command.contentDeepToString())
ffmpeg.execute(command, object : ExecuteBinaryResponseHandler() {
override fun onFinish() {
super.onFinish()
}
override fun onSuccess(message: String?) {
super.onSuccess(message)
Log.d("ffmpeg", "onSuccess ")
}
override fun onFailure(message: String?) {
super.onFailure(message)
Log.d("ffmpeg", "failure " + message)
}
override fun onProgress(message: String?) {
super.onProgress(message)
Log.d("ffmpeg", "progress " + message)
}
override fun onStart() {
super.onStart()
}
})
}
然后将合并后的音频文件与视频文件合并。
private fun mergeAudioVideo() {
val finalVideo =
File(Environment.getExternalStorageDirectory().absolutePath + "/" + System.currentTimeMillis() + ".mp4")
//ffmpeg -i video.mp4 -i audio.wav \
//-c:v copy -c:a aac -strict experimental \
//-map 0:v:0 -map 1:a:0 output.mp4
val command = arrayOf(
"-i",
Environment.getExternalStorageDirectory().absolutePath + "/2.mp4",
"-i",
Environment.getExternalStorageDirectory().absolutePath + "/1543577399776.mp3"
,
"-c:v",
"copy",
"-c:a",
"aac",
"-strict",
"experimental",
"-map",
"0:v:0",
"-map",
"1:a:0",
finalVideo.absolutePath
)
ffmpeg.execute(command, object : ExecuteBinaryResponseHandler() {
override fun onFinish() {
super.onFinish()
}
override fun onSuccess(message: String?) {
super.onSuccess(message)
Log.d("ffmpeg", "onSuccess ")
}
override fun onFailure(message: String?) {
super.onFailure(message)
Log.d("ffmpeg", "failure " + message)
}
override fun onProgress(message: String?) {
super.onProgress(message)
Log.d("ffmpeg", "progress " + message)
}
override fun onStart() {
super.onStart()
}
})
}
如果它适合你,试试这个。您可能需要一些额外的标志,因为您的视频没有音频文件。如果方法中的命令对您不起作用,请尝试删除音频标志的 -map 参数
对于单个命令,这可能有效。我现在没有完整的项目来测试它,所以无法确认这个。
fun mergeAudioVideoDirectly(){
val finalVideo =
File(Environment.getExternalStorageDirectory().absolutePath + "/" + System.currentTimeMillis() + ".mp4")
//ffmpeg -i <input1> -i <input2> -filter_complex "[0:a:0][1:a:0]amix[outa]" -map "[0:v:0]" -map ["outa"] <output>
val command = arrayOf(
"-i",
Environment.getExternalStorageDirectory().absolutePath + "/2.mp4",
"-i",
Environment.getExternalStorageDirectory().absolutePath + "/1.mp3",
"-filter_complex",
"[0:a:0][1:a:0]amix[outa]",
"-map",
"0:v:0",
"-map",
"[outa]",
finalVideo.absolutePath
)
Log.d("ffmpeg ","command "+command.contentDeepToString())
ffmpeg.execute(command, object : ExecuteBinaryResponseHandler() {
override fun onFinish() {
super.onFinish()
}
override fun onSuccess(message: String?) {
super.onSuccess(message)
Log.d("ffmpeg", "onSuccess ")
}
override fun onFailure(message: String?) {
super.onFailure(message)
Log.d("ffmpeg", "failure " + message)
}
override fun onProgress(message: String?) {
super.onProgress(message)
}
override fun onStart() {
super.onStart()
}
})
}