FFmpeg: объединить файлы .webm, некоторые из них являются видео, только некоторые аудио, только некоторые с обоими

В моем случае у меня есть 3 файла .webm, первый только аудио, второй только видео, третий аудио и видео.

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

Видеокодек — VP8, аудиокодек — Opus.

concat.txt содержит записи для трех файлов

Я использую следующую команду для их объединения.

ffmpeg -f concat -safe 0 -i ./concat.txt -c copy -y output.webm

Эта команда создает выходной файл, когда я его воспроизвожу, воспроизводится только первая часть, состоящая только из звука, и происходит сбой, когда она достигает части, состоящей только из видео.

Я также пытался добавить фиктивное изображение в аудиофайлы, но команда не работает, когда я пытаюсь объединить.

Приветствуется любая помощь/критика.

Спасибо!

Дополнительная информация о входных файлах

Input #0, matroska,webm, from 'original1.webm':
  Metadata:
    title           : -
    ENCODER         : Lavf58.45.100
  Duration: 00:00:09.99, start: 0.000000, bitrate: 34 kb/s
    Stream #0:0: Audio: opus, 48000 Hz, stereo, fltp (default)
    Metadata:
      DURATION        : 00:00:09.990000000
Input #1, matroska,webm, from 'original2.webm':
  Metadata:
    title           : -
    ENCODER         : Lavf58.45.100
  Duration: 00:00:09.75, start: 0.000000, bitrate: 954 kb/s
    Stream #1:0: Video: vp8, yuv420p(tv, bt470bg/unknown/unknown, progressive), 1680x1050, SAR 1:1 DAR 8:5, 1k tbr, 1k tbn, 1k tbc (default)
    Metadata:
      DURATION        : 00:00:09.754000000
Input #2, matroska,webm, from 'original3.webm':
  Metadata:
    title           : -
    ENCODER         : Lavf58.45.100
  Duration: 00:00:10.02, start: 0.000000, bitrate: 912 kb/s
    Stream #2:0: Audio: opus, 48000 Hz, stereo, fltp (default)
    Metadata:
      DURATION        : 00:00:10.023000000
    Stream #2:1: Video: vp8, yuv420p(tv, bt470bg/unknown/unknown, progressive), 1680x1050, SAR 1:1 DAR 8:5, 1k tbr, 1k tbn, 1k tbc (default)
    Metadata:
      DURATION        : 00:00:09.965000000

person Lenny Linus    schedule 25.02.2021    source источник
comment
Необходимо просмотреть информацию о каждом отдельном входе, чтобы иметь возможность дать вам ответ, который вы можете скопировать и вставить. Информацию можно увидеть с помощью ffmpeg -i input1.webm -i input2.webm -i input3.webm   -  person llogan    schedule 25.02.2021
comment
@llogan Я добавил информацию к вопросу.   -  person Lenny Linus    schedule 26.02.2021


Ответы (1)


Все объединяемые файлы должны иметь одинаковые атрибуты и порядок потоков.

  1. Добавить черное видео в аудиофайл:

    ffmpeg -i audio.webm -f lavfi -i color=s=1680x1050 -r 1000 -map 0 -map 1 -c:a copy -c:v libvpx -shortest output1.webm
    
  2. Добавить беззвучный звук в файл только видео:

    ffmpeg -f lavfi -i anullsrc=r=48000:cl=stereo -i video.webm -map 0 -map 1 -c:a libopus -c:v copy -shortest output2.webm
    
  3. Создайте input.txt со следующим содержимым:

    file 'output1.webm'
    file 'output2.webm'
    file 'original3.webm'
    
  4. Объединить с демультиплексором concat:

    ffmpeg -f concat -safe 0 -i concat.txt -c copy output.webm
    
person llogan    schedule 26.02.2021
comment
Большое спасибо @llogan. Я собираюсь попробовать это, какая-то конкретная причина для -r 1000, разве это не установит частоту кадров на 1000 кадров в секунду ?? Я могу быть не прав. Кроме того, позже, когда мы запустим команду concat, есть ли способ одновременно изменить масштаб входных видео для сценариев, когда разрешения разные или неизвестны?? Большое спасибо! - person Lenny Linus; 26.02.2021
comment
@LennyLinus Да, -r предназначен для соответствия частоте кадров другого вашего видео, но в данном случае это не обязательно, так как временная база должна быть одинаковой. Для масштабирования требуется кодирование, и если вам нужно изменить масштаб всех видео, вам следует просто использовать вместо этого фильтр concat, как показано в Как объединить видео в ffmpeg с помощью разные атрибуты?. Если вы просто хотите, чтобы цветовой фильтр автоматически масштабировался до размера основного видео, см. фильтр scale2ref. - person llogan; 26.02.2021
comment
Большое спасибо @llogan. Это сработало отлично! - person Lenny Linus; 27.02.2021