FFMPEG - Ошибка при попытке объединить несколько файлов со звуком и без него. - PullRequest
0 голосов
/ 07 августа 2020

Хорошо, благодаря другому пользователю у меня есть следующая команда FFMPEG, которая объединяет 4 видео вместе. Теперь, если я использую эту команду с 4 видеофайлами, у всех есть звук, все будет работать! Однако, если в одном или нескольких видео нет звука, я получаю сообщение об ошибке «Не совпадает с потоками».

Кто-нибудь может заметить, что здесь не так? добавление anullsrc Video 2 - Имеет аудио видео 3 - Нет аудио видео 4 - Имеет звук

ffmpeg -i noSound1.mp4 -i story1.mp4 -i noSound2.mp4 -i story2.mp4 -t 0.1 -f lavfi -i anullsrc=channel_layout=stereo -filter_complex 
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v0]; 
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v1]; 
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v2]; 
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v3]; 
 [0:a]aformat=sample_rates=48000:channel_layouts=stereo[a0]; 
 [1:a]aformat=sample_rates=48000:channel_layouts=stereo[a1]; 
 [2:a]aformat=sample_rates=48000:channel_layouts=stereo[a2]; 
 [3:a]aformat=sample_rates=48000:channel_layouts=stereo[a3]; 
 [v0][a0][v1][a1][v2][a2][v3][a3]concat=n=4:v=1:a=1[v][a]" 
-map "[v]" -map "[a]" -c:v libx264 -c:a aac -movflags +faststart testOutput.mp4

Вот ошибка:

Stream specifier ':a' in filtergraph description [0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v0];  [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v1];  [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v2];  [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v3];  [0:a]aformat=sample_rates=48000:channel_layouts=stereo[a0];  [1:a]aformat=sample_rates=48000:channel_layouts=stereo[a1];  [2:a]aformat=sample_rates=48000:channel_layouts=stereo[a2];  [3:a]aformat=sample_rates=48000:channel_layouts=stereo[a3];  [v0][a0][v1][a1][v2][a2][v3][a3]concat=n=4:v=1:a=1[v][a] matches no streams.

Теперь немного отдельный вопрос. Если у меня есть N входных видео, где я не знаю, есть ли у них звук или нет, есть ли способ получить al oop, который выполняет вышеуказанное, без большого количества командных строк? Большое спасибо!

1 Ответ

1 голос
/ 07 августа 2020

Может кто-нибудь заметит, что здесь не так?

В вашей команде вы пытаетесь передать звук из noSound1.mp4 ([0:a]) и noSound2.mp4 ([2:a] ) в формат, но эти входы не имеют звука.

Все входы должны иметь звук или не иметь звука: вы не можете их смешивать. Вот для чего нужен anullsr c (бесшумный звуковой генератор). Он сделает фиктивный / беззвучный / заполняющий звук для входов без звука. Для входов без звука вам нужно передать anullsr c ([4] или [4:a] в вашем примере) на concat:

ffmpeg -i noSound1.mp4 -i story1.mp4 -i noSound2.mp4 -i story2.mp4 -t 0.1 -f lavfi -i anullsrc=channel_layout=stereo -filter_complex 
"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v0]; 
 [1:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v1]; 
 [2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v2]; 
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fps=30,format=yuv420p[v3]; 
 [1:a]aformat=sample_rates=48000:channel_layouts=stereo[a1]; 
 [3:a]aformat=sample_rates=48000:channel_layouts=stereo[a3]; 
 [v0][4][v1][a1][v2][4][v3][a3]concat=n=4:v=1:a=1[v][a]" 
-map "[v]" -map "[a]" -c:v libx264 -c:a aac -movflags +faststart testOutput.mp4

Чтобы понять синтаксис [0:a], см. FFMPEG mux видео и аудио (из другого видео) - проблема сопоставления и FFmpeg Wiki: Map .

Теперь немного отдельный вопрос. Если у меня есть N входных видео, где я не знаю, есть ли у них звук или нет, есть ли способ получить al oop, который выполняет вышеупомянутое, без большого количества командных строк?

Нет, но вы можете использовать ffprobe, чтобы определить, есть ли на входе звук или нет, что должно быть полезно при написании сценария решения. См. Использование ffprobe для проверки только аудиофайлов .

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