DLNAで共有するビデオコンテンツをすべてMPEG2-TSに変換しようとTSMUXERを使ってバッチを作成していました。
変数へ実行結果を代入するにはFor文を使ってできるのですが、MediaInfoのCLIではどうも安定してうまくいかず、PowerShellで作成することにしました。
変換用のスクリプトを作成時、はまったのが文字コードです。
変換手順
- MediaInfoで情報を取得
- mp4boxで映像と音声を分離
- 取得した情報をもとにTSmuxer用メタファイルを作成
- TSmuxerを実行
4番で「Invalid codec Format」のエラーが発生してしまい変換ができませんでした。
調査したところ、原因はTSmuxer用メタファイルの文字コードでした。
文字コードが原因であるということにたどり着くまでMeGUIで同じことをしてLogに出力されるコマンドやメタファイルを見比べたり・・・
□□Mって表示がどこからのものなのかがわからなくてはまりました。
PowerShellの文字コードはUnicode(UTF16)です。
作成したスクリプトも当然Unicodeですし、表示した文字列をファイルにリダイレクトするとUnicodeで保存されます。
Windowsの内部の文字コードはUnicodeなのでPowerShellもUnicodeなのは仕方がないことです。
以下の画像はメタファイルをUnicode、SJIS、UTF-8で作成した場合の結果です。
Unicode(文字コード指定なし)
Invalid codec Formatのエラーが発生(MUXOPTの前にゴミがつく)
UTF-8
Invalid codec Formatのエラーが発生(MUXOPTの前にゴミがつく)
SJIS
出力したファイルをさくらエディタで文字コードを変換すると、Unicode⇒UTF8の場合は半角文字が全角文字?になってしまうためエラーになりました。
また、スクリプト自体をUTF8で作成すると日本語文字などが文字化けし、文法的にもおかしくなる箇所があり正常に動作しませんでした。
結局、スクリプト自体はUnicodeのまま、メタファイル作成箇所をOUT-FileでSJISに変換しファイルに保存するように修正しました。
根本的な原因はPowerShellとTSmuxerの文字コードの対応状況ということになります。
TSmuxer自体は、UnicodeはNG、SJISとUTF8はOKでした。
この程度のスクリプトを記述するのに4時間以上かかってしまいました。
変換処理は151タイトルで3時間くらいかかりそうです。
PowerShellに慣れてもう少し手際よくきれいなスクリプトがかければ、動画関連のスクリプトはすべてPowerShellにしようと思います。
先日導入したUNIXベースアプリケーション用サブシステムは、そもそもUNIX資産をもっていないのであまり使うことはなさそうです。
コマンドプロンプトでlsやらが使えるようになったのは、ちょっとありがたいかも・・・