[英]Using ffmpeg to merge two audio file and one video file with control volume?
我想使用ffmpeg將2個音頻文件與一個視頻文件合並,以創建一個視頻文件,但是在音頻文件中,我想控制每個文件的音量。
我該怎么辦 ?
ffmpeg -i video.mp4 -i input1.mp3 -i input2.mp3
-filter_complex "[1]volume=0.5,pan=2c[a];[2]volume=0.7,pan=2c[b];[a][b]amix=duration=shortest"
-ac 2 -c:a libmp3lame -q:v 0 output.mp4
這就是我做到的方式。 首先使用以下方法合並輸入音頻文件。
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()
}
})
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.