2010年08月03日

BD-JでMP3再生

以前紹介した、pure JavaのMP3デコードライブラリを使って、BD-JでMP3ファイルの再生をさせてみました。ポイントは次の2点です。

  1. デコード結果の波形データをSound data file形式にフォーマットし、HSoundを使用して出力
  2. Sound data fileのヘッダ生成には、hdcookbookのBDJSoundGeneratorのメソッドを利用(writeSoundHeaderなど)

参考までにソースコードの断片を掲載します。なお、次の制限事項をご理解のうえお試しください。

  • 最大数十秒まで
  • サンプリング周波数は48kHzのみ対応(一般的な44.1KHzだと早回しになります)
    public void initXlet(XletContext context){
        try {
            byte[] buf = null;
            int numInputs = 1;
            int channels = 1;
            
            String fname = System.getProperty("bluray.vfs.root")+"test.mp3";
            BitStream bitstream = new BitStream( new BufferedInputStream(new FileInputStream(fname), 2048) );
            Header header = bitstream.readFrame();
            Decoder decoder = new Decoder(header, bitstream);
            channels = decoder.getOutputChannels();
            int frameLengths = ( 1024*1024*2 - 56 ) /( channels*2);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DataOutputStream out = new DataOutputStream(new BufferedOutputStream(baos));
            writeSoundHeader(out, numInputs);
            writeSoundAttributes(out, channels, frameLengths);

            byte[] buff = new byte[4];
            for( int n = 0;; ){
                SampleBuffer output = (SampleBuffer)decoder.decodeFrame();
                if( output.size() == 0 ) break;
                byte[] b = output.getBuffer();
                if( channels == 2 ){
                    for( int i = 0; i < output.size() && n < frameLengths; i+=4, n++ ){
                        buff[0] = (byte)( b[i+1] );
                        buff[1] = (byte)( b[i] );
                        buff[2] = (byte)( b[i+3] );
                        buff[3] = (byte)( b[i+2] );
                        out.write(buff, 0, 4);
                    }
                } else {
                    for( int i = 0; i < output.size() && n < frameLengths; i+=2, n++ ){
                        buff[0] = (byte)( b[i+1] );
                        buff[1] = (byte)( b[i] );
                        out.write(buff, 0, 2);
                    }
                }                
                if( n >= frameLengths ){
                    break;
                }
                    
                bitstream.closeFrame();
                header = bitstream.readFrame();
            }
            out.close();
            buf = baos.toByteArray();
            HSound hs = new HSound();
            hs.set(buf);
            hs.play();
        } catch(Throwable thr) {
        }
    }
  

Posted by bdjatwiki at 00:00Comments(0)TrackBack(0)

2010年07月09日

PC用Javaでの各種メディアフォーマット再生

一応、NiconizerはWindowsでも動作することを目標としていますが、Sun(Oracle?)からリリースされているJMF標準実装はサポートしているフォーマットが貧弱で、とても使う気になりません。

しかし、需要あるところに供給あり。FMJ(Freedom in Media In Java)というJMF互換ライブラリが出ています。これはインタフェースはJMFでOS毎のメディア再生フレームワークを呼び出すようになっています。

Windowsの場合、そこから一式をダウンロードして、その中をfmj.jarとjdshow.dllを取り出し、classpathにfmj.jarを設定し、jdshow.dllにパスを通すことで、DirectShowでサポートされている一通りのファイルが再生できます。

ただし、残念なことに、次のような制限があります。

  • 画面サイズの動的な変更に追従しない
  • 再生用のUIをない(些細なことですが)
  • デフォルトではrm(Real Media)やm2tsなどの拡張子が登録されておらず、"unknown content type"となります(MimeManager.javaをいじればよさそう)
  
Posted by bdjatwiki at 00:00Comments(0)TrackBack(0)

2010年05月23日

JLayerME 0.1.3

MP3再生ライブラリ

JLayerME

JavaSEでは問題なく動作しました。

デコード自体はBD-Jでも動作するでしょうが、再生までには今思いつくだけで以下の課題が残っています。

サンプリング周波数変換
一般的なMP3は44.1kHzですが、BDでは48kHzであるため、正しく再生するためにはサンプリング周波数の変換(リサンプリングとローパスフィルタリング)をしなければなりません。
Clip AV Stream等の生成
Interactive Audioだと精々数十秒しか再生できないため、Clip AV Stream等および管理情報を生成する必要があります

ライセンス

GNU LESSER GENERAL PUBLIC LICENSE

Version 2.1, February 1999

  
Posted by bdjatwiki at 15:54Comments(0)TrackBack(0)

JpegEncoder

JPEGエンコードライブラリ

JpegEncoder

JavaSEでは問題なく実行できました。BD-Jでも変更なしで動作しそうです。

ライセンス

The JpegEncoder and its associated classes are Copyright (c) 1998,

James R. Weeks and BioElectroMech. This software is based in part on

the work of the Independent JPEG Group.

Redistribution and use in source and binary forms, with or without

modification, are permitted provided that the following conditions are

met:

1. Redistributions of source code must retain the above copyright

notice, this list of conditions, all files included with the source

code, and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright

notice, this list of conditions and the following disclaimer in the

documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND

ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS

BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR

CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF

SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR

BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,

WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE

OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN

IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  
Posted by bdjatwiki at 15:51Comments(0)TrackBack(0)