FFMPEG Merge Multiple Videos: для одного из них нет источника звука - PullRequest
0 голосов
/ 28 марта 2020

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

Сначала я выполнил ffprobe , чтобы получить доступ к тому, что я буду называть " видео файл spe c ". В этом сценарии я создал модуль basi c, чтобы помочь мне лучше понять мою проблему:

Evaluation from all processes: [
  {
    fileName: 'input-0.mp4',
    isVideoAvailable: true,
    isAudioAvailable: false,
    width: 1920,
    height: 1080,
    sampleRateAspectRatio: '1/1',
    audioVolume: 1,
    duration: '13.140000'
  },
  {
    fileName: 'input-1.mp4',
    isVideoAvailable: true,
    isAudioAvailable: true,
    width: 1920,
    height: 1080,
    sampleRateAspectRatio: '1/1',
    audioVolume: 1,
    duration: '17.160000'
  },
  {
    fileName: 'input-2.mp4',
    isVideoAvailable: true,
    isAudioAvailable: true,
    width: 1920,
    height: 1080,
    sampleRateAspectRatio: '1/1',
    audioVolume: 1,
    duration: '20.280000'
  },
  {
    fileName: 'input-3.mp4',
    isVideoAvailable: true,
    isAudioAvailable: true,
    width: 1920,
    height: 1080,
    sampleRateAspectRatio: '1/1',
    audioVolume: 1,
    duration: '19.020000'
  },
  {
    fileName: 'input-4.mp4',
    isVideoAvailable: true,
    isAudioAvailable: true,
    width: 1920,
    height: 1080,
    sampleRateAspectRatio: '1/1',
    audioVolume: 1,
    duration: '9.480000'
  }
]

Этот следующий блок кода - это параметры, которые я на самом деле жестко запрограммировал в этом случае. Разрешение экрана и соотношение сторон устанавливаются вручную, поскольку я обнаружил различные настройки для каждого видео, которое я обрабатывал. Эти параметры позволяют FFMPEG успешно выполняться при нормальных обстоятельствах:

let ffmpegParameters = [
  '-i',
  'input-0.mp4',
  '-i',
  'input-1.mp4',
  '-i',
  'input-2.mp4',
  '-i',
  'input-3.mp4',
  '-i',
  'input-4.mp4',
  '-f',
  'lavfi',
  '-t',
  '0.1',
  '-i',
  'anullsrc',
  '-filter_complex',
  '[0:v]scale=1920:1080,setsar=1/1[v0];[0:a]volume=1.0[a0];[1:v]scale=1920:1080,setsar=1/1[v1];[1:a]volume=1.0[a1];[2:v]scale=1920:1080,setsar=1/1[v2];[2:a]volume=1.0[a2];[3:v]scale=1920:1080,setsar=1/1[v3];[3:a]volume=1.0[a3];[4:v]scale=1920:1080,setsar=1/1[v4];[4:a]volume=1.0[a4];[v0][a0][v1][a1][v2][a2][v3][a3][v4][a4]concat=n=5:v=1:a=1[v][a]',
  '-map',
  '[v]',
  '-map',
  '[a]',
  '-c:v',
  'libx264',
  '-vsync',
  '2',
  'output.mp4'
]

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

  '-f',
  'lavfi',
  '-t',
  '0.1',
  '-i',
  'anullsrc',

Я не знаю, как настроить сложный фильтр, чтобы учесть мою ситуацию с первым видео, не содержащим аудио. Я включил весь журнал ниже:

Logs:
 ffmpeg version git-2020-02-03-1c15111
 Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 11.0.0 (clang-1100.0.33.8)
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-appkit --enable-avfoundation --enable-coreimage --enable-audiotoolbox
  libavutil      56. 38.100 / 56. 38.100
  libavcodec     58. 67.100 / 58. 67.100
  libavformat    58. 37.100 / 58. 37.100
  libavdevice    58.  9.103 / 58.  9.103
  libavfilter     7. 73.100 /  7. 73.100
  libswscale      5.  6.100 /  5.  6.100
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input-0.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.37.100

  Duration: 00:00:14.80, start: 1.620000, bitrate: 1499 kb/s
    Stream #0:0(und): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1498 kb/s, 25 fps, 25 tbr, 1200k tbn, 2400k tbc (default)
    Metadata:
      handler_name    : VideoHandler

Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'input-1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.37.100
  Duration: 00:00:18.48, start: 0.000000, bitrate: 977 kb/s
    Stream #1:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1440x876 [SAR 1:1 DAR 120:73], 903 kb/s, 15.21 fps, 16.67 tbr, 16k tbn, 32k tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #1:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 69 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
Input #2, mov,mp4,m4a,3gp,3g2,mj2, from 'input-2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.37.100
  Duration: 00:00:22.68, start: 0.000000, bitrate: 1795 kb/s
    Stream #2:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1718 kb/s, 29.54 fps, 50 tbr, 16k tbn, 32k tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #2:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 69 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

Input #3, mov,mp4,m4a,3gp,3g2,mj2, from 'input-3.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.37.100
  Duration: 00:00:54.60, start: 
0.000000, bitrate: 404 kb/s
    Stream #3:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1440x876 [SAR 1:1 DAR 120:73], 330 kb/s, 15.24 fps, 16.67 tbr, 16k tbn, 32k tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #3:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 69 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

Input #4, mov,mp4,m4a,3gp,3g2,mj2, from 'input-4.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.37.100
  Duration: 00:00:09.36
, start: 0.000000, bitrate: 1794 kb/s
    Stream #4:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1717 kb/s, 29.38 fps, 50 tbr, 16k tbn, 32k tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #4:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 69 kb/s (default)
    Metadata:
      handler_name    : SoundHandler

Stream specifier ':a' in filtergraph description [0:v]scale=1920:1080,setsar=1/1[v0];[0:a]volume=1.0[a0];[1:v]scale=1920:1080,setsar=1/1[v1];[1:a]volume=1.0[a1];[2:v]scale=1920:1080,setsar=1/1[v2];[2:a]volume=1.0[a2];[3:v]scale=1920:1080,setsar=1/1[v3];[3:a]volume=1.0[a3];[4:v]scale=1920:1080,setsar=1/1[v4];[4:a]volume=1.0[a4];[v0][a0][v1][a1][v2][a2][v3][a3][v4][a4]concat=n=5:v=1:a=1[v][a] matches no streams.


Когда я удалил спецификатор потока [a0] , я получил другую ошибку:

FFmpeg Video Merge - STDERR: [Parsed_setsar_3 @ 0x7f87c7709100] Media type mismatch between the 'Parsed_setsar_3' filter output pad 0 (video) and the 'Parsed_concat_14' filter input pad 1 (audio)
[AVFilterGraph @ 0x7f87c7430c00] Cannot create the link setsar:0 -> concat:1

My Вопрос в том, как комплексное значение фильтра в моем списке параметров, которое я определил, будет откорректировано для работы с первым видео, в котором нет звука?

1 Ответ

1 голос
/ 28 марта 2020

Stream specifier ':a' in filtergraph description … matches no streams

Вы ссылаетесь на несуществующий поток. В этом случае это связано с [0:a]volume=1.0[a0]. Вы пытаетесь выбрать звук из input-0.mp4, но на этом входе нет звука.

Media type mismatch

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


Рабочий пример

ffmpeg -i input-0.mp4 -i input-1.mp4 -i input-2.mp4 -i input-3.mp4 -i input-4.mp4 -f lavfi -t 0.1 -i anullsrc=channel_layout=mono:sample_rate=44100 -filter_complex "[0:v]scale=1920:1080,setsar=1/1[v0];[1:v]scale=1920:1080,setsar=1[v1];[2:v]scale=1920:1080,setsar=1[v2];[3:v]scale=1920:1080,setsar=1[v3];[4:v]scale=1920:1080,setsar=1[v4];[v0][5][v1][1:a][v2][2:a][v3][3:a][v4][4:a]concat=n=5:v=1:a=1[v][a]" -map "[v]" -map "[a]" -movflags +faststart output.mp4
  • Поскольку volume=1 абсолютно ничего не делает, вы можете удалить этот фильтр .
  • Для видеовхода без аудио соедините его с выходом anullsr c в concat (как с [v0][5] в примере выше).
  • concat filter автоматически выберет общую частоту дискретизации и разметку канала для аудиопотоков, но я все же предпочитаю вручную устанавливать их в anullsr c, поэтому я точно знаю, что я получу.
  • Ваши входы различаются в DAR, поэтому видео с разрешением 1440x876 на выходе будет выглядеть сжатым. Вы можете избежать этого, добавив scale + crop или pad . Поскольку все они имеют одинаковый SAR, обратитесь к Изменение размера видео с помощью ffmpeg для соответствия stati c size .
  • Повышение масштаба обычно не является хорошей идеей. Вместо этого рассмотрите возможность уменьшения до 1280x720, так как половина входов имеет такой размер.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...