Проблема при добавлении фона musi c к видео без звука - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь вырезать кусок фоновой музыки c и l oop их в видео и изменить скорость видео с помощью команды ниже.

 String[] cmd = {"-y", "-i", input, "-i", shortsound,
            "-filter_complex",
            "[0:v]trim=0:120,setpts=1/2*(PTS-STARTPTS)[v1]," +
                    "[0:v]trim=120:240,setpts=1/2*(PTS-STARTPTS)[v2];" +
                    "[1:a]atrim=0:6,asetpts=PTS-STARTPTS," +
                    "asetrate=44100,aloop=-1:2e+09," +
                    "aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo,volume=1.0[bg];" +
                    "[0:a]atrim=0:120,asetpts=PTS-STARTPTS,atempo=2.0" +
                    ",aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a1]," +
                    "[0:a]atrim=120:240,asetpts=PTS-STARTPTS,atempo=2.0," +
                    "aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a2];" +
                    "[v1][a1][v2][a2]concat=n=2:v=1:a=1[video][audio];[audio]volume=0.5[avolume];" +
                    "[avolume][bg]amerge=2,pan=stereo|c0<c0+c2|c1<c1+c3[aout]",
            "-map", "[video]", "-map", "[aout]", "-c:v", "libx264", "-c:a", "aac", "-shortest",
            "-preset", "veryfast", output, "-hide_banner"};

Все было хорошо, пока Я пробовал с видео без звука, это не сработало. Как при вводе видео без звука?

1 Ответ

2 голосов
/ 27 апреля 2020

ваша командная строка не будет работать для любого видео, имеющего аудиопоток, потому что в вашей команде вы пытаетесь манипулировать аудиопотоком входного видео в следующих строках:

 "[0:a]atrim=0:120,asetpts=PTS-STARTPTS,atempo=2.0" +
                ",aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a1]," +
 "[0:a]atrim=120:240,asetpts=PTS-STARTPTS,atempo=2.0," +
                "aformat=sample_fmts=fltp:sample_rates=44100:channel_layouts=stereo[a2];"

[0: a] относится к аудиопотоку первого ввода, который является видеофайлом, поэтому, когда у нас есть видео без аудиопотока, ваша команда завершится с ошибкой

, чтобы решить вашу проблему, вы можете проверить если в вашем видеофайле есть какой-либо аудиопоток с кодом ниже:

private boolean isVideoContainAudioStream(String videoPath) {
    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
    retriever.setDataSource(videoPath);
    String hasAudioStream = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO);
    if (hasAudioStream != null && hasAudioStream.equals("yes"))
        return true;
    else
        return false;
}

, поэтому, если результат вышеупомянутой функции равен true, ваш видеофайл содержит аудиопоток, так что вы можете запустить свою команду, иначе вы можете игнорировать файл или показывать предупреждение или запустить отредактированную версию вашей команды

...