FFmpeg - jak przeskalować film, a następnie zastosować znak wodny?

Próbuję przeskalować wideo tak, aby zawsze było 512 szerokości, gdzie wysokość zmienia się proporcjonalnie do oryginalnego wideo. Po przeskalowaniu chcę zastosować znak wodny / nakładkę do filmu, dlatego film będzie skalowany, ale znak wodny nie będzie.

Jestem w stanie osiągnąć każdy z nich oddzielnie za pomocą następujących filtrów:

Skala

-vf "scale=512:-1"

Znak wodny

-vf "movie=watermark.png [watermark]; [in][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]"
Same z powodzeniem działają.

Jednak przy próbie aby połączyć te dwa, Mam trochę problemów.

Posiadanie obu parametrów oczywiście nie działa, ponieważ jeden nadpisuje drugi.

Próbowałem:

-vf "scale=512:-1,movie=watermark.png [watermark]; [in][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]"

Myślałem, że skala zostanie zastosowana najpierw, a następnie znak wodny, ale wszystko, co dostaję, to błąd

Zbyt wiele wejść określonych dla filtra "movie".

Błąd otwierania filtrów!

Następnie zmiana, na a; zaowocowała:

Simple filtergraph "skala = 512: -1; film=watermark.png [watermark]; [in][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out] ' nie ma dokładnie jedno wejście i wyjście.

Błąd otwierania filtrów!

Zakładam, że muszę zrobić coś więcej z filterchains, ale staram się to rozgryźć.

Jakieś pomysły? Z góry dziękuję.
Author: Community, 2012-06-07

3 answers

Możesz użyć opcji -filter_complex z filtrami skali i nakładki:

ffmpeg -i input.mp4 -i logo.png -filter_complex "[0:v]scale=512:-1[bg];[bg][1:v]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" output
  • Zobacz scalei overlay dokumentacja filtra, aby uzyskać więcej informacji.
  • nie ma potrzeby stosowania filtra źródłowego Filmu jak w innych przykładach.
  • możesz dodać -c:a copy, jeśli chcesz skopiować strumieniowo (re-mux) oryginalny dźwięk zamiast go ponownie zakodować. Jest to przydatne, jeśli formaty kontenerów wejściowych i wyjściowych są takie same.
  • W przykładzie umieścimy logo w środku. Dla innych opcji umieszczania:
    • lewy górny z 10 px padding: overlay=10:10
    • górny prawy z 10 px padding: overlay=W-w-10:10
    • dolny prawy z 10 px padding: overlay=W-w-10:H-h-10
    • dolny lewy z 10 px padding: overlay=H-h-10:10
 25
Author: llogan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-28 20:41:46

Dziękuję zarówno @ DiJuMx i @ LordNeckbeard, obaj zbliżyliście mnie do mojego rozwiązania. Nie próbowałem jeszcze opcji filter_complex, ale na pewno wygląda prościej.

Rozwiązanie, które znalazłem to:

-vf "movie=watermark.png [watermark]; [in]scale=512:trunc(ow/a/2)*2 [scale]; [scale][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]"

Zauważ, że Ive zastąpiło -1 w skali, ponieważ mogło spowodować nierówną liczbę pikseli na wysokości wideo podczas skalowania, co spowoduje błędy kodowania.

 16
Author: Olibanum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 17:27:50

Z tego co rozumiem, to może zadziałać:

-vf "movie=watermark.png [watermark]; [in] scale=512:-1,[watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [out]"

Zastosujesz filtr skali do wejścia " [w]".

Niestety nie mam dużego doświadczenia z filtrami na ffmpeg więc nie mogę dalej pomóc. Sorry

 0
Author: DiJuMx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-18 17:29:49