Naknet blog

Nothing to believe, nothing else to believe.

wmmultiplexer Released!

新カテゴリは自作ソフトウェアのリリースです。

第一弾は、WMStreamEdt.exe(Windows Media Stream Editor)の動作を、制限つきながら自動化したものです。
つまり、任意の2ファイルをMuxします。
コマンドライン アプリケーションなので、作業の自動化に適しています。

Softwareからどうぞ。

[21:52更新]
Version情報を入れました。

[22:01更新]
慌しくてすいません...
usageが正常に表示されないのを修正しました。
comments (0) | trackbacks (0)

wmmultiplexer Updated!

ver.0.10です。

ver.0.0xでは全てのデータをメモリに読み込んでいたので、大きなasfを操作する際に大量のメモリが必要になってしまうという欠点がありました。
ver.0.10ではその点を修正し、最大メモリ使用量を一定レベルに抑えました。
但し、入力ファイルと出力ファイルが同一物理ドライブに存在する場合、パフォーマンスが悪化する場合があります。
最大でも2入力ファイルの合計サイズのメモリしか使いませんので、物理メモリに自信があり、常に一定サイズのファイルしか操作しない、などの場合には旧verの方が効果的かもしれません。
一応残しておきます。

Softwareはこちら。
comments (0) | trackbacks (0)

AVIHeaderinfo utility Released!

えー、この雨の中、講習に行ったら、今日は休みだったという罠にはまってしまいました。
鬱。


さて、それはそれとして、この間書いたAVI*関数の練習として.aviファイルのヘッダ情報をダンプするプログラムを作りました。
第一引数に見たいファイルを渡せばOKです。

[Software]からどうぞ。

[12:10追記]
uncompressedなファイルを読ませると落ちるバグを修正しました。
comments (0) | trackbacks (0)

wmmultiplexer v0.11 released

WMMultiplexerを更新しました。

変更点は、

  • 入力ファイル名の表示

  • ドロップされた(書き込まれなかった)サンプル数の表示


です。

万が一、dropped sampleがカウントされてしまった場合、ソフトのバグの可能性がありますので是非お知らせください。
comments (0) | trackbacks (0)

mAgic Exporter

I-O DATAの


キャプチャボードに付属している録画用ソフト「mAgic TV」。
なんか不安定とか叩かれることの多い本ソフトですが、これには「エクスポート」といって「録画後のファイルに何かの操作をする」機能がついています。
私が持っているGV-MVP/GXWなどにはGVencoderといってwmvや3gpに変換するソフトがついていて、これと連動して自動的にエンコードすることができるようになっています。
私は主にアニメを録画し、録画したものからDGMpgDecでd2vを作成して再エンコードしているのですが、ここでこの機能を使い、自動的にd2vが作成できたらいいと思いました。

というわけで


「ファイル出力」などのエクスポート・プラグインのexportを見たら結構単純なインターフェイスのようなので、解析して任意のコマンドを実行できるプラグインを作成してみました。

mAgic Exporter 0.01

使い方


アーカイブを適当なディレクトリに解凍し、"install.cmd -i" としてください。
その際、mexport.dllの位置がレジストリに書き込まれますので、インストール後は移動・削除など出来ません
アンインストールは同じく"install.cmd -u"とすれば可能です。
これらの操作は必ずmAgicマネージャを終了させてから行ってください。

注意


本プログラムは私T.Nakagawaが個人的に作成したものなので、本プログラムに関する問い合わせは絶対にI-O DATAにしないでください。

本プログラムはmAgicTV 5.11.02(GV-MVP/GXW サポートソフト1.25)で動作確認しました。

開発環境


Windows XP Professional SP2 / VisualStudio 2005 Professional
comments (1) | trackbacks (0)

mAgic Exporterのバグ

mAgic Exporter 0.01には


バグがあります。
mAgicマネージャの予約録画の設定で、録画後のエクスポート先のチェックがあるのですが、そこにチェックを入れてもダイアログを閉じると外れてしまいます。
これはmAgicマネージャが録画予約の設定をファイルに保存する際、各プラグインのエクスポートする・しないの設定をビットフラグで保存していることが原因です。
なので、予めTVmanplus.exeが知っているプラグインでないと保存されなくなってしまいます。

対処法


対処法としてまず手軽なのは、使用していないプラグインの名前を偽装することです。
しかしこれをやると全てのプラグインが登録されている環境で利用できませんし、自身の名前が登録できなくなってしまいます。

