T24 = TECHNICZNIE == Przetwarzanie wsadowe (hurtowa konwersja) filmów na inny format

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 ==


 

 

 

= 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”
  • 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”)