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 komputera, 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”)