次に考えられるのはTVmanplus.exeにパッチを当ててmAgic Exporterを認識するようにさせる方法です。
しかし、これだとmAgicTVがアップデートされるたびに解析しなおさなくてはなりません。面倒くさいですね。

最後はI-O DATAの修正に期待する……ですが、そもそも非サポートな内容ですし期待できません。

なので


ひとまずどのプラグインに偽装するかを設定できるようにしようと思います。
「ファイル出力」なんて使いませんしね。普通。

原因が分かったのでひとまず報告まで。
続きを読む>>
comments (1) | trackbacks (0)

Launcher commandline utility

再エンコ派の人の場合


エンコーダのプロセス優先度や実行するプロセッサを変更したい場合が多々あります。
そういう人のために、プログラムをいくつかのオプションを指定して実行するプログラムを作りました。
[Software]のページからどうぞ。

Readme.txt


[-?]


launcher.exe - Launch a process with some options.
-- Usage --
launcher.exe [options] <command line>
-- Options --
[-a <affinity mask>] : Processor affinity mask.
[-d <delay>] : Launch delay [ms].
[-p <priority>] : Priority [0(Idle)~2(Normal)~5(Realtime)].
Note : Realtime priority class is very dangerous!!
[-w] : Wait for exit.

[Affinity Mask]


Affinity Maskとは、新たなプロセスをシステムのどのプロセッサで実行すべきかを指定したもの。
実行する論理プロセッサをビットマスク形式で指定。
例えば、論理プロセッサが4つインストールされている環境で、CPU1とCPU3でプログラムを動かしたい場合
0b00000101
がAffinity Maskとなる。

但しこの値は設定前にlauncher.exeのAffinity Maskと論理ANDがとられる。
AND演算の結果Affinity Maskが 0x00 になった場合、新しいプロセスにAffinity Maskは設定されない。
未指定の場合も同様である。
この場合、開始されたプロセスは全てのプロセッサを利用できる。

Affinity Maskのデータサイズは32bitであるため、最大32wayのマルチプロセッサ環境にまで対応する。

[Process Priority]


Priorityは実行するプロセスの優先度を指定する。
指定できる値は 0 から 5 までである。
それぞれの値は以下のように対応している:
0 : Idle (低)
1 : Below Normal (通常以下)
2 : Normal (通常)
3 : Above Normal (通常以上)
4 : High (高)
5 : Realtime (リアルタイム)

3 以上の優先度を指定したプロセスがCPU時間を使いきった場合、UIが反応しなくなる恐れがある。
エンコーダなど、負荷の大きい処理をするプロセスの優先度を上げる場合は、マルチプロセッサ環境で
Affinity Maskを設定して利用できるCPUを制限したほうがよい。

[Wait for exit]


-w オプションを指定すると、launcher.exeは開始されたプロセスが終了するのを待機する(Synchronous mode)。
既定値は終了を待機しない(Asynchronous mode)。
-w オプションを指定した場合、launcher.exeの戻り値は開始されたプロセスの戻り値と同じになる。
続きを読む>>
comments (1) | trackbacks (0)

Regex Utility ver.0.10.5

更新しました。
EUCの入力が扱えるようになるはずです。

ただし、以下のような理由により、<expr>内に日本語(を含むマルチバイト文字列)を指定した場合の動作は保証しません。

技術情報

多分VCに限らずWindows上の処理系なら殆どそうだと思うんですが、std::locale::global( std::locale( "" ) ) や std::setlocale( "" ) などの操作をしないと、wchar_tの日本語文字列がprintf()やcoutに出力できません。

例:

#include <cwchar>

int main( void )
{
	std::wprintf( L"This is 日本語文字列." );
	return 0;
}
この場合の出力結果は
This is となります。

これを回避するには、

#include <cwchar>
#include <clocale>

int main( void )
{
	std::setlocale( LC_ALL, "japanese_japan" );	// 追加
	std::wprintf( L"This is 日本語文字列." );
	return 0;
}
とすればいいのですが、さて、この状態で(ファイルなどから読み取った)EUCのテキストを表示しようとするとどうなるでしょうか。
……どうなるも何も、さっきと同じになってしまいます。

結局、ファイルの文字コードを判別してそれぞれのコードページを設定する必要があります。
コードページは'.'(ピリオド)に続けてLCIDを指定すれば明示することが出来ます。
Shift_JISなら932(殆どの場合これがOS既定)、Unicode(UTF-8)なら65001、eucJP-msなら20932です。

