PowerShellの文字コード

DLNAで共有するビデオコンテンツをすべてMPEG2-TSに変換しようとTSMUXERを使ってバッチを作成していました。

変数へ実行結果を代入するにはFor文を使ってできるのですが、MediaInfoのCLIではどうも安定してうまくいかず、PowerShellで作成することにしました。

変換用のスクリプトを作成時、はまったのが文字コードです。
 

変換手順

  1. MediaInfoで情報を取得
  2. mp4boxで映像と音声を分離
  3. 取得した情報をもとにTSmuxer用メタファイルを作成
  4. 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の前にゴミがつく)
Unicode
 

UTF-8

Invalid codec Formatのエラーが発生(MUXOPTの前にゴミがつく)
 Utf8

SJIS

エラーなく実行される
 sjis

出力したファイルをさくらエディタで文字コードを変換すると、Unicode⇒UTF8の場合は半角文字が全角文字?になってしまうためエラーになりました。
また、スクリプト自体をUTF8で作成すると日本語文字などが文字化けし、文法的にもおかしくなる箇所があり正常に動作しませんでした。
結局、スクリプト自体はUnicodeのまま、メタファイル作成箇所をOUT-FileでSJISに変換しファイルに保存するように修正しました。

根本的な原因はPowerShellとTSmuxerの文字コードの対応状況ということになります。
TSmuxer自体は、UnicodeはNG、SJISとUTF8はOKでした。

この程度のスクリプトを記述するのに4時間以上かかってしまいました。
変換処理は151タイトルで3時間くらいかかりそうです。

PowerShellに慣れてもう少し手際よくきれいなスクリプトがかければ、動画関連のスクリプトはすべてPowerShellにしようと思います。

先日導入したUNIXベースアプリケーション用サブシステムは、そもそもUNIX資産をもっていないのであまり使うことはなさそうです。
コマンドプロンプトでlsやらが使えるようになったのは、ちょっとありがたいかも・・・

カテゴリ

自作PC