ホームプレーヤー向けのバッチビデオ変換

今日、大きなビデオライブラリを所有することは珍しくなく、通常はすべてを最高の品質で収集しようとします。 ただし、コインのもう一方の側面は、古い家庭用プレーヤー、古代のラップトップ、および他のポータブル機器との非互換性です。



これは、家庭での快適さの一般的な理由で出くわしました。 Windowsで優れたメディアステーションを使用し、60 インチのプラズマと6チャンネルサウンドを接続し、魂に合わせてAutoHotkeyのスクリプトを記述し、 WinLIRC USB IRレシーバーで書き直しました。寝室のカバーの下からrawい出します。場合によっては、主要な小売チェーンの1つの店で、セールで購入した単純な40インチの収穫機があります。 LCD TVに組み込まれた家庭用プレーヤーの機能は、あらゆるサイズのフラッシュドライブとSDカードを読み取るのに十分であることが判明しましたが、形式ではAVIおよびMPEG-4-ASPコーデックとそれより弱いコーデックに限定されることが判明しました。



解決策は簡単でした。AVIで視聴されていない数百の映画を追い越し、torrentがrtorrentをホームサーバーにダウンロードするときにLiteバージョンを自動的に作成しました。 したがって、サーバーはGentooを実行しているため、ソリューションはWindowsとLinuxの両方で動作するはずです。



しかし、技術的には、これをすべて簡単に実行することはそれほど簡単ではありませんでした。 ブラックジャックと他の見掛け倒しを備えたスクリューコンバーターは、インストールを試行せずにすぐに一掃され、残りはクロスプラットフォーム実装と通常のCLIインターフェースの両方を備えたAvidemuhのみでした 。 プロセスを自動化し、機器に本来の動作、つまり動作をさせるためだけに残ったのです。



Avidemuxスクリプトオートメーション


実際、AvidemuxのCLIインターフェースにはかなり欠陥があることが判明しましたが、プロジェクト構成をスクリプトに書き込んでから実行オプションで実行する機能を節約できます。



avidemux2_cli --run script
      
      





スクリプト形式を見るのはとても簡単です。このため、Avidemux GUIバージョンを実行し、必要なすべての設定を行ってから、プロジェクトをファイルに保存するだけで十分です。 このファイルには、コーデックと変換フィルターのすべての設定が含まれています。



実際にAvidemuxを使用してコンテナを変更するには、ビデオをトランスコードせずに行うことができますが、私の場合、出力ファイルの解像度を変更し、幅を720ピクセルに制限する必要がありました。 ただし、幅と高さをピクセル単位で明示的に指定することを除いて、出力解像度を設定する他の方法が見つからなかったため、すべてのファイルに1つのスクリプトを使用するというアイデアは不要になりました。 Linuxでも利用可能なMediaInfoを使用し、そこから寸法を取得する必要がありました。最も重要なのは、画面に表示される画像のアスペクトであり、設定された幅に基づいて高さを計算します。 さらに、「ワイドスクリーン」フィルムの高さをわずかに伸ばすというアイデアが生まれ、わずかな角度でぶら下がっているテレビの視覚的な圧縮を補正しました。



したがって、awkスクリプトが登場しました(awkの選択は、たとえば真珠と比較して、windowsの実装のコンパクトさによるものです)。 スクリプトは、すべてのファイルをマスクすることで* .mkvを検索し(検索文字列はどのプラットフォームでも簡単に変更できます)、見つかった各ファイルに対してMediaInfoを呼び出し、AviDemuxのスクリプトを作成し、コンバーターをバッチファイルに呼び出すコマンドも追加します。 将来、このスクリプトは簡単にやり直して、選択した単一のファイルを変換し、ダウンロードマネージャーに接続します。



スクリプトソース


ソースコードでは、選択したビデオコーデックの設定が削除されます。これらの設定はスクリプト全体よりも多くのスペースを占有し、AviDemuxプロジェクトから簡単に取得できるためです。 この場合、すべての二重引用符をバックスラッシュ文字でエスケープする必要があります(このawkはsiに似ています)。



 BEGIN { #  #    ,       WIDTH = 720 HEIGHT = 404 #           CROP = 1 # .    /   STRETCH = 0.15 #   ,         BATCH = "run.cmd" #    AVIDEMUX = "P:\\myProgs\\AVIDemux.2.5.6\\avidemux2_cli.exe" MEDIAINFO = "P:\\myProgs\\MediaInfo_CLI_0.7.59\\MediaInfo.exe" # ,     (dir, ls, find) LIST = "dir /b *.mkv" #   ASPECT = WIDTH / HEIGHT STRETCH += 1 while((LIST | getline fn) > 0) { printf("FILE: %s\r\n", fn); InfoCommand = MEDIAINFO " --Output=Video;%Width%/%Height%/%AspectRatio%/%DisplayAspectRatio% \""fn"\"" if((InfoCommand | getline tmp) > 0) { if (match(tmp, /([0-9]+)\/([0-9]+)\/([0-9.]+)\/([0-9.]+)/, m)) { w = int(m[1]) h = int(m[2]) a = 0.0 + m[3] d = 0.0 + m[4] if (a != d) { printf("\tAspect/Display are not equal %d %d\r\n", a, d); } # correct dimentions to square pixels cw = w ch = w / d # stretch to fit display if (cw / ch > ASPECT) { sh = cw / d * STRETCH printf("\timage is wider than display, do vertical stretch\r\n") if (sh > cw / ASPECT) { sh = cw / ASPECT } sw = cw # crop to fit display if (CROP && (sw / sh > ASPECT)) { printf("\timage is still wider than display, do horisontal crop\r\n") sw = sh * ASPECT } fw = (sw < WIDTH) ? rint(sw, 8) : rint(WIDTH, 8) fh = rint(sh / sw * fw, 4) } else if (cw / ch < ASPECT) { sw = ch * d * STRETCH printf("\timage is higher than display, do horisontal stretch\r\n") if (sw > ch * ASPECT) { sw = ch * ASPECT } sh = ch # crop if (CROP && (sw / sh > ASPECT)) { printf("\timage is still higher than display, do horisontal crop\r\n") sh = sw / ASPECT } fh = (sh < HEIGHT) ? rint(sh, 4) : rint(HEIGHT, 4) fw = rint(sw / sh * fh, 8) } rw = cw - sw rh = ch - sh printf("\t%dx%d -stretch-crop-> %d(%+d)x%d(%+d) -display-fit-> %dx%d\r\n", w, h, sw, -rw, sh, -rh, fw, fh); # calc 4 crop values if (rw < 0) rw = 0 if (rh < 0) rh = 0 rwl = int(rw / 2) rwr = int(rw - rwl) rht = int(rh / 2) rhb = int(rh - rht) # make new filenames rsfn = fn avifn = fn sub(/\.[A-Za-z0-9_]+$/, ".rs", rsfn) if (rsfn == fn) rsfn = rsfn ".rs" sub(/\.[A-Za-z0-9_]+$/, ".avi", avifn) if (avifn == fn) avifn = avifn ".avi" # avidemux sript does not like "\" in path gsub(/\\/, "/", fn) gsub(/\\/, "/", avifn) # save run script printf("//AD <- Needed to identify//\r\n")>rsfn printf("var app = new Avidemux();\r\napp.load(\"%s\");\r\napp.video.setPostProc(3,3,0);\r\napp.video.addFilter(\"crop\",\"left=%d\",\"right=%d\",\"top=%d\",\"bottom=%d\");\r\napp.video.addFilter(\"resize\",\"w=%d\",\"h=%d\",\"algo=0\");\r\n", fn, rwl, rwr, rht, rhb, fw, fh)>rsfn printf("app.video.codecPlugin(\"****\");\r\n")>rsfn printf("app.audio.reset();\r\napp.audio.codec(\"Lame\",128,20,\"80 00 00 00 00 00 00 00 02 00 00 00 05 00 00 00 00 00 00 00 \");\r\napp.audio.normalizeMode=1;\r\napp.audio.normalizeValue=0;\r\napp.audio.delay=0;\r\napp.audio.mixer=\"STEREO\";\r\napp.audio.drc=true;\r\napp.setContainer(\"AVI\");\r\n")>rsfn printf("app.save(\"%s\");\r\napp.Exit();\r\n", avifn)>rsfn # add to batch printf("%s --nogui --run \"%s\"\r\n", AVIDEMUX, rsfn)>BATCH } } close(InfoCommand) } close(LIST) } function rint(v, b) { # floor value to specified base return int(int(v + 0.5) / b) * b }
      
      






All Articles