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


 

 

 

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