2012-02-06 13 views
12

Próbuję programowo nakładać obrazy lub wideo na inny film przy użyciu FFmpeg. Wygląda na to, że AVFilter może to zrobić.Programowo nakładka/znak wodny FFmpeg AVFilter

Istnieje wiele przykładów, jak to zrobić lub coś podobnego z linii poleceń, jednak nie znalazłem żadnych przykładów użycia programu AVFilter programowo oprócz doc/examples/filtering.c, który pomaga mi, ale nie do końca. Mogę już dekodować i kodować wideo, po prostu muszę nauczyć się filtrować dekodowane ramki i dodać znak wodny.

Czy są jakieś przykłady użycia programowo libavfilter?

Czy są przykłady użycia nakładek lub filtrów filmowych?

+0

Przykład kodu można łatwo zmodyfikować, aby zastosować dowolny filtr. Jaki jest problem? Przykłady użycia nakładek i filtrów filmowych można znaleźć w [Jak znak wodny wideo za pomocą FFmpeg] (http://www.idude.net/index.php/how-to-watermark-a-video-using-ffmpeg). –

+1

Problem z tym przykładem polega na tym, że jest on przeciążony (2 filtry, wykres filtru itd.). Dla kogoś, kto jest nowy i chce dowiedzieć się, jak zastosować jeden AVFilter, jest to mylące, ponieważ nie wyjaśnia, co jest absolutnie niezbędne, aby zacząć. –

Odpowiedz

7

Polecenie:

ffmpeg –i inputvideo.avi -vf "movie=watermarklogo.png [watermark]; [in][watermark] overlay=10:10 [out]" outputvideo.flv 

produkuje film z obrazem "watermarklogo.png" w lewym górnym rogu. Wywołanie tego polecenia z innego programu powinno być dość proste.

Złamanie to w dół po trochu, żeby go zrozumieć:

ffmpeg jest program będziesz używać do dodawania znaku wodnego.

-i służy do określania plików wejściowych.

inputvideo.avi to plik wejściowy określony przez -i.

służy do określenia filtra wideo. W tym przypadku jest to wszystko w cudzysłowach.

movie=watermarklogo.png załaduje plik, którego chcesz użyć jako znaku wodnego. Tutaj ładujemy plik jako źródło wideo (przy użyciu movie) niezależnie od tego, czy plik jest plikiem wideo. W tym przypadku jest to obraz.

[watermark] oznacza właśnie załadowany plik. Ta etykieta zostanie wykorzystana w pozostałej części kodu.

[in] i [out] odnoszą się do strumienia wejściowego i strumienia wyjściowego wideo.

overlay jest używany zaraz po etykiecie [watermark], aby się do niej odnosił. W tym prostym przypadku umieszczamy overlay pod 10:10. Oznacza to, że znak wodny zostanie przesunięty o 10 pikseli od góry i od lewej strony. Jeśli chcesz uzyskać prawy dolny róg, użyjesz overlay=main_w-overlay_w-10:main_h-overlay_h-10, gdzie main_w jest szerokością strumienia wejściowego, overlay_h jest wysokością pliku nakładki i tak dalej.

Wreszcie, outputvideo.flv jest wyraźnie plikiem, do którego chcesz zapisać wyniki.

Dodatkowe informacje:

znalazłem tej informacji za pośrednictwem the site Dmitry had mentioned w komentarzach. Alex wspomniał, że ta strona może być zbyt skomplikowana dla kogoś, kto jest nowy w takich rzeczach.Jednak nigdy nie robiłem czegoś takiego iw ciągu kilku minut miałem wyniki, które według mnie są poszukiwane.

Uwaga: miałem kłopoty moment, kiedy uzyskiwanie błąd:

error while opening encoder for output stream #0.1 

Jeśli masz ten sam problem, prawdopodobnie trzeba ręcznie ustawić częstotliwość próbkowania z wykorzystaniem parametru -ar (np -ar 22050).

+0

Czy możesz określić czas dla znaku wodnego? powiedzmy, że chcę, aby znak wodny zaczynał się o 00:00 i znikał o 01:00, czy to możliwe? – rroche

+0

@rroche Sprawdź [ten post] (http://stackoverflow.com/questions/9160771/ffmpeg-watermark-first-30-second). Odpowiedź Felixa jest prawdopodobnie najprostsza, ale odpowiedź Dmitry'ego (ten sam Dmitrij z góry) jest nieco staranna i pozwala na zanikanie znaku wodnego. – golmschenk

+4

Pytanie dotyczy korzystania z biblioteki AVFilter, a nie wywoływania plików binarnych FFMPEG. – Erik