このズレがどうしても許せない場合はこの方法は使えません。別の方法を考えてみました。
ANDROID_LOOP=trueメタデータ付きのoggファイルを直接再生するのではなく、一旦別ファイルにコピーして再生します。さらにコピーの途中で 「ANDROID_LOOP=true」に一致する部分があれば、その部分を空白文字に置き換えてしまいます。
static public boolean copyWithAndroidLoopFalse(InputStream src, OutputStream dst) { byte[] android_loop = {0x41, 0x4E, 0x44, 0x52, 0x4F, 0x49, 0x44, 0x5F, 0x4C, 0x4F, 0x4F, 0x50, 0x3D, 0x74, 0x72, 0x75, 0x65}; while(true) { byte[] raw_page = readPageBytes(src); if (raw_page == null) return false; if (raw_page.length == 0) break; int index = findBytePattern(raw_page, android_loop); if (index >= 0) { //ANDROID_LOOP=trueが見つかったら空白文字に置き換える for(int i=0; i<android_loop.length; i++) { raw_page[index + i] = 0x20; } } try { dst.write(raw_page); } catch (IOException e) { e.printStackTrace(); return false; } } return true; } static private int findBytePattern(byte[] search_byte, byte[] search_pattern) { int byte_length = search_byte.length; int pattern_length = search_pattern.length; for(int i=0; i<=byte_length - pattern_length; i++) { for(int j=0; j<pattern_length; j++) { if (search_byte[i+j] == search_pattern[j]) { if (j == search_pattern.length - 1) { return i; //search_pattern全て一致 } } else { break; } } } return -1; //一致しなかった }
こんなことして大丈夫なの?と思われるかもしれませんが、Vorbisの仕様ではユーザーコメントは長さとコメントの組み合わせで、長さが変わらなければ大丈夫と思います。それよりもむしろ、「ユーザーコメントは名前と値をイコールでつないだもの」とあるのですが、そっちを守っていないのが少し心配です。
フォーマットは以下のサイトを参考にしました
Mitsugu Oyama のソフトウェア倉庫
0 件のコメント:
コメントを投稿