# 参考:Code Page Identifiers

何が問題なのかというと、まず文字コードを「判定」する必要があるということ。
IE使ってる人ならEUCのページがたまに化けて表示された経験があると思いますが、あれは判定ミスによるものです。
原理的に完璧なものを作ることは不可能で、これがどうにも気に入りません。

また、余計な処理を増やす原因にもなります。
これは例えば、std::basic_string<>に文字コード自動変換機能みたいなのを実装すればある程度は自動化できますが、必然的に重くなります。

更に上の例ではprintf()、wprintf()を使いましたが、std::coutでは、例えglobalで設定しようともimbue()しようとも日本語は徹底的に無視されてしまいます。
バグだと思いますが、もしこれが仕様なら分かりにくいこと甚だしいです。

EUCやShift_JIS(要するにMBCS)とは永久に決別できればいいんでしょうが、やはりそういったものの呪縛からは未だに解かれそうにありません。
一応先述のコードページを指定することでMultiByteToWideChar()が可能なようですが、……。

charset_cast<>でも作りますかね?

制限の理由

で、何でRegex.exeでマルチバイト文字が扱えないかというと、上記のような理由により内部で文字コードの変換を行わないからです。
普通は引数として渡される文字列はShift_JISですが、対象ファイルがEUCの場合はマッチしなくなります。
チェックして変更するってのも面倒なんで。

……今思ったんですが、ifstreamやofstreamに文字コード変換機能をつけたやつがあれば便利そうですね。
誰か作ってないかな。

comments (0) | trackbacks (0)

IE7&WMP11導入

WMP11ですが、日本語版には時間がかかるそうなのでとりあえず英語版を入れてみました。
使う上では特に支障ないしね。
WMP10と比べて一番変わったと思うのは、まずI/Fと、それにデバイスの同期機能でしょうか。
特にプレイリストの同期機能が強化されたのは結構嬉しい。
今までは既存のプレイリストを編集してこれを同期しても、デバイスの方には反映されなかったのですが、きちんとデバイス側も更新されるようになったみたいです。

# 実はまだ試していません。同期のページにデバイスのプレイリストがちゃんと出てくるから多分出来るのかなと。
# 後でちゃんと調べます。

次にIE7ですが、さすがにSleipnirに比べればシンプルですね。機能も最低限ですが、標準のブラウザとしては逆にそのくらいがいいのかもしれません。
というか、レンダリングエンジンが変わってblogのレイアウトが乱れているので、現在色々と修正中です。。。

続きを読む>>
comments (0) | trackbacks (0)

Undecname/drsedit公開

Undecname

実行可能ファイルからエクスポートされたC++関数の名前装飾を解除するプログラムです。
引数を一つ与えるとこれの装飾を解除して出力します。
また、引数を与えないと連続変換モードになります。一行ごとに一つの装飾済み名を入力してください。

ソフトウェアからどうぞ。

[12/30 16:30追記]
装飾が解除されずに出力されてしまう時は、最新版のdbghelp.dllを使ってみてください。
Debugging Tools for Windowsに同梱されています。
[/追記]

drsedit

かの名作「Age of Empires」シリーズのリソースアーカイブ形式である、.DRS形式のファイルを展開したり作成したりします。
使い方は、drsedit /?とすると参照できます。

さてこれが何に使えるかというと……

  1. 町の人の声を抽出してPCの操作音にする。
  2. ランダムマップスクリプトを抽出して製作の参考にする。
  3. ネット対戦(マルチプレイヤー)時のAIを置き換える。
  4. MODを作る。
  5. といったところでしょうか。

これだけというのもエントリとして寂しいので、3.についてちょっと解説します。

マルチではCPUにカスタムAIを使うことは、通常は出来ませんが、ノーマルのAIを置き換えることでこれを実現しようというものです。
これは、gamedata_x1.drs(拡張版)に含まれる id0000ea7a というファイルの内容を変更することで可能になります。

一度DRSを展開し、ea7aの中身を目的のAIの.perファイルの中身で置き換え、再度packして元のファイルと置き換えればOKです。

注意点としては、置き換えた状態ではシナリオのCPUプレイヤーが正常に動作しない恐れがあります。
なので、上書きする前に必ず元のファイルのバックアップを取っておいてください。

comments (2) | trackbacks (0)
1/3 >>