2009-05-03 5 views
0

Javaアプレットにユーザのインタラクションを録画して、YouTubeにアップロードする予定のある(または同様の)ビデオを(私は潜在的にストリームする)私のサーバに送信したいと思います。高いフレームレートは必要ありません(1秒あたり数フレームで十分です)。Javaアプレットでビデオをエンコードするにはどのライブラリを使用できますか?

使用帯域幅を最小限に抑えることが望ましいため、サーバー側にjpegスナップショットを送信し、サーバー側をエンコードすることが私の最後の手段です。

ネイティブコードを必要としない軽量のJavaビデオエンコードライブラリがありますか?

答えて

0

なぜ画像やビデオ形式を直接送信する必要がありますか?大きな帯域幅の費用のように聞こえる。シリアライズしてタイムスタンプ付きのUIイベントのストリームを送信し、後でユーザーがあなたのマシン/セットアップに依存するかもしれないが、あなたのアプレットはそれらにアクセスできないでしょうまともにとにかく)。私は、Javaに新たなんだ

+0

アレックス:これは私が探検しているオプションです。アプレットの計算とメモリの要件によって、実際には、より大きな費用、youtubeの高品質ビデオの〜10MBの帯域幅、またはユーザのインタラクションサーバ側を再現するためのコンピューティングパワーが実際にはわかりません。 –

1

はこれに真剣にこれを取ることはありません:)

を、私はJavaでのビデオエンコーディングで良いスタートがJava Media Frameworkあると思います。 私はそれを試していないので、私は彼らが何flvエンコーディングでサポートされているのか分からない。

Flash Media Serverは商用であるため、Red5を使用できませんでしたか? アプレットではなくswfを使用しますが、Flash Playerが広く普及しているため、視聴者の割合が増えます。

あなたはYouTubeにビデオをアップロードする必要があるので、そしてアレックスは良い点を持っています、なぜ彼らはAPIですか?

HTH

+0

George:以前はred5で作業していましたが、コンテンツ自体を生成する能力があるのか​​、それともFlashクライアントからコンテンツを提供するのかを覚えていません。 私はJMFを探検しなければなりません... –

1

XugglerはかなりJavaから任意の形式を符号化するために使用することができるが、それはそれをインストールするネイティブコンポーネントを必要とします。使用しやすいアプレットのバージョンはありませんが、ダウンロード可能なアプリケーションで使用しているFFmpegとXugglerのカスタムバージョンをビルドしているユーザーもいます。 xuggler-usersユーザグループに助けを求める人がいるかどうか聞いてみてください。

1

イメージをH.264/MP4にエンコードすることで、Webストリーミングにすぐに適しています。録画と並行してアップロードするには、シーケンスを小さなチャンクに分割して、それぞれ25〜100枚の画像を作成し、各チャンクを別々のムービーとしてアップロードしましょう。

ネイティブコードなしで純粋なJavaで実行できます。ちょうどJCodec(http://jcodec.org)を使用します。あなたが使用できる便利なクラスは次のとおりです。

public class SequenceEncoder { 
    private SeekableByteChannel ch; 
    private Picture toEncode; 
    private RgbToYuv420 transform; 
    private H264Encoder encoder; 
    private ArrayList<ByteBuffer> spsList; 
    private ArrayList<ByteBuffer> ppsList; 
    private CompressedTrack outTrack; 
    private ByteBuffer _out; 
    private int frameNo; 
    private MP4Muxer muxer; 

    public SequenceEncoder(File out) throws IOException { 
     this.ch = NIOUtils.writableFileChannel(out); 

     // Transform to convert between RGB and YUV 
     transform = new RgbToYuv420(0, 0); 

     // Muxer that will store the encoded frames 
     muxer = new MP4Muxer(ch, Brand.MP4); 

     // Add video track to muxer 
     outTrack = muxer.addTrackForCompressed(TrackType.VIDEO, 25); 

     // Allocate a buffer big enough to hold output frames 
     _out = ByteBuffer.allocate(1920 * 1080 * 6); 

     // Create an instance of encoder 
     encoder = new H264Encoder(); 

     // Encoder extra data (SPS, PPS) to be stored in a special place of 
     // MP4 
     spsList = new ArrayList<ByteBuffer>(); 
     ppsList = new ArrayList<ByteBuffer>(); 

    } 

    public void encodeImage(BufferedImage bi) throws IOException { 
     if (toEncode == null) { 
      toEncode = Picture.create(bi.getWidth(), bi.getHeight(), ColorSpace.YUV420); 
     } 

     // Perform conversion 
     transform.transform(AWTUtil.fromBufferedImage(bi), toEncode); 

     // Encode image into H.264 frame, the result is stored in '_out' buffer 
     _out.clear(); 
     ByteBuffer result = encoder.encodeFrame(_out, toEncode); 

     // Based on the frame above form correct MP4 packet 
     spsList.clear(); 
     ppsList.clear(); 
     H264Utils.encodeMOVPacket(result, spsList, ppsList); 

     // Add packet to video track 
     outTrack.addFrame(new MP4Packet(result, frameNo, 25, 1, frameNo, true, null, frameNo, 0)); 

     frameNo++; 
    } 

    public void finish() throws IOException { 
     // Push saved SPS/PPS to a special storage in MP4 
     outTrack.addSampleEntry(H264Utils.createMOVSampleEntry(spsList, ppsList)); 

     // Write MP4 header and finalize recording 
     muxer.writeHeader(); 
     NIOUtils.closeQuietly(ch); 
    } 
} 
関連する問題