Czy tworzysz wideo z obrazów i dźwięku o różnym czasie trwania obrazu za pomocą FFMPEG?

1

Co chcę robić:

Mam x ilość zdjęć png / jpg i chcę je pokazywać z różnym czasem trwania, czasem dłuższym i krótszym.

  • a1.jpg Pierwsze zdjęcie pozostaje na 3 sekundy
  • a2.png pozostaje przez 10 sekund
  • a3.jpg pozostaje do końca dźwięku

Wideo powinno być tak długie, jak audio.mp3

to jest mój kod do tej pory po przeczytaniu dokumentacji, nie jestem pewien, co jest nie tak, dostaję uszkodzony film bez dźwięku i pokazuje tylko ostatni obraz.

Chciałbym również wyśrodkować obrazy, jeśli to możliwe.

ffmpeg -y \
  -loop 1 -t 1 -i a1.jpg \
  -loop 1 -t 1 -i a2.jpg \
  -loop 1 -t 4 -i a3.jpg \
  -loop 1 -t 1 -i a4.png \
  -loop 1 -t 1 -i a5.png \
  -i audio.mp3 \
  -c:v libx264 -pix_fmt yuv420p -c:a copy video.mp4

próbować

ffmpeg -y -framerate 15 \
  -loop 1 -t 1 -i a1.jpg \
  -loop 1 -t 1 -i a2.jpg \
  -loop 1 -t 4 -i a3.jpg \
  -loop 1 -t 1 -i a4.png \
  -loop 1 -t 1 -i a5.png \
  -i audio.mp3 \
  -c:v libx264 -pix_fmt yuv420p -c:a copy \
  -filter_complex " \
  [0]setdar=16/9[a1],[a1]scale=720x406[a];[1]setdar=16/9[b1],[b1]scale=720x406[b];[2]setdar=16/9[c1],[c1]scale=720x406[c];[3]setdar=16/9[d1],[d1]scale=720x406[d];[4]setdar=16/9[e1],[e1]scale=720x406[e]; 
  [a][b][c][d][e]concat=n=5,format=yuv420p[v],[v]scale=720x406[v1],[v1]setdar=16/9[v2]" \
  -map "[v2]" -c:a copy out.mp4
Muhammad Umer
źródło

Odpowiedzi:

3

Podstawowym szablonem jest

ffmpeg -y \
  -loop 1 -t 1 -i a1.jpg \
  -loop 1 -t 1 -i a2.jpg \
  -loop 1 -t 4 -i a3.jpg \
  -loop 1 -t 1 -i a4.png \
  -loop 1 -i a5.png \
  -i audio.mp3 \
  -filter_complex "concat=n=5" -shortest \
  -c:v libx264 -pix_fmt yuv420p -c:a aac video.mp4

tSpecyfikacja dla każdego obrazu ustawia czas jego trwania. tZa ostatni obraz powinien zostać pominięty, jeśli chcesz, wideo trwać aż dźwięk kończy.

Używam filtra konkat do łączenia wszystkich wejść wideo. Dobrą praktyką jest oznaczanie, które wejścia dołącza filtr konkat, ale jeśli nie zostanie określony, filtr pobierze pierwsze N -idanych wejściowych, gdzie N jest wartością ustawioną w filtrze konkat. Wszystkie obrazy muszą mieć tę samą rozdzielczość i proporcje.

Twoje polecenie kopiuje dźwięk, ale MP3, chociaż dozwolone, nie jest standardem w MP4, a niektóre odtwarzacze, takie jak Quicktime, nie odtwarzają pliku, więc zmieniłem go na AAC.


W przypadku obrazów o nierównych rozmiarach zmień filter_complex na

"[0]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i0];
 [1]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i1];
 [2]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i2];
 [3]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i3];
 [4]scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1[i4];
 [i0][i1][i2][i3][i4]concat=n=5"

W i H należy zastąpić wartościami liczbowymi docelowej szerokości i wysokości wideo.

Gyan
źródło
czy można przeskalować każdy obraz, aby zdefiniować wysokość rozdzielczości. Powiedzmy, że ustawiłem rozdzielczość na 720/460 ... a jeśli jakakolwiek wysokość obrazu jest niższa, to przeskaluj ją do 460. Posiadanie tej samej wysokości i szerokości wymagałoby innej operacji, aby uzyskać je wszystkie
Muhammad Umer
Cóż, wymagana jest ta sama rozdzielczość - W i H - niezależnie od tego, czy jest wykonywana wewnątrz czy na zewnątrz ffmpeg.
Gyan
Czy mogę założyć, że pierwszym obrazem jest rozdzielczość docelowa?
Gyan
Ok tak, można założyć
Muhammad Umer
1
Tak, ale dane wyjściowe nie będą szeroko kompatybilne.
Gyan