Я использую -filter_complex чтобы создать видео из нескольких изображений и объединить их вместе. Это работает нормально. Теперь я хотел бы добавить звуковую дорожку к видео, команда не выполняется. Как добавить аудио в этот видеофайл, который я генерирую?

Вот что я делаю, что не работает:

ffmpeg \
-i sunlight.mp3 \
-loop 1 -t 1 -i 1.jpg \
-loop 1 -t 1 -i 2.jpg \
-loop 1 -t 1 -i 3.jpg \
-loop 1 -t 1 -i 4.jpg \
-loop 1 -t 1 -i 5.jpg \
-filter_complex \
"[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; \
[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; \
[3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; \
[4:v][3:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b4v]; \
[0:v][b1v][1:v][b2v][2:v][b3v][3:v][b4v][4:v]concat=n=9:v=1:a=0,format=yuv420p[v]" -map "[v]" out.mp4

Вот вывод ffmpeg из этого:

    ffmpeg version 3.1.3 Copyright (c) 2000-2016 the FFmpeg developers
        built with Apple LLVM version 7.3.0 (clang-703.0.31)
        configuration: --prefix=/usr/local/Cellar/ffmpeg/3.1.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-opencl --enable-libx264 --enable-libmp3lame --enable-libxvid --disable-lzma --enable-vda
        libavutil      55. 28.100 / 55. 28.100
        libavcodec     57. 48.101 / 57. 48.101
        libavformat    57. 41.100 / 57. 41.100
        libavdevice    57.  0.101 / 57.  0.101
        libavfilter     6. 47.100 /  6. 47.100
        libavresample   3.  0.  0 /  3.  0.  0
        libswscale      4.  1.100 /  4.  1.100
        libswresample   2.  1.100 /  2.  1.100
        libpostproc    54.  0.100 / 54.  0.100
    Input #0, mp3, from 'sunlight.mp3':
        Metadata:
            encoder         : Lavf57.41.100
        Duration: 00:02:05.68, start: 0.025057, bitrate: 128 kb/s
            Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s
            Metadata:
                encoder         : Lavc57.48
    Input #1, image2, from '1.jpg':
        Duration: 00:00:00.04, start: 0.000000, bitrate: 42613 kb/s
            Stream #1:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1200x900 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Input #2, image2, from '2.jpg':
        Duration: 00:00:00.04, start: 0.000000, bitrate: 44551 kb/s
            Stream #2:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1200x900 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Input #3, image2, from '3.jpg':
        Duration: 00:00:00.04, start: 0.000000, bitrate: 40433 kb/s
            Stream #3:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1200x900 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Input #4, image2, from '4.jpg':
        Duration: 00:00:00.04, start: 0.000000, bitrate: 57157 kb/s
            Stream #4:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1200x900 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Input #5, image2, from '5.jpg':
        Duration: 00:00:00.04, start: 0.000000, bitrate: 51745 kb/s
            Stream #5:0: Video: mjpeg, yuvj444p(pc, bt470bg/unknown/unknown), 1200x900 [SAR 1:1 DAR 4:3], 25 fps, 25 tbr, 25 tbn, 25 tbc
    Stream specifier ':v' in filtergraph description [1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; [2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; [3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; [4:v][3:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b4v]; [0:v][b1v][1:v][b2v][2:v][b3v][3:v][b4v][4:v]concat=n=9:v=1:a=0,format=yuv420p[v] matches no streams.

Когда я запускаю команду без -i sunlight.mp3 она работает нормально.

2 ответа2

4

У вас есть два способа попробовать:

Определите выходные потоки вручную с -map

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

  1. Пометьте свои выходные данные фильтра, как вы сделали с помощью [v]
  2. Использовать -map

Пример:

ffmpeg \
-loop 1 -t 1 -i 1.jpg \
-loop 1 -t 1 -i 2.jpg \
-loop 1 -t 1 -i 3.jpg \
-loop 1 -t 1 -i 4.jpg \
-loop 1 -t 1 -i 5.jpg \
-i sunlight.mp3 \
-filter_complex \
"[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; \
[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; \
[3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; \
[4:v][3:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b4v]; \
[0:v][b1v][1:v][b2v][2:v][b3v][3:v][b4v][4:v]concat=n=9:v=1:a=0,format=yuv420p[v]" -map "[v]" -map 5:a -shortest out.mp4

Значения спецификатора потока, которые вы используете в графе фильтра и в опциях -map , зависят от порядка ваших входных данных.

Используйте поведение выбора потока по умолчанию

Поскольку ваш конечный вывод содержит только один видеопоток и один аудиопоток, вы можете опустить -map и метку вывода ([v]) и просто использовать поведение выбора потока по умолчанию. Это может быть более простой способ, если вы создаете сценарий.

ffmpeg \
-loop 1 -t 1 -i 1.jpg \
-loop 1 -t 1 -i 2.jpg \
-loop 1 -t 1 -i 3.jpg \
-loop 1 -t 1 -i 4.jpg \
-loop 1 -t 1 -i 5.jpg \
-i sunlight.mp3 \
-filter_complex \
"[1:v][0:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b1v]; \
[2:v][1:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b2v]; \
[3:v][2:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b3v]; \
[4:v][3:v]blend=all_expr='A*(if(gte(T,0.5),1,T/0.5))+B*(1-(if(gte(T,0.5),1,T/0.5)))'[b4v]; \
[0:v][b1v][1:v][b2v][2:v][b3v][3:v][b4v][4:v]concat=n=9:v=1:a=0,format=yuv420p" -shortest out.mp4
2

В вашем скрипте есть две основные ошибки:

  1. в первой цепочке фильтров (см. первую строку filter_complex) вы указываете 0:v в качестве входного потока. но, как показывает вывод ffmpeg: Stream specifier ':v' in filtergraph description ... matches no streams. в файле 0 нет видеопотока. обратите внимание, что вы отправляете mp3 файл в качестве первого ввода. положить его как последний входной файл и ...

  2. Добавьте -map 5:a перед именем выходного файла.Вы указали видеопоток [v] качестве единственного выходного потока. При использовании опции -map вы должны определить все выходные потоки с этим.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .