技術者魂

 著者の過去について連載していたのですが、あまり同じようなものが続くと飽きますので、今日はまったく違う話題にします。

 実は昨年の秋からあるお客さんから相談を受けていまして、WindowsでのMPEG2-TSの連続再生というテーマなのですが、ようやく先日大体技術的な目処がつきました。そのあたりの話を書いてみましょう。

 私は画像関連は意外と古くからやっていまして、学生時代にPC9801のVRAMを直接操作してレイ・トレーシングを表示させたりすることや、CADの開発も画像技術を使いますし、組み込みシステムの画像表示や画像変換、画像解析、BMP,XWD,GIF,PNG,JPEGなどの画像変換や減色処理、拡大縮小などを仕事でも行ってきました。動画もMotionJPEGは扱っていました。音声もVOIPや録音再生など多少はやっていました。MPEGはほとんど技術的なことは知らなかったのですが、業界標準のようなものですし何とかなるだろうと言うことで技術検討を始めました。

 始めはVIDEOLANというオープンソースのプレイヤーソフトを解析し、同時にオープンソースのMPEG関連のライブラリを集めて検討しました。とりあえず音声と画像のデコード処理自体はかなり専門的な計算が必要なのでオープンソースを使い、音声・画像の分離(DEMUX)と動画表示・音声再生は自作できそうだと考えてプロトタイプの作成を始めました。

 普通ですと、まずはお客さんと条件の契約をしてから作業を開始するのですが、技術的にできるかどうかわからないものに関しては私は見積りをしません、というよりできません。したがって技術的な目処がついたら契約の相談をすることにしています。目処がつかなかったら当然お金はまったくいただけませんが、役に立てないかもしれないのに契約することはできません。今回の担当の方とは始めてのお付き合いなので、私のこの考え方はかなりびっくりされたようですが。

 とりあえず前述の構成でそれらしい動きのものが1ヶ月くらいでできました。他の仕事もしながらなので多少期間が長くかかりましたが、MPEGが初めてにしてはまずまずの期間でしょう。VC++を使い、DirectXを使おうかと思ったのですが、使わなくてもできそうなので普通にGDIを使って作りました。音声と動画の同期や処理の遅延時のスキップなどなかなか技術的にも難しい点がありましたが、その分楽しく取り組めました。

 ところがお客さんと打ち合わせをしてみると、オープンソース(GPL)のデコーダーを組み込むのは製品化の都合上、まずい、ということになり、InterVideoなど市販のデコーダーフィルターを使うなどして実現して欲しい、と言うことになり、必然的にDirectShowを使って再生しなければならなくなりました。DirectShowも使ったことがありませんでしたので、その調査も始めましたが、非常に情報が少なく、単に出来合いのフィルターを使って再生するだけなら多少は情報があるのですが、フィルター自体を自作するような情報は非常に少なく、さらにDEMUXフィルターを作るような情報は全くないといえるくらい情報はありません。

 幸い、お客さんの方で以前別の方が作成されたサンプルがあると言うことで、ソースを見せていただき、DEMUXフィルターをどのように作ればよいかと言う点ではかなり参考になったのですが、その方はもともと映像関連が専門で、自社のオリジナルライブラリをかなりたくさん使って開発されていて、その部分はソースが提供されていないと言うことで、結局MPEGの処理は自分で考えなければなりませんでした。

 1ヶ月くらいで大体こんなものだろうと言うレベルに作れたのですが、どうしても再生するとすぐに死んだり、データによって非常に不安定な動きになったりしていて、試行錯誤を繰り返しているうちにさらに1ヶ月くらい過ぎてしまいました。さすがにお客さんもスケジュールがありますので心配されていて、それでも他に相談できるところはないから何とかして欲しいと言うことで、ひたすら調査を続けました。2006年のうちに目処をつけたかったのですが、結局完全に再生できる状態にはできず、2007年になってからはお客さんも年度内に何とかしたいと言うことで、ほとんど毎晩午前2時過ぎまで検討していました。ようやく先日技術的な解決ポイントがわかり、スムーズな連続再生も実現できそうな目処がつき、契約の話を今日、してきました。

 この2ヶ月間くらい、本当にノイローゼーになりそうなくらい悩みました。私が20年近くプログラミングの仕事をしてきて、今回が一番悩んだと言えるかもしれません。しかもDirectShowの情報や、接続するフィルターの情報があればすぐにでもできそうな部分で、ひたすら試行錯誤を繰り返すと言う、非常につらい作業で、しかもお金になるかどうかもわからないと言うことで、部下の手前、なかなか立場的にもやりにくい状態でした。もちろんお金を払ってマイクロソフトに相談すればDirectShowに関しては答えが得られたと思います。が、デコーダーは他社のものですし、結局それらを組み合わせて何とかするのは自分の努力ということになります。著書の出版も重なり、精神的にもかなりひどい状態で、土日は疲れきってソフトボールの練習に行く気力もありませんでした。家族にも相当迷惑をかけたと思っています。

 それでも、どうしても私は諦めたくなかったのです。せっかく私をあてにしてくださっているお客さんに申し訳ないですし、やろうと決めたことで途中で投げ出すと言うのはどうしても嫌だったのです。他の仕事も多少はやっていましたが、ほとんど3ヶ月くらい時間を使い続けたものが結局駄目と言うのは自分でも納得できませんし、部下にもそんなことは話したくありません。たまたま部の成績が良い見込みがついていたと言うこともありますが、そうでなくても3ヶ月くらいのマイナスは取り返す自信はあるのですが、技術者として途中で投げ出したと言うのはきっと先々まで心に引っかかることになります。

 実用レベルに仕上げるまでにはまだいろいろとやることが残っていますが、何とかなるでしょう。できるとわかっている仕事は精神的に楽なのですが、技術者ですからやっぱりそういう仕事ばかりでは刺激が得られず、向上心と言うか食らいつく気持ちというか、技術者魂が育たないと思っています。ハイリスクですが、得るものは大きいと思います。今回は残念ながらあまり金銭的にハイリターンではないのですが、お金がすべてではありません。自分の拘っている分野であれば、困難な技術に取り組むことによってお金を越えた何かが得られるはずです。

 まあ、改めてブラックボックスが多い状態での開発の大変さには苦労しましたが、まだまだこれだけのやる気がこの歳でもあるということが確認できたのは今後の仕事にも良い効果が出ることでしょう。やりがいを、技術者魂を持ち続けて、まだまだプログラマーとしても挑戦を続けたいと思っています。

2007.1.27

フレームページへ

from 2007/1/13