Skomplikowane menu rozwijane w ffmpeg jest możliwe?

0

Praca nad projektem badawczym z systemem kolorów, który łączy między obrazami czerwonym (R) i zielonym (G). Chcemy wypróbować różne tryby przeniesienia tego materiału do domeny cyfrowej. W tym celu chcemy wypróbować różne sekwencje rozwijane.

Chcemy wyświetlać w 48 klatkach na sekundę lub 60 klatkach na sekundę.

  • Potrójna każda ramka: R1 R1 R1 G1 G1 G1
  • Potrójna każda ramka2: R1 G1 R1 G1 R1 G1
  • Wstaw czarną ramkę: R1 R1 R1 G1 G1 G1 BL
  • Wstaw czarną ramkę2: R1 R1 R1 G1 G1 BL R2 R2 G2 G2 G2 BL
  • Wstaw czarną ramkę3: R1 G1 BL R2 G2 BL
  • Wstaw czarną ramkę 4: R1 R1 BL G1 G1 BL

...i tak dalej

Czy jest to możliwe w ffmpeg?

Alternatywą jest napisanie prostego skryptu w celu skopiowania i zmiany numeracji sekwencji obrazów. Oczywiście byłoby to szybsze i prostsze, aby zrobić to wszystko z poziomu ffmpeg.

Dziękuję za pomoc

Jaskółka oknówka
źródło

Odpowiedzi:

1

Można to zrobić w ffmpeg za pomocą szeregu filtrów.

Istnieją dwa czynniki:

a) zmiana liczby ramek oraz
b) sekwencjonowanie ramek

Użyjemy filtra fps, aby zwiększyć liczbę klatek. Filtr wykona w tym celu regularne powielanie. Następnie filtr shuffleframe, aby osiągnąć wymaganą zmianę kolejności sekwencji. W razie potrzeby będziemy również potrzebować filtra drawbox, aby wygenerować czarne ramki. Sekwencje te można wyprowadzać z dowolną częstotliwością klatek.

Będziemy spożywać każdą sekwencję obrazów z prędkością 1 kl./s, ponieważ to upraszcza obliczenia.

Dla

Potrójna każda ramka: R1 R1 R1 G1 G1 G1

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=3,settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

Filtr fps służy do trzykrotnego zliczania każdej klatki. Ze względu na to, jak działa filtr fps, musimy zresetować bazę czasu strumienia, aby uzyskać wystarczającą rozdzielczość dla kolejnych kroków. Jest ustawiony na AVTB, tj 1/1000000. Sekundy. Następnie ramki są numerowane w odstępach 1/48 sekundy. Wreszcie wyjściowa liczba klatek na sekundę jest ustawiona na 48.

Potrójna każda ramka2: R1 G1 R1 G1 R1 G1

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=3,shuffleframes=0 3 0 3 0 3,settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

Fps trzykrotnie każdą ramkę, więc 0 3 0 3 0 3wysyła sześć klatek przy użyciu pierwszej kopii R1 i G1.

Wstaw czarną ramkę: R1 R1 R1 G1 G1 G1 BL

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=4,shuffleframes=0 0 0 4 4 4 4 -1,drawbox=t=fill:enable=not(mod(n+1\,7)),settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

Tutaj czterokrotnie każdą klatkę, a następnie użyj losowego, aby zachować 7 z każdej 8 klatek, upuszczając ostatnią. Następnie użyj drawbox za pomocą, enableaby każda 7. ramka była czarna ( t=fillrysuje jednolite pudełko. Domyślnym kolorem jest czarny).

Wstaw czarną ramkę2: R1 R1 R1 G1 G1 BL R2 R2 G2 G2 G2 BL

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=3,shuffleframes=0 0 3 3 3 3:enable='mod(floor(n/6),2)',drawbox=t=fill:enable=not(mod(n+1\,6)),settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

Nieco trudniejsze. shguffleframes wystarczy zastosować do każdego alternatywnego zestawu 6 ramek. Używamy do tego edycji osi czasu, tj. enableOpcji.

Wstaw czarną ramkę3: R1 G1 BL R2 G2 BL

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=2,shuffleframes=0 2 2 -1,drawbox=t=fill:enable=not(mod(n+1\,3)),settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

Podwoj liczbę klatek i zachowaj 3 klatki, rysując czarny na 3, a upuszczając na 4.

Wstaw czarną ramkę 4: R1 R1 BL G1 G1 BL

ffmpeg -framerate 1 -i frames%04d.jpg -vf "fps=3,drawbox=t=fill:enable=not(mod(n+1\,3)),settb=AVTB,setpts=N/48/TB" -r 48 -y out.mp4

Prosty. Po prostu spraw, aby każda trzecia ramka była czarna.

Gyan
źródło
0

Jest to nie tylko możliwe, ale także łatwe i wydajne: użyj concatpliku

Zakładając, że masz swoje klatki w r1.png, ... g2.pngitp. I 48 Hz (a więc baza czasowa 20,8333 .. ms) fragment pliku konkat

file 'r1.png'
duration 0.0625
file 'g1.png'
duration 0.0625

da 3 czerwone ramki 1, a następnie 3 zielone ramki 1 (20,8333 .. * 3 = 62,5)

Za pomocą tego rodzaju fragmentów możesz zbudować dowolną sekwencję, a następnie uruchomić

ffmpeg -i /path/to/concatfile -c.... /path/to/outfile

Aby utworzyć klip.

Eugen Rieck
źródło