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ę.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
- lewy górny z 10 px padding:
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.
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
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