Czy można w jakiś sposób zautomatyzować przetwarzanie filmów? By za jednym zamachem przerobić ich dziesiątki zamiast bawić się z każdym z osobna? Jasne! |
Zgłosił się do mnie jeden z widzów prosząc o pomoc z nietypowym plikiem, który nie chciał mu się prawidłowo zaimportować do Vegas 15.
Dostałem hasło do jego kompoutera, podłączyłem się poprzez sieć (teamviewer) i próbowałem rozwiązać problem. Początkowo sądziłem, iż problemem jest plugin odpowiadający za przetwarzanie filmów .mp4 (C:\Program Files\VEGAS\VEGAS Pro 15.0\FileIO Plug-Ins\compoundplug\compoundplug.dll) i zwykle wystarczy go stamtąd usunąć by wszystko zaczęło działać poprawnie (oczywiście w systemie musisz mieć zainstalowane odpowiednie kodeki). Tu jednak to nie działało. Film prawidłowo odtwarzał się w systemie jednak vegas nie chciał go łykać po załadowaniu pokazując jedynie ścieżkę dźwiękową z samym szumem. Widać było, że coś jest nie tak…
Jeśli podejrzymy szczegóły pliku to widzimy, iż jest on zakodowany poprzez H264 i dźwiękiem sterem w MP3 (bez vbr).
Przeprowadziłem kilka testów i jak się okazuje Vegas nie lubi się z niektórymi formatami dźwięku:
- w przypadku pliku mp4 i zawierania ścieżki z dźwiękiem w MP3 nie ładuje video i tworzy szum zamiast ścieżki dźwiękowej
- w przypadku pliku mp4 i zawierania ścieżki z dźwiękiem w MP2 (lav) nie ładuje ścieżki video choć tym razem prawidłowo załadował ścieżkę audio
- po przetworzeniu dźwięku do AAC (lav) prawidłowo ładuje i obraz i dźwięk
By plik mógł zostać załadowany do Vegasa należałoby go przetworzyć. W tym wypadku użyłem AviDemux (http://avidemux.sourceforge.net/).
Można przekodować format video ale jak się okazuje on w tym wypadku nie przeszkadza (potwierdziła to próba załadowania pliku bez ścieżki dźwiękowej – ładował się). W przypadku audio należy wybrać pozycję AAC (lav) zaś jako format wyjściowy Mp4v2 Muxer. Po czym zapisać plik i powinien się już pozwolić załadować bez problemu.
== PRZETWARZANIE WSADOWE WIELU PLIKÓW ==
No tak – zapytasz – to działa dla jednego pliku. A co z większą ich ilością? By przetworzyć kolejny – należy zamknąć bieżący (inaczej dokleimy go do już istniejącego) poprzez Plik -> Zamknij. Wszystkie wybrane przez nas ustawienia są zachowane więc wystarczy go od razu zapisać pod nową nazwą. Później znów polecenie zamknij i możemy jechać z kolejnym.
Wszystko pięknie – ale co jeśli mam tych plików znacznie więcej? Czy można to zautomatyzować? Można.
Należy utworzyć skrypt bat, który wywoła w odpowiedni sposób avidemux-a oraz przekaże mu jako parametry nazwy i ścieżki do wszystkich plików oraz parametry niezbędne do przeprocesowania plików. Proponuję obejrzeć video, które tłumaczy cały proces.
- Skrypt: (gotowe skrypty są zawarte w plikach do ściągnięcia poniżej)
-
set avidemux="C:\Program Files\Avidemux 2.7 - 64 bits\avidemux.exe" for %%f in ("PLIKI_DO_PRZETWORZENIA/*") do %avidemux% --load "PLIKI_DO_PRZETWORZENIA/%%f" --run "parametry.py" --save "PLIKI_PRZETWORZONE/%%~nf_przet.mp4" --quit
-
- Skrypt z parametrami:
-
#PY <- Needed to identify # #--automatically built-- adm = Avidemux() adm.videoCodec("x264") adm.audioClearTracks() adm.setSourceTrackLanguage(0,"und") adm.audioAddTrack(0) adm.audioCodec(0, "LavAAC"); adm.audioSetDrc(0, 0) adm.audioSetShift(0, 0, 0) adm.setContainer("MP4V2", "optimize=0", "add_itunes_metadata=0")
-
== GOTOWE SKRYPTY ==
- Poniższe pliki wystarczy ściągnąć i gdzieś rozpakować. U mnie pod Windows 10 działały bez problemu.
- By zadziałały powinieneś zainstalować odpowiednią wersję AviDemux dla Windows – w domyślnej ścieżce instalacji (lub zmienić ścieżkę w pliku skryptu na właściwą).
- AviDemux v 2.7.3 – https://www.fosshub.com/Avidemux.html?dwl=Avidemux_2.7.3VC++64bits.exe
- skrypt dla tej wersji z enkoderem x264 = https://hakimodo.pl/INNE/INNE/technicznie/24/Kompresja_AVIDEMUX_273_x264.7z
- skrypt dla tej wersji z enkoderem NvEnc = https://hakimodo.pl/INNE/INNE/technicznie/24/Kompresja_AVIDEMUX_273_nvenc.7z
- AviDemux v 2.7.1 – https://www.fosshub.com/Avidemux-old.html?dwl=avidemux_2.7.1_win64.exe
- skrypt dla tej wersji z enkoderem x264 = https://hakimodo.pl/INNE/INNE/technicznie/24/Kompresja_AVIDEMUX_271_x264.7z
- skrypt dla tej wersji z enkoderem NvEnc = https://hakimodo.pl/INNE/INNE/technicznie/24/Kompresja_AVIDEMUX_271_nvenc.7z
- AviDemux v 2.7.3 – https://www.fosshub.com/Avidemux.html?dwl=Avidemux_2.7.3VC++64bits.exe
= PRZETWARZANIE WSADOWE WIELU PLIKÓW =
Ponieważ przełączniki linii komend nie pozwalają skorzystać ze wszystkich funkcji programu a klikanie z każdym plikiem jest żmudne i bez sensu metodą prób i błędów doszedłem w jaki sposób można to zautomatyzować. Aidemux potrafi przetwarzać skrypty w języku python.
- Tworzymy niezbędne katalogi (całość zawarłem w archiwum): skrypty_przetwarzania_AVIDEMUX
- Edytujesz plik skrypt.bat by wskazać mu ścieżkę do programu Avidemux (który oczywiście musisz mieć zainstalowany). Najprościej jest to zrobić w następujący sposób: klikasz prawym przyciskiem myszki na ikonkę avidemux na pulpicie. Wybierasz właściwości. Kopiujesz wartość z “Element docelowy” i powinna podmieniona w skrypcie tak by wskazywać ścieżkę docelową do programu gdzie masz go zainstalowanego (set avidemux=”C:\Program Files\Avidemux 2.7 – 64 bits\avidemux.exe”) – inaczej całość nie zadziała.
- Do katalogu vwgrywasz pliki, które chcesz przerobić do MP4
- Uruchamiasz skrypt skrypt.bat (proponuję najpierw spróbować z 1-2 plikami do przetworzenia) i zostawiasz komputer na chwilę by mógł przetworzyć wszystkie pliki. Avidemux będzie wielokrotnie uruchamiany i zamykany (tyle razy ile wrzuciłeś plików do przetworzenia)
- Po zakończeniu całego procesu w katalogu PLIKI_PRZETWORZONE znajdziesz wszystkie pliki, które zostaną przetworzone. Ich nazwą wynikową będzie NAZWA_przet.mp4 – dla przykładu plik “wesele.mp4” zostanie przetworzony i zapisany jako “wesele_przet.mp4”
= CO DOKŁADNIEJ ROBIĄ TE SKRYPTY? =
Skrypty przetwarzają filmy przerabiając je na format, który jest bez problemu łykany przez Vegas-a (czyli x264 + aac (lav) w kontenerze mp4v2).
- skrypt.bat – jest skryptem powłoki uruchamiającym w odpowiedni sposób avidemux dla każdego z plików znalezionych w katalogu PLIKI_DO_PRZETWORZENIA
- dla każdego znalezionego pliku do przerobienia ze wskazanego katalogu ładowany jest avidemux z parametrami zawartymi w pliku parametry.py
- parametry pozwalają na operację na GUI avidemux dzięki czemu można wybrać każdą z opcji (co jest niemożliwe z linii komend ponieważ nie ma tam odpowiednich przełączników)
- wybrałem jako kodek x264 dzięki czemu u każdego powinno to zadziałać.
= PERSONALIZACJA MOICH SKRYPTÓW =
Jeśli potrzebujesz możesz zmodyfikować moje skrypty według swojego widzimisię.
- Jeśli chcesz by skrypt zapisywał oryginalne nazwy plików, bez tego “_przet” w skrypcie “skrypt.bat” zamień frazę “%%~nf_przet.mp4” na “%%~nf.mp4”
- Skrypt parametry.py zawiera parametry zmiany odpowiednich funkcji w samym GUI avidemux i możesz spokojnie dokładać swoje. Wystarczy załadować plik do przetworzenia, poustawiać wszystko co jest niezbędne i wygenerować nowy plik z parametrami korzystając z funkcji zapisywania konfiguracji do pliku (File -> Project Script -> Save as) – a później go przeedytować i zmodyfikować podane przeze mnie rozwiązanie na własne potrzeby
- Jeśli dysponujesz kartą NVidia warto jest zmienić domyślny enkoder jakim jest x264 na kodowanie za pomocą karty graficznej – co będzie znacznie szybsze (ale nie będzie miało większego znaczenia jeśli przetwarzasz krótkie filmiki). Wtedy należy:
- zahaszować lub usunąć wpis adm.videoCodec(“x264”)
- dodać wpis adm.videoCodec(“ffNvEnc”, “preset=2”, “profile=3”, “gopsize=100”, “bframes=0”, “bitrate=10000”, “max_bitrate=20000”)
- ten wpis jest już obecny w pliku z parametrami – wystarczy go odblokować. Użyte parametry są domyślne (profile, presety i jakość kodowania) i można je pominąć – adm.videoCodec(“ffNvEnc”)
- W skrypcie użyta jest zubożona przeze mnie wersja enkodera x264 – adm.videoCodec(“x264”)
- pełna linia komend wyglądała tak: adm.videoCodec(“x264”, “useAdvancedConfiguration=True”, “general.params=AQ=20”, “general.threads=99”, “general.preset=”, “general.tuning=”, “general.profile=”, “general.fast_decode=False”, “general.zero_latency=False”, “general.fast_first_pass=True”
, “general.blueray_compatibility=False”, “general.fake_interlaced=False”, “level=-1”, “vui.sar_height=1”, “vui.sar_width=1”, “MaxRefFrames=3”, “MinIdr=25”, “MaxIdr=250”, “i_scenecut_threshold=40”, “intra_refresh=False”
, “MaxBFrame=3”, “i_bframe_adaptive=1”, “i_bframe_bias=0”, “i_bframe_pyramid=2”, “b_deblocking_filter=True”, “i_deblocking_filter_alphac0=0”, “i_deblocking_filter_beta=0”, “cabac=True”, “interlaced=False”
, “constrained_intra=False”, “tff=True”, “fake_interlaced=False”, “analyze.b_8x8=True”, “analyze.b_i4x4=True”, “analyze.b_i8x8=True”, “analyze.b_p8x8=True”, “analyze.b_p16x16=False”, “analyze.b_b16x16=False”
, “analyze.weighted_pred=2”, “analyze.weighted_bipred=True”, “analyze.direct_mv_pred=1”, “analyze.chroma_offset=0”, “analyze.me_method=1”, “analyze.me_range=16”, “analyze.mv_range=-1”, “analyze.mv_range_thread=-1”
, “analyze.subpel_refine=7”, “analyze.chroma_me=True”, “analyze.mixed_references=True”, “analyze.trellis=1”, “analyze.psy_rd=1.000000”, “analyze.psy_trellis=0.000000”, “analyze.fast_pskip=True”, “analyze.dct_decimate=True”
, “analyze.noise_reduction=0”, “analyze.psy=True”, “analyze.intra_luma=11”, “analyze.inter_luma=21”, “ratecontrol.rc_method=0”, “ratecontrol.qp_constant=0”, “ratecontrol.qp_min=10”, “ratecontrol.qp_max=51”
, “ratecontrol.qp_step=4”, “ratecontrol.bitrate=0”, “ratecontrol.rate_tolerance=1.000000”, “ratecontrol.vbv_max_bitrate=0”, “ratecontrol.vbv_buffer_size=0”, “ratecontrol.vbv_buffer_init=1”, “ratecontrol.ip_factor=1.400000”
, “ratecontrol.pb_factor=1.300000”, “ratecontrol.aq_mode=1”, “ratecontrol.aq_strength=1.000000”, “ratecontrol.mb_tree=True”, “ratecontrol.lookahead=40”
- pełna linia komend wyglądała tak: adm.videoCodec(“x264”, “useAdvancedConfiguration=True”, “general.params=AQ=20”, “general.threads=99”, “general.preset=”, “general.tuning=”, “general.profile=”, “general.fast_decode=False”, “general.zero_latency=False”, “general.fast_first_pass=True”
- Dokumentacja tycząca się przełączników skryptu znajduje się tutaj: http://avidemux.sourceforge.net/doc/en/script.xml.html
== PRZETWARZANIE JEDYNIE Z LINII KOMEND (np. do formatu AVI) ==
Próbowałem też wykorzystać linię komend i odpalić program z parametrami by móc przetworzyć wszystkie pliki jednocześnie. Dokumentację znajdziesz tutaj. To jednak nie zdało rezultatu. Nadal nie byłem w stanie zapisać wyniku w kontenerze MP4 z dźwiękiem w formacie AAC. Jak się okazało wszystkie próby spełzły na niczym – powodem jest upośledzony tryb linii poleceń – nie udostępnia on wszystkich opcji jakie możesz wyklikać z menu.
http://www.avidemux.org/admWiki/doku.php?id=using:command_line_usage lub tutaj http://avidemux.sourceforge.net/doc/en/command.xml.html
Gdyby ktoś jednak potrzebował i chciał się pobawić to zostawiam dla potomności wskazówki:
- należy utworzyć gdzieś katalog.
- wgrać do niego pliki *.mp4
- utworzyć skrypt wykonywalny przetworz.bat
- wrzucić do niego:
set avidemux="C:\Program Files\Avidemux 2.7 - 64 bits\avidemux.exe" set videocodec=XVID4 set audiocodec=MP3 for %%f in (*.mp4) do %avidemux% --audio-process --audio-codec %audiocodec% --audio-normalize --audio-bitrate 224 --video-codec %videocodec% --force-alt-h264 --load "%%f" --output-format AVI --save "%%f.avi" --quit
- Powyższe to tylko przykład. Pod zmienną avidemux musisz podstawić swoją ścieżkę systemową do programu.
- pod zmienną videocodec trzeba wstawić pożądany format kodeka
- plik zostanie zapisany jako NAZWA.avi (np. “1.mp4.avi”)