• D言語用 DirectX モジュール version 1.1.1

    2013年02月24日 02時02分
    directx_1_1_1.zip

    • 64bit用のコードを少し足しました
    • dmd2.062でコンパイルを確認
  • D言語とWindows 64bit

    2013年01月09日 00時16分
    dmd 2.061でWindows 64bitがサポートされました。
    しかしビルドするだけでも一苦労だったのでメモっておきます。


    64bitコンパイルオプション

    64bitでビルドするオプションは-m64です。
    dmdのUsageに出てこないので気づきにくいと思います。


    リンカ

    64bitビルドではVCのリンカを使うようになっています。
    よってVCのリンカのパスを設定する必要があり、sc.iniLINKCMD64で指定します。
    私の環境ではMicrosoft Visual Studio 2012 Expressを入れていたので下記のようになりました。
    LINKCMD64=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\link.exe

    この辺りはご利用の環境に合わせて調整してください。

    参考ですが、私の環境だとlink.exeの実行時にmspdb110.dllが見つからないと言われました。
    mspdb110.dllはC:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDEにあるのですが
    パス設定が面倒なのでlink.exeと同じフォルダにコピーしました。
    訂正: mspdb110.dllをコピーで置いてしまうとVSの動作に影響が出るので、置いてあるフォルダを環境変数PATHに追加します。


    VCINSTALLDIRの設定

    sc.iniに増えた謎の変数VCINSTALLDIRはVCのlibフォルダを参照するための物です。
    VCのlibフォルダにあるCランタイムライブラリ等が必要になるためです。

    もちろんLIB変数にVCのlibフォルダを直接設定しても動くのですが、
    32bit版と混ざるのでVCINSTALLDIRを設定した方がいいでしょう。

    この変数がどう使われるかはdmd2\src\dmd\link.cを見ればわかります。
    1const char *vcinstalldir = getenv("VCINSTALLDIR");
    2if (vcinstalldir)
    3{   cmdbuf.writestring(" \"/LIBPATH:");
    4    cmdbuf.writestring(vcinstalldir);
    5    cmdbuf.writestring("lib\\amd64\"");
    6}

    linkのオプションに/LIBPATH:として指定しています。

    よって私の環境では以下のような設定になりました。
    VCINSTALLDIR=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\

    ※プログラムを見るとわかりますが、最後のバックスラッシュが必須です。


    WindowsSdkDirの設定

    sc.iniに増えたもう一つの謎変数WindowsSdkDirはWindows SDKのlibフォルダを参照するための物です。
    Windows用の各種libが必要になるためです。

    こちらもLIB変数でも指定できますが、VCINSTALLDIRと同じ理由でWindowsSdkDirを設定した方がいいでしょう。

    変数の使われ方についてもVCINSTALLDIRと同じです
    1const char *windowssdkdir = getenv("WindowsSdkDir");
    2if (windowssdkdir)
    3{   cmdbuf.writestring(" \"/LIBPATH:");
    4    cmdbuf.writestring(windowssdkdir);
    5    cmdbuf.writestring("lib\\x64\"");
    6}


    私の環境ではWindows SDK for Windows 7をインストールしてあったので以下のような設定になりました。
    WindowsSdkDir=C:\Program Files\Microsoft SDKs\Windows\v7.1\




    以上で64bit版Windowsのビルドは出来ます。
    ただ、本格的にWindows用プログラムを書こうと思うと
    Windowsモジュールの64bit対応が必要になってくるのでどうしようかと思うわけです。
  • avs2wav 1.0.2

    2012年12月01日 16時35分
                           _,.-‐"':" ̄~゙'ヽ、       __
          _,---‐" ̄\         /          ``ー‐-、   ノ   \
        /        ヽ      ;"                ) /      \
       /   ぐ バ   |      /                |ノ/        \
      /    ら グ     |     |                 )/.|   ・  オ   |
      |    .い を    |     |          ,;';;,,    /ノ |   ・   レ   |
      |     ・  い    |    |::::.................:::::::::;;,'^;、::::::'''..,,_;、丿 |   ・   に   |
      |     ・  れ    |    /:::::::::::::::::::::::::::;"゙, /゙~゙`''::;'゙;     |  ・   だ.  |
      |    あ  る    |    `、;;::::::::::::::::;/ ),;'   :.'.,、   |  ・   っ  |
      |    る  こ    |  ,へノ   `'''''"´   .:;     .:::_ヽ  |  ・   て   |
      |    ・  と     Y   \       .::;     ::::ゝ    .|  ・         |
      |    ・       ∧    \     ::::::、   .:;`     |         |
      |    ・       |ヽ丶    \;;  :::;;;;::..,,、. ::i       |          |
      |    ・       | `       \;;;;/    `゙"       \


    申し訳ありませんがバグってました。

    RIFFヘッダのファイルサイズが4Byte小さく書き出されていました。
    修正版がこちらになります。

    avs2wav 1.0.2


    他にも何かバグを見つけた方はご連絡ください。
    可能な限り修正したいと思います。
  • avs2wav 1.0.1

    2012年11月29日 20時14分
    前回作ったavs2wavですが
    動作が遅いのでメモリ量を調整したり書き出し処理を並列化したりしてみました。

    avs2wav 1.0.1 (バグ有り → 修正版)


    ただ、書き出し処理を並列化してもこの処理は本当に一瞬なので効果は無しに等しいです。
    処理が複雑になる分バグが出やすくなっただけかもしれません。

    書き出すデータに手を加える様な仕様を追加すれば多少は効果も出てくるのですが
    おそらくそういった追加はしないでしょう。


    ちなみに処理時間のほとんどはAVSからWAVEデータをロードする処理で
    ここはAPIを呼んでいるだけなので高速化しようがありません。
  • avs2wavの再開発

    2012年11月28日 00時04分
    機動戦士ガンダムオンラインのCβを必死にやっていたら
    200戦分(約6TB)ほど動画が貯まったのでせっせとエンコードしていました。

    エンコードの作業は次の通りです。
    1. 録画ファイルをVirtualDubに読み込み(手動)
    2. 最初と終わりに入っているロードとか待機画面をカットして出力(手動)
    3. エンコード(バッチ)

    ここで問題になるのが2の作業

    単純に指定範囲を別ファイルに出力するだけなので
    通常のファイルコピーとだいたい同じ100MB/秒程度の速度は出るのですが、
    1戦分のデータが2~30GBと大きいため、5分ほど待ち状態になるわけです。

    この5分の待ち時間が結構ばかにできません。
    100戦超えた辺りから俺は一体何をしているんだという気分になってきます。

    とりあえずCβ分はそのまま手動でやってしまったのですが、
    今後Oβ~サービス開始となった時にこんなことやってられません。

    俺は動画を見直したいだけでエンコしたいわけではないんだ!


    作戦


    カットする位置を調べるのはさすがに手動でやらねばならないのでこれは諦めます。
    ただし、カット位置を指定したらあとはコンピュータ君に全てやって貰います。

    調べたところ映像についてはAvisynthにTrimというそのものずばりな機能がありました。
    x264に渡すAVSファイルにTrimを追加して解決です。
    むしろ今まで何故使わなかったのか。

    音声はエンコーダに渡すためにカットした上でWaveで出力したいわけですが、
    AVSを渡すとWaveを出力してくれるavs2wavというのがありました。
    映像と同じAVSファイルを使えるのでこれを使うことにします。


    今日の本題


    嬉々としてavs2wavを落として来て使用してみたのですが、
    何故か9KBのファイルが出力されるだけという謎現象が発生。

    オプションなど色々試したのですが改善されず、仕方なくソースを読むことに。

    すると、とても短いコードだったので、
    いいや書き直しちゃえと要点だけ確認して書き直してみました

    avs2wav 1.0.0 (バグ有り → 修正版)

    思いっきり類似品なので本家と間違われぬよう
    64ビットバージョンも作って後ろに32とか64とか付けてみました。

    本家の音量調整機能は使わないのでばっさり切ってあります。

    本家と比べて有利な点としてメッセージが日本語です。日本人歓喜。

    同様の現象でお困りの方はご利用ください。