Jun.9,2003 (Mon)
○ndiary
日記をはじめる。主に技術的なメモを記録する予定。更新の頻度はあまり高くない模様。
Jun.16,2003 (Mon)
○FreeBSD 5.1
VMware3.2 on Linux (TL8WS) にFreeBSD5.1を入れる。FTPでは何故か途中でVMのネットワークカードが固まってしまい、インストールできない。CD-ROMイメージを落としてきて、CD-ROMからインストールすると成功。早速カーネル再構築。とりあえず、今のところ問題は無いみたい。
Jun.21,2003 (Sat)
○AVIファイルのプレビューを作る。
今までtranscodeを使ってきたが、一部読み込めないAVIがあった。下位ライブラリのAVIfileでは読み込めていたので多分transcodeのバグだろうと思ってソースを見ると大変汚い。開発サイドに報告しようにもAVIファイルを送る以外に再現が難しそうだったので、別方法を考える。JavaのJMFが使えそうだったので調べる。
JMF から必要なものを取ってくる。
Howto 的なサンプルもたくさんあるので非常に便利。
Accesing Individual Decoded Video Frames を参考にして、各フレームにアクセスするプログラムを作る。
// PostAccessCodec というオブジェクトに各フレームにアクセスさせる。
TrackControl videoTrack = null;
for (int i = 0; i < tc.length; i++) {
if (tc[i].getFormat() instanceof VideoFormat) {
videoTrack = tc[i];
break;
}
}
Codec codec[] = { null , new PostAccessCodec()};
videoTrack.setCodecChain(codec);
PostAccessCode の accessFrame の内容を以下のように書くことで、各フレームの画像をJPEGで保存できる。
void accessFrame(Buffer buffer) {
Object data = buffer.getData();
if (!(data instanceof int[]))
return;
RGBFormat format = (RGBFormat) buffer.getFormat();
frameImage = new BufferedImage(format.getLineStride(),
format.getSize().height,
BufferedImage.TYPE_INT_BGR);//※注意
frameImage.getRaster().setDataElements(0,0,format.getLineStride(),
format.getSize().height,
data);
try {
FileOutputStream fout =
new FileOutputStream(new File("test-out.jpg"));
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fout);
encoder.encode(frameImage);
fout.flush();
fout.close();
} catch (IOException e) {
e.printStackTrace();
}
//この後停止処理...
※RGBかBGRかの判定は、どうやら人間の目でしか判定できないらしい。
GPLなライブラリではないが、圧倒的なドキュメントとライブラリの素晴らしさはさすがIBMとSun。