Использование ffmpeg для объединения двух аудиофайлов и одного видеофайла с контролем громкости? - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу использовать 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

1 Ответ

0 голосов
/ 18 декабря 2018

Вот как я это сделал.Сначала объедините входные аудиофайлы, используя метод, описанный ниже.

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()
        }
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...