FFMPEG: карточка заголовка для объединенного видео приводит к замедленному

#audio #ffmpeg #bitrate

#Аудио #ffmpeg #битрейт

Вопрос:

У меня есть три клипа, которые я извлек из более длинного видео. Когда я объединяю их вместе, все работает нормально, как и следовало ожидать, поскольку все они получены из одного источника.

Теперь я хочу добавить карточку заголовка в начало объединенного видео.

Я сгенерировал изображение в GIMP с теми же размерами, что и видеокадры, а затем использовал ffmpeg для создания из него 5-секундного видео. Когда я объединил его перед тремя другими, я столкнулся с проблемами.

Сегмент карточки заголовка воспроизводится правильно, а затем остальные сегменты (как видео, так и аудио) в замедленном режиме. Также таблица титров работает дольше 5 секунд, и аудио основного сегмента начинается перед соответствующим видео.

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

что у меня есть до сих пор:

мой сценарий генерации:

 #!/bin/bash

ffmpeg -y -ss 0:03:33 -t 0:0:33.5 -i seg1.vob -filter:a "volume=4" seg1.mp4
ffmpeg -y -ss 0:13:25.5 -t 0:0:57 -i seg1.vob -filter:a "volume=4" seg2.mp4
ffmpeg -y -ss 0:16:25.5 -t 0:0:43 -i seg1.vob -filter:a "volume=4" seg3.mp4
ffmpeg -y -ss 0:7:10 -t 0:0:10 -i seg1.vob -filter:a "volume=4" -vn -b:a 394k title.mp3
ffmpeg -y -loop 1 -i title.png -t 0:0:5 -i title.mp3 -c:a aac -b:a 394k -shortest title.mp4 
ffmpeg -y -f concat -safe 0 -i contents.txt -c copy merged.mp4 
  

и contents.txt:

 file 'title.mp4'
file 'seg1.mp4'
file 'seg2.mp4'
file 'seg3.mp4'
  

ffprobe на сегменте 1.mp4:

 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'seg1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.20.100
  Duration: 00:00:33.52, start: 0.000000, bitrate: 677 kb/s
    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 720x480 [SAR 32:27 DAR 16:9], 275 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 30k tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, 6 channels, fltp, 394 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
  

и для title.mp4:

 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'title.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf58.20.100
  Duration: 00:00:05.02, start: 0.000000, bitrate: 1290 kb/s
    Stream #0:0(und): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D), yuv420p, 720x480 [SAR 191:194 DAR 573:388], 898 kb/s, 25 fps, 25 tbr, 12800 tbn, 25 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 389 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
  

Ответ №1:

Для правильного объединения все входные данные должны иметь одинаковые атрибуты.

Ваши варианты различаются по частоте кадров, временной базе, SAR / DAR и расположению аудиоканалов.

Поскольку вы все равно фильтруете и перекодируете каждый сегмент, вы можете сделать все это одной командой:

 ffmpeg -loop 1 -t 5 -framerate 30000/1001 -i title.png -ss 0:7:10 -t 0:0:10 -i seg1.vob -ss 0:03:33 -t 0:0:33.5 -i seg1.vob -ss 0:13:25.5 -t 0:0:57 -i seg1.vob -ss 0:16:25.5 -t 0:0:43 -i seg1.vob -filter_complex "[0:v]setsar=32/27[title];[title][1:a][2:v][2:a][3:v][3:a][4:v][4:a]concat=n=4:v=1:a=1[v][aud];[aud]volume=4[a]" -map "[v]" -map "[a]" output.mp4
  

Комментарии:

1. Да, это работает! Спасибо. Теперь мне нужно просмотреть документы, чтобы я понял, почему 🙂