• スポンサードリンク

Android用にタイムシフト録画クラスを作ってみた〜その2〜

Android MediaCodec アプリ

意外と見てる人がいるので、調子乗って酔った勢いでその2を書いてみたぁ(*ノω・*)テヘ
寝ても酔っても仕事するさきちゃん(^o^)v

気を取り直して、まずはやっぱりディスクキャッシュからやな。と言っても前回することは大体書いてもうたけど。

じゃじゃんと取り出したりまするは4.1.1_r1のDiskLruCache.java^^
元々はキーとしてStringを使うようになっておりまする。でも今回は諸般の事情でMediaCodecのエンコーダーが吐くpresentationTimeUsをキーに使いたいのでありまする。キーとしてlongしか来ないとわかってるのにわざわざザワザワStringに変換するなんてありえないのでありんす。
という事で、キーの型をStringからlongに変えます。でも一部分は残念なJavaの制限によりLongにしまする(´・ω・`)
ついでに前回も書きましたがLruだと都合がわるいので挿入順にする必要があります。

という事で例えば

となっていた所は

みたく書き換えてしまいます。
フィールド名が変わってるのは好みの問題^^; だってLruじゃないんだもーん^^

これでディスクキャッシュの方はだいたいおしまいなんやけど、多少は使いやすいようにヘルパーメソッドを追加しましょう。

まずは一番古い要素のキーとそれに対応する要素を取得するメソッド

イテレータの先頭を取得するだけ。簡単にゃぁ(\^^/)

さらに元々のDiskLruCacheクラスでは#getメソッドで

Snapshotとして要素を取得したあとはSnapshot#getStringで文字列として読み取るか、Snapshot#getInputStreamでInputStreamとして読み取るかの2択となりますが、今回の用途ではbye配列またはByteArray、あるいはintとして読み取れた方が便利です。
という事で、Snapshotクラスにもメソッドを追加します。

今回は使ってないけどおまけで余計なのも追加してこんな感じ。

にゃにゃっ、どさくさに紛れて#getXXX以外のも載せちゃったにゃぁ(*´ڡ`●)
#getStringで文字列として取得したり、BitmapをInputStream経由で読み込むだけであれば無くても困らないんだけど、今回のようにbyte配列またはByteBufferとしてアクセスする場合に必要となるもの、それはデータの長さなのです。という事でこっそりと…ではないけど#availableメソッドも追加してあります。メソッド名は微妙とは思うけど、対応するInputStreamのメソッド名が#availableなんだもん。

それはそうとSnapshotクラスはキャッシュ内の要素のデータを読み取るためのクラスです。豚には真珠、豆腐にはかすがい、馬の耳には東風が必要なように、SnapshotクラスにはEditorクラスと対応するメソッドが必要なのです。ナンノコッチャ。

こっちもどさくさに紛れて使わないのも追加してるけど、

てな感じで(元からあるのは省略)。まぁオーバーロードメソッドを追加しただけやな。他の方法もあるので好みの方法で実装してんな。
一見は百聞にしかず…説明は省略です。単に面倒臭いだけという疑惑も(汗)
本当は#setも#getXXXもループ内で繰り返し呼ばれるのでメソッド内部でワーク用のバッファを確保したくは無いんだけど(。・_・。)
まぁプリミティブのローカル配列なのでスタックに積まれるだろうと言う事で勘弁してんな。

という事で酔いどれさきちゃんはそろそろお眠なのですーす。
次はService側な。
おやすみー(^_^)/~

« »

  • スポンサードリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

%d人のブロガーが「いいね」をつけました。