簡體   English   中英

使用ffmpeg合並具有控制音量的兩個音頻文件和一個視頻文件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM