Strumienie do przetwarzania filmu

0

Załóżmy, że chciałbym przetworzyć film jakimś nietypowym algorytmem. Głównie chodzi o przetworzenie obrazu.

Nie chodzi tu o sam algorytm, tylko o "otoczkę", Przykładowo, mam nietypowy algorytm "telecine" z wyostrzeniem. Wobec moich obecnych umiejętności i możliwości zrobiłbym to następująco:

  1. Za pomocą programu VirtualDub lub ffmpeg przekonwertowałbym film na serię ponumerowanych plików BMP lub PNG w ilości odpowiadającej liczbie klatek w filmie.
  2. Mój program wczytywałby bitmapy, robił to, co ma zrobić, np. usunąć do 5 klatkę, a pozostałe wyostrzyć. Program wytworzyłby nową serię plików bitmapowych.
  3. Za pomocą programu AVIDemux lub ffmpeg wczytałbym te bitmapy, ustawił FPS na taki, jaki być powinien i przekonwertował na film. Ścieżkę dźwiękową bym podstawił z oryginalnego filmu.

Swój program telecine bym tworzył w C# lub w Java lub w C++ z Qt (który ma w sobie biblioteki do wczytywania i zapisywania bitmap). Większej różnicy mi nie robi, który z tych trzech, w kazdym razie, każdy z nich ma już wbudowane funkcję, za których pomocą mogę wczytać plik PNG, cokolwiek na nim zrobić, traktując jako tablice bajtową nieskompresowanego obrazu i zapisać jako PNG. Preferowałby w kolejności C#, Java, C++.

W jaki sposób na Linux lub ewentualnie na Windows można bezpośrednio wczytać plik z filmem, żeby do swojego programu wczytywać bezpośrednio kolejne klatki z filmu, zamiast konwertować na obrazki? W którym z wyżej wymienionych technologii (.NET, JVM, Qt) to da się zrobić?

Tak samo, w jaki sposób najlepiej zrobić takie coś, że przetworzony film nie będę zapisywać w obrazkach, tylko klatki w miare ich tworzenia będe wysyłać od razu do innego programu, który po wybraniu kodeka będzie od razu wytwarzać film?

Chodzi tak naprawdę o to, żeby pominąć tworzenie i wczytywanie obrazków, bo ich tworzenie zajmuje czas, zabiera dużo miejsca na dysku (dla filmu SD jako tako da radę, można liczyć w przybliżeniu 100GB na godzinę filmu, dla HD już jest ciężko) i spowalnia to system, bo choćby usunięcie katalogu zawierającego setki tysięcy małych plików troche trwa, otwarcie katalogu potrafi zawiesić system.

To są tak naprawdę dwa zagadnienia, o które się pytam, bo przetworzenie istniejącego filmu nie musi wiązać się z wytworzeniem nowego filmu (na przykład uzyskanie informacji, czy na filmie występuje twarz pasująca do wzorca), tak samo wytwarzanie filmu nie musi być na podstawie innego filmu (na przykład animacja fraktala).

1
andrzejlisek napisał(a):

W jaki sposób na Linux lub ewentualnie na Windows można bezpośrednio wczytać plik z filmem, żeby do swojego programu wczytywać bezpośrednio kolejne klatki z filmu, zamiast konwertować na obrazki? W którym z wyżej wymienionych technologii (.NET, JVM, Qt) to da się zrobić?

FFmpeg ktory znasz ma API (C) wiec to samo co robisz osobnym programem mozesz zrobic z kodu. Ale ostatnio jak tam zagladalem (daaawno temu) dokumentacja albo byla fatalna albo jej nie bylo i trzeba bylo przygladac sie jak autorzy korzystaja w programach konsolowych.
Bardziej typowo: OpenCV (natywne API: C++) ma wszystko co potrzebujesz.

Tak samo, w jaki sposób najlepiej zrobić takie coś, że przetworzony film nie będę zapisywać w obrazkach, tylko klatki w miare ich tworzenia będe wysyłać od razu do innego programu, który po wybraniu kodeka będzie od razu wytwarzać film?

Najprosciej poszukac libki ktora to zrobi. Ja bym zaczal od sprawdzenia libVLC. Nie wiem czy umozliwia wysylanie. Ja z tego korzystalem do wyswietlania strumienia video (a tak naprawde to nie bylo to bezposrednio libVLC tylko: https://github.com/vlc-qt/vlc-qt).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.