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やらが使えるようになったのは、ちょっとありがたいかも・・・

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

大阪府門真市に生まれ、高校卒業まで京都府福知山市で育ち、大学は工学部電子工学科を卒業。半導体設計会社に勤務ののちインフラエンジニアとして監視基盤の運用設計業務に就く。現在は都内の施設に勤務。横浜在住。人の役に立てることができればいいなと日々思っています。

目次