FAQ wczytywanie plików
| Spis treści | Informacje ogólne | Wczytywanie plików | Wczytywanie skryptów | Komunikaty błędów | Rodzaje materiału źródłowego | Problemy z YV12 | Używanie pluginów VirtualDub |
Jak wczytuje się pliki do AviSynth?
Są dwa sposoby:
- używając polecenia AviSource()
- używając polecenia DirectShowSource()
- AviSource() używa platformy Video for Windows (VfW). Jest dość stara i tak naprawdę jedyny powszechnie używany format jaki wspiera to AVI, jednak wspiera go dobrze - paradoksalnie, dzięki temu, że nie obsługuje wielu funkcji nowoczesnych kontenerów, VfW zwraca klatki w dokładnie takiej kolejności, w jakiej są umieszczone w ścieżce wideo. Przy używaniu tego sposobu trzeba jednak pamiętać, że z obsługą pewnych haków na AVI (jak np. dźwięk VBR czy wideo w H.264) mogą pojawić się problemy. Aby otworzyć plik potrzebujesz odpowiedniego kodeka z interfejsem VfW.
- DirectShowSource() - jak sama nazwa wskazuje - używa nowszej platformy DirectShow (DS). Wspiera ona ogromną liczbę różnych formatów obrazu i dźwięku, ale z uwagi na to, że została stworzona z myślą o odtwarzaniu treści multimedialnych, nie ich edycji - nie zawsze klatki są zwracane we właściwej kolejności. Analogicznie, musisz mieć zainstalowane odpowiednie filtry DS, aby otworzyć plik. O tym, który filtr jest używany do obsługi danego formatu, decyduje wartość MERIT.
AviSynth obsługuje tylko po jednej ścieżce audio i wideo. Zanim wczytasz plik upewnij się, że nie zawiera więcej ścieżek - jeśli tak jest, wymuksuj te, z których chcesz korzystać. Możesz też wczytać obraz i dźwięk osobno, z dwóch różnych plików.
Część formatów nie jest poprawnie obsługiwana ani przez VfW, ani przez DS. Dla niektórych powstały dedykowane pluginy, zwykle bardziej wiarygodne od dekoderów VfW/DS, które nastawione są na odtwarzanie, nie na obróbkę treści multimedialnych. Istnieją też pluginy dla części formatów zupełnie nieobsługiwanych przez ww. platformy. Opis niektórych znajdziesz poniżej, zaś pełną listę tutaj.
Wczytując pliki do AviSynth, dobrze jest trzymać się poniższego przewodnika:
- gdy tylko możliwe, spróbuj wczytać swój plik używając AviSource() bądź wyspecjalizowanego pluginu, gdyż daje to najbardziej wiarygodne rezultaty;
- jeśli to się nie uda, użyj DirectShowSource() z zainstalowanym filtrem;
- jeśli to się nie uda, dokonaj konwersji pliku (najlepiej bezstratnej) do wspieranego formatu.
Sporą liczbę różnych formatów wraz ze wskazówkami, jak je wczytywać do AviSynth, opisano poniżej. Miłej lektury :)
Jak wczytać plik AVI?
Użyj AVISource. Przykład:
AVISource("C:\plik.avi")
Jeśli nie chcesz dźwięku:
AVISource("C:\plik.avi",false)
Jeśli AVISource() nie może otworzyć twojego pliku, musisz zainstalować odpowiedni kodek z interfejsem VfW - program GSpot może być pomocny w sprawdzeniu, jakiego kodeka potrzebujesz.
Możesz wymusić użycie konkretnego dekodera przy użyciu parametru fourCC. Zostanie użyty dekoder przypisany do podanego kodu.
## Otwieranie pliku AVI dekoderem Xvid: AVISource("C:\plik.avi", fourCC="XVID")
## Otwieranie pliku avi dekoderem Canopus DV: AVISource("C:\plik.avi", fourCC="CDVC")
Jak wczytać plik zawierający obraz i/lub dźwięk?
Pliki AVI
Używając w takiej sytuacji AviSource(), oprócz odpowiedniego kodeka z interfejsem VfW będziesz potrzebował także kodeka dźwięku, kompatybilnego z platformą ACM (Audio Compression Manager). Odpowiednie kodeki są dostępne dla sporej liczby obsługiwanych przez kontener AVI formatów, jednak nie dla wszystkich. W miarę dokładną listę znajdziesz tutaj - program GSpot może być pomocny w sprawdzeniu, jakiego kodeka potrzebujesz.
Gdy już zainstalowałeś kodeki, plik możesz wczytać poleceniem:
AVISource("C:\plik.avi")
Inne kontenery
Oczywiście nie zawsze będziesz miał do czynienia z prostym AVI. Nowoczesne, bardziej zaawansowane formaty kontenerów multimedialnych - jak MKV, MP4, ASF/WMV i wiele innych - są w systemie Windows odczytywane za pomocą wspomnianego wyżej DirectShow. Nic nie stoi na przeszkodzie, by użyć go do dekodowania także w AviSynth. Może też zajść sytuacja, gdy będziesz chciał użyć dekodera DirectShow do uzyskania zawartości pliku AVI. W obydwu przypadkach, użyte polecenie będzie wyglądało np. tak:
DirectShowSource("C:\plik.mp4")
DirectShow wymaga filtrów - są to pliki z rozszerzeniem .ax - do obsługi kontenera (tzw. splittery) i do dekodowania zawartości (dekodery). Gdy odpowiednie filtry nie zostaną znalezione, AviSynth wyświetli komunikat Rendering failed (...). Dobrym i popularnym splitterem jest Haali Media Splitter, obsługujący pliki AVI, MKV, MP4, OGG, OGM oraz MPEG Transport Stream. Jeśli chodzi o dekodowanie, paczka filtrów ffdshow zawiera biblioteki do obsługi około 80 różnych formatów obrazu i dźwięku.
Obydwa podane powyżej filtry mają własne instalatory - może się jednak zdarzyć, że filtr do jakiegoś mało znanego formatu znajdziesz wyłącznie w postaci pliku AX. Wówczas musisz taki filtr zarejestrować ręcznie.
Jak sprawić, by DirectShow używał do danej zawartości wybranego przeze mnie filtra?
Po pierwsze i najważniejsze: problem nie będzie miał miejsca jeśli będziesz utrzymywał w filtrach porządek, czytał załączoną do nich dokumentację i NIE instalował na ślepo wszystkiego, co ci wpadnie w ręce. Trzymanie się tej zasady pozwala uniknąć problemów z większością oprogramowania, nie tylko z filtrami ;)
Jeśli jednak wiesz co robisz trzymając kilka filtrów obsługujących ten sam format, albo nie masz innego wyboru (bo np. oprócz obsługi wideo MPEG-4 ASP dwa filtry obsługują też inne formaty i koniecznie ich potrzebujesz), będziesz musiał zdecydować, który filtr ma być użyty - oczywiście ten lepszy. Są na to dwa sposoby: pierwszy uniwersalny, drugi działający wyłącznie w AviSynth (i być może innych programach których nie znam).
Modyfikacja wartości MERIT
Jak wspomniano wyżej, wartość MERIT używana jest w DirectShow do określenia, który filtr jest "ważniejszy" od innych i w sytuacjach konfliktowych (gdy do danej zawartości pasują dwa filtry lub więcej) będzie użyty. MERIT można łatwo zmieniać za pomocą programu RadLight Filter Manager. Z listy należy wybrać filtr, po czym ustawić, jak dalece jego MERIT ma się różnić od MERIT_NORMAL, i kliknąć Set Value. Sposób ten może nie zadziałać, gdy filtr posiada własne ustawienia MERIT (np. AC3Filter - aby respektował te ustawienia, należy w opcjach konfiguracyjnych wybrać Prefer other filters).
Użycie GraphEdit
Gdy plik jest otwierany w DirectShow, ten w niewidoczny dla użytkownika sposób konstruuje z odpowiednich filtrów schemat odtwarzania zawartości, nazywany grafem. GraphEdit jest narzędziem do ręcznego tworzenia grafów, pomocnym (nie tylko) dla programistów i dostępnym w Microsoft DirectX SDK. Na szczęście doskonale działa osobno i nie musisz pobierać prawie 450 MB niepotrzebnych narzędzi i bibliotek.
Po otwarciu GraphEdit, kliknij na ikonę Open, z rozwijanej listy formatów wybierz *.* (All Files) i otwórz plik, który chcesz wczytać do AviSynth. Pojawi się automatycznie skonstruowany przez DirectShow graf (lub komunikat błędu, jeśli nie masz odpowiednich filtrów), który możesz dowolnie modyfikować za pomocą klawisza Delete i przycisku Insert filter. Ponieważ nie chcesz odtworzyć pliku, a jedynie przesłać jego zawartość do AviSynth, pamiętaj o usunięciu z grafu wyjścia dźwięku i renderera wideo. Teraz zapisz gotowy graf (File --> Save graph) i otwórz go w AviSynth:
DirectShowSource("C:\plik.grf")
GraphEdit jest dobrym narzędziem, ale ma jedną zasadniczą wadę - od 2002 roku pozostaje niezmienione. Przez ten czas powstały inne programy, spełniające to samo zadanie. Podstawowe działanie wygląda niemal identycznie, więc powyższe wskazówki również powinny działać. Znane programy to:
- GraphStudio - otwarty i darmowy,
- GraphEditPlus - komercyjny, płatny;
Dedykowane pluginy
DirectShow, przy całej swojej uniwersalności i wygodzie (jedno polecenie by wszystkim rządzić) zachowuje niestety wszystkie wady. Jeden format wspiera lepiej, inny gorzej - zazwyczaj lepiej, ale nieraz po wywróceniu skryptu do góry nogami okazuje się, że winowajcą napotkanego problemu jest użyty na początku DirectShowSource(). Dlatego do niektórych - w większości gorzej wspieranych przez DS - rodzajów multimediów, pasjonaci AviSynth napisali dedykowane pluginy. Są w większości dokładniej przetestowane od rozmaitych kombinacji filtrów DS. Używając ich zyskujesz pewność, że zadziałają tak, jak tego oczekujesz. Ok, może nie pewność, ale w każdym razie większe prawdopodobieństwo ;] . Niektóre problematyczne formaty które nie mają własnych pluginów również wyszczególniono poniżej.
Wideo
Format RAW
RAW to tak naprawdę nie format, tylko zbiorcze określenie różnych formatów nieskompresowanego obrazu, używanych w kamerach i aparatach cyfrowych. Plugin RawSource wspiera wszystkie wyposażone w nagłówek YUV4MPEG2, oraz przechowujące czyste dane w formatach kolorów YUV2, YV16, YV12, RGB i Y8.
Przykłady:
# Plik z nagłówkiem YUV4MPEG2: RawSource("C:\plik.yuv") # Plik z danymi w formacie RGBA (należy podać rozdzielczość): RawSource("C:\plik.raw",720,576,"BGRA")
MPEG-1/MPEG-2 - DVD(VOB)/TS/PVA
Pliki TS (transport stream) czy VOB (na płytach DVD-Video) zawierają obraz poddany kompresji MPEG-2. Do ich obsługi służy plugin DGDecode. Aby móc skorzystać z jego dobrodziejstw, należy wpierw za pomocą załączonego DGIndex utworzyć indeks klatek i zapisać w postaci pliku .d2v.
Przykład:
MPEG2Source("C:\indeks.d2v")
ASF (pliki Windows Media)
ASF (Advanced Systems Format) to uniwersalny format kontenera multimedialnego stworzony przez firmę Microsoft. Spotyka się go zazwyczaj w postaci plików Windows Media Video i Windows Media Audio (odpowiednio .wmv i .wma). System Windows posiada (co za niespodzianka) dekoder tych plików, więc odpowiednim poleceniem do ich wczytania jest DirectShowSource.
Formaty Windows Media nie są kompatybilne wstecz - aby móc otworzyć niektóre nowsze pliki na systemach starszych od Windows Vista, potrzebujesz Media Format SDK - wybierz wersję, która wspiera twój system. Pliki ASF są również częściowo wspierane przez FFmpegSource.
Pliki QuickTime (np. MOV)
QuickTime to rodzina kodeków obrazu i dźwięku stworzona przez firmę Apple. Zwykle spotykasz je w postaci plików o rozszerzeniu .mov. Do ich obsługi stworzono dwa (tak, aż DWA!) pluginy: QTSource oraz QTReader. Pierwszy jest bardzo nowy, bardzo dobry, z mnóstwem opcji i jedną wadą: aby działał, musisz zainstalować QuickTime Player - przynajmniej w wersji 6 jeśli wystarczy ci obraz, w wersji 7 i nowszej jeśli chciałbyś mieć dźwięk. Drugi jest tak naprawdę pluginem do programu VirtualDub, ale możesz także użyć go w AviSynth.
Przykłady:
# QTSource: QTInput("C:\plik.mov" # QTReader: QTReader("C:\plik.mov")
Pliki RealMedia (np. RM, RMVB)
RealMedia to kolejna rodzina własnościowych kodeków z własnym formatem kontenera multimedialnego. Popełniła ją firma RealNetworks i jak dotąd nie ma doń dedykowanego pluginu. Aby w miarę bezproblemowo otwierać te pliki w DirectShow, potrzebujesz splittera i kodeków. Pierwszy jest do pobrania [1], kodeki zaś zdobędziesz instalując [2] bądź paczkę Alternative, dostępną także w wersji [3].
MP4/MKV/M2TS/EVO
Wszystkie powyższe formaty są lepiej lub gorzej wspierane przez FFmpegSource. MP4 zawiera, a pozostałe mogą zawierać wideo w H.264/AVC. Jeśli masz z nim do czynienia, możesz posłużyć się DGAVCDecode. Podobnie jak w przypadku DGDecode, wpierw tworzysz za pomocą DGAVCIndex plik projektu, zapisujesz z rozszerzeniem .dga a następnie wczytujesz do AviSynth.
Przykłady:
# FFmpegSource: FFmpegSource("C:\plik.mp4") # DGAVCDecode: AVCSource("C:\indeks.dga")
Jeśli posiadasz odpowiednie filtry, możesz też użyć DirectShowSource.
Audio
MP1/MP2/MP3/MPA/AC3/DTS/LPCM
Wszystkie te formaty są wspierane przez plugin NicAudio.
Przykłady:
# Dźwięk Dolby AC3: NicAC3Source("C:\plik.ac3") # Dźwięk LPCM: NicLPCMSource("C:\plik.lpcm")
AAC/FLAC/OGG
Pliki w tych formatach wczytasz przy pomocy pluginu BassAudio. Obsługuje wszystkie oprócz wielokanałowego dźwięku AAC (z więcej niż dwoma kanałami).
Przykład:
bassAudioSource("C:\plik.ogg")
Jeśli chcesz otwierać surowe, nieumieszczone w żadnym kontenerze ścieżki AAC (pliki .aac) za pomocą DirectShowSource, musisz wyposażyć się w filtr AAC Parser.
WAVE PCM
Do otwierania plików WAVE PCM (rozszerzenie .wav; zawierają nieskompresowany dźwięk) służą dwie funkcje. Wbudowana w AviSynth WavSource, oraz umieszczona w NicAudio od wersji 2.0 RaWavSource. Zasadnicza różnica polega na tym, że pierwsza z nich wspiera tylko pliki o rozmiarach nieprzekraczających 4 GB.
Przykłady:
# WavSource: WavSource("C:\plik.wav") # NicAudio: RaWavSource("C:\plik.wav")
Czy AviSynth umie skopiować fragment ścieżki bez rekompresji, jak VirtualDub w trybie "Direct stream copy"?
Nie. Zarówno obraz, jak i dźwięk są poddawane dekodowaniu przy wczytaniu ich do AviSynth.
Istnieje mod do AviSynth 2.55 dodający wsparcie dla bezpośredniego kopiowania ścieżek. Nazywa się DSynth i możesz go pobrać stąd. Być może pewnego dnia zostanie włączony do oficjalnej kompilacji AviSynth.