Я написал 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 Вопрос в том, как комплексное значение фильтра в моем списке параметров, которое я определил, будет откорректировано для работы с первым видео, в котором нет звука?