スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GIFエンコーダ再び

どもです。年末ってことでいつも以上に忙しくなっています。
これこそが忙しいということなのか、単純に時間の使い方が悪いのかわかりませんが、
いろいろなことの締め切りが迫ってきてあたふたしております。


卒研もいつのまにやら共同研究(2名でひとつのテーマを研究)になっており、
しかもどういうわけか研究の方は全部オマエがやれ!と先生から言われてしまい、
卒研Extraモードが始まってしまいました。プログラムがメインといってもいいテーマなので、作成自体は日頃iアプリを作っていたおかげかサクサク進むものの、やっていることの意味(科学的な何か)をなかなか理解できず四苦八苦中。
院にいくのならむしろプログラムよりもそっちの方が大事なんだし、今の内に理解できるようになりたいところ。


で、タイトルに書きましたがGIFエンコーダーをまた作ってみました。
研究テーマ中に必要かもしれない!っていうこじつけで。。。(圧縮!アニメーション!などなど)

思えばあれをつくったのももう1年以上前。(これ
完成はしたものの圧縮速度が遅くあんまり使えないものになってたと思います。
しかしそれも半年前にHDDのデータクラッシュでデコーダ部を残して他消失。以後めんどくさくて触れてませんでした。


以前のはiアプリ用ってことでjavaで書きましたが今回はC++。
ネットと以前のデコーダのソースを見ながらいろいろ思い出つつ制作。
やはり一度つくったものであると詰まるポイント(でどう対処すればいいか覚えているもので
さっくり一日でできました。(アニメーションGIF作成機能付き)

以前のはクラスを増やしたくないっていう今思えばあんまりよろしくない選択で辞書テーブルの作成方法がいちいちバイト列全部をちまちま比較していくというまったくもって非効率なものになっていましたが、今回はLZW圧縮の解説でよくみるようなツリー構造の辞書テーブルを作成させることで大幅に速度が改善されました。

ピクセルデータから1バイト読むごとにツリーを1段階たどるという流れ。
ツリーの末端に達したら要素を追加しデータを出力。追加された1バイト値が根にあるツリーに移動し、再び1バイト読み込み1段階たどるということを繰り返すのみです。

以前の方式に比べると体感で10倍くらいの改善がされてますが、他ツールでgif化したときよりも圧縮率が悪いのが気になる。(gifは256色において可逆圧縮であるが圧縮率改善のために人間の目にはわからない程度に数10色減色するツールもある模様。これだと非可逆圧縮。)
辞書テーブルのリセットタイミングなんかの調整とかで圧縮率改善できないかなぁ。
スポンサーサイト

DirectSound

どうにも再生ラグが消えなかったので、いろいろネットで調べたところWindowsXP時代ではWaveIn、WaveOutのラグが大きい、とのことでした。
Vistaではこの辺の仕様が全面的に改善されていてラグは少ないようですが、WaveIn、WaveOut自体ラグは付き物なのかもしれません。となればプログラムではどうしようもない。

現在50分の1秒のバッファを20個程度用意し、1個録音完了したら即再生、再生終了したら即録音バッファに登録をループさせていますが、録音完了から再生終了までバッファ10個分はないと安定動作しないので、ラグは50分の1秒×10、つまり0.2秒以上はありそう。(他のプログラムの動作で再生動作が遅れた場合録音バッファが増加してしまうのでバッファが一定以下になるようにしてる。)
この0.2秒ってのはバッファサイズを100分の1にしてもそうなってしまうことからイベント発生に遅延がある予感。

それが仕様なら別の録音再生手段を使うしかないわけで。。
DirectSoundの登場ですな。
まだ仕様とか全然わかりませんが、一度試してみたいですねー。


■公開について
雑な作りなので公開したら不具合たくさん見つかりそうな予感。
音転送やってる実プログラムの方はGUI側で強制キルされることがあたりまえに行われるわけですが、このとき音転送プログラムのメモリ放置。OS側がなんとかやってくるけどなんか不安。
まぁ動作中はメモリ確保なんてしないのでリークはしないですが、メッセージを渡してしっかり終了させたいなぁ。GUI側もかなりお粗末。

そんなこんなでまだ公開できません。
(この手のアプリは山ほどありそうだし。)
Go To 物置。
プロフィール

書いてる人:つん

まったりのんびり。書いてる人の息抜きブログです。

多分連絡先↓
metal_tsun@yahoo.co.jp

カテゴリー
リンク
月別アーカイブ
バロメーター
Java歴:2005年2月から今まで。
3DCG歴:2005年8月から数年。
C歴:2006年4月から今まで。
VB歴:2007年3月からちょっと。
Delphi歴:2007年3月からちょっと。
PIC歴:2007年5月から数年。
イラスト歴:2007年12月から今まで。
DTM歴2008年2月からちょっと。
PHP歴2008年4月からちょっと。
C++歴2008年4月から今まで。
C#歴2009年1月から今まで。
Objective-C歴2009年4月から今まで。
CSS歴2012年5月から今まで。

ブログ開始日2005/10/11


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。