エンコード用スクリプト PowerShell版


エンコード用バッチスクリプトのPowerShell版を作ってみました。
 
【エンコード用スクリプトファイル】
ベタに書いただけなのでPowerShellの良さを使い切れていませんが、よかったらどうぞ。
encode_movies.zip
※ZIPで解凍してください。
※以下【使用方法】にあるようにダウンロードしたスクリプトを実行するには、通常、デジタル署名が必要になり面倒です。その回避のためにencode_movies.txtのように拡張子を変更してありますので、テキストエディタで内容をコピー&ペーストするなりして新規作成してください。そうすればローカルで作成したスクリプトとして扱われるので、【前提条件】に記載した実行ポリシーを変更するだけで使用できるようになります。
※なおPowerShellの拡張子は「ps1」です。
 
【使用方法】
インターネットからダウンロードした~.ps1ファイル(PowerShellスクリプト)はデジタル署名がなければ通常は実行できません。
※PowerShellの実行ポリシーのデフォルトが「Restricted」(すべてのスクリプトが実行禁止)になっています。安全性と利便性を考慮すると「RemoteSigned」(ローカル・スクリプトはそのまま実行、非ローカルは署名を要求)がお勧めですがその状態では、デジタル署名の仕組みがなければ、自分で作成したものしか実行できない状態です。
 
ダウンロードしたPowerShellスクリプトを署名するには、
※上記ファイルをダウンロードしてファイルの中身をコピー&ペーストしてローカルPC上で新規作成した場合は不要な手順です。
①独自のデジタル署名を作成
ローカル証明機関の作成と証明機関から個人用証明書の生成の2ステップです。
makecertコマンドやOfficeツールのデジタル署名作成で実施可能です。
※makecertコマンドの入手には、.NET Framework SDKやMicrosoft Windows SDKが必要になるので面倒だと思います。
 
②作成した署名を使って自己署名する
※信頼できるものだけ署名するよう留意してください。
以下の2つのコマンドをPowerShellで実行すればファイルの署名ができます。
$cert = @(Get-ChildItem cert:\CurrentUser\My -codesigning)[0] を実行(個人証明書を取得)
Set-AuthenticodeSignature 署名するPowerShellスクリプト名 $cert を実行(スクリプトに追加)

以上でダウンロードしたPowerShellスクリプトでも実行が可能になります。
 
【前提条件】
・PowerShellが使用できる環境でなければ動作しません。
・.Net Framework 3.5が必要になると思います。
・PowerShellを利用するためには、デフォルトの実行セキュリティポリシーを変更する必要があります。(デフォルトではすべて実行禁止の状態であるため)
※すべての環境での動作確認を行ったわけではありませんので、何らかの影響が発生しても責任はとれません。ご利用に際しては自己責任でお願いします。
 
以下の手順で実行ポリシーを変更します。
※PowerShellを初めて使う場合の初回だけです。
①管理者権限でPowerShellを起動します。
スタートメニュー⇒アクセサリ⇒Windows PowerShell⇒Windows PowerShellで右クリック⇒管理者で実行を選択
 
②現在の実行ポリシーを確認
「Get-ExecutionPolicy」を実行すると「Restricted」が表示されると思います。
 
③実行ポリシーを「RemoteSigned」に変更
「Set-ExecutionPolicy RemoteSigned」を実行し実行ポリシーを変更します。
 
④変更後の実行ポリシーを確認
「Get-ExecutionPolicy」を実行し、「RemoteSigned」であることを確認してください。
 
以上で終了です。
※RemoteSignedはローカル・スクリプトはそのまま実行、非ローカルは署名を要求します。
署名の設定はかなり面倒ですができないことはありませんので、気になる方は「AllSigned」で常に署名が必要にすればよいと思います。
 
【実行方法】
推奨の方法
その1.「encode_movies.ps1」ファイル上で右クリック⇒「PowerShellで実行」で開始します。
※クイック起動に登録しておけば楽だと思います。
 
その2.ショートカットを以下の内容で作成し、そのショートカットをダブルクリックで開始します。
項目の場所:
"C:\Windows\System32\cmd.exe" /k "powershell D:\script\encode_movies.ps1 -NoExit"
※D:\script\encode_movies.ps1の箇所は環境にあわせてください。
※encode_movies.ps1のパスは、必ずフルパスで記述してください。
ショートカットの名前:わかるように適切な名前をつけてください。
 
※PowerShellスクリプトを指定する場合は、相対パス名または絶対パス名で記述しなければなりません。相対パスは.(ドットから始まるパス名)、絶対パスはドライブ名から始まるパス名と思ってください。
 
【変更点】
・入力ファイルは、所定フォルダ内にある「拡張子.avi」のすべてのファイルです。
※実行前に入力ファイル確認用のメッセージボックスがでます。
・初期設定用にユーザ環境設定のチェックをするようにしました。
・x264のエンコードは、3パス、2パス、品質ベースVBRに対応しました。
・処理終了時にメッセージボックスが表示されます。
・プログラム内にコメントで説明を記載しました。
・AVSファイルを除くすべての中間ファイルを削除してから処理を行います。
・出力先フォルダに同じ名前のファイルがあるとそのときの時間分秒をファイル名に付与してリネームします。
・エラーハンドリングはしていません。簡易的に出力ファイルの有無で制御している程度です。
・PowerShellにしたことでネットワークドライブ上のファイルにもアクセスできますが、作成したスクリプトは入力ファイルと同じ場所に中間ファイルを出力するため速度低下の可能性があるのでお勧めはしません。変換後のファイルをネットワークドライブ上に移動する程度なら影響は少ないと思います。
 
【既知の問題点】
・外部プログラムの実行時にPowerShellでは構文エラーとみなされる。※動作は正常
・PowerShell ISE上で実行すると外部プログラムの標準出力がエラーメッセージ扱いになります。
 
【留意点】
・PowerShellではレジストリを変更しなければドラッグ&ドロップで実行できないようです。そのためドラッグ&ドロップ方式をやめました。慣れれば現仕様でも支障はないと思います。
・AVSファイル作成箇所のファイル読み込み用フィルタを変更すればいろいろなファイル形式に対応可能ではありますが、デフォルトではAVI形式(音声PCM)のみ想定しています。
・「拡張子.wmv」のケースを想定してコメントで記述してありますが動作確認はしていません。
PowerShell ISEで実行すると
・標準出力のほとんどがエラーメッセージ扱いになってしまいます。
・外部プログラムで文法エラーのようなメッセージがでますが、正常に動作します。
※$errorにはすべてのメッセージが代入されてしまいます。
 
【今後の課題】
・外部プログラム実行箇所の改善
※&実行コマンド、Invoke-Expression 実行コマンド、cmd /c 実行コマンドなど試しましたがどれも改善はできませんでした。改善意思はありますが策が思い浮かばないというのが現状です。上記、推奨の実行方法であれば問題には気付かないと思います。
 
いろいろ書きましたが、基本的には先日の「encode_zoome.bat」と同じ役割のものです。
エンコードオプションやAVSファイルのフィルタ記述はお好みで変更してください。
 
一例として、上記スクリプトでエンコードした動画をYouTubeにアップロードしてみました。
 
【YouTubeの制限】
※判明している事項のみ抜粋
・ファイルサイズは2GBまで
・再生時間(duration)は15分まで
・アスペクト比は16:9または4:3
・アップロード後の変換時に著作権のチェックがある(音楽が恐らく引っかかります)
※優良ユーザによる投稿の場合は無制限のようです。
 
以下、テスト用にアップロードした動画です。
※品質ベースVBRでエンコードしました。