2009-05-03 8 views
0

Ich möchte die Interaktion des Benutzers in meinem Java-Applet als ein Video aufzeichnen, um es an meinen Server zu senden (möglicherweise zu streamen), um es auf Youtube (oder ähnlich) hochzuladen. Eine hohe Bildrate ist nicht erforderlich (ein paar Bilder pro Sekunde sind ausreichend).Welche Bibliothek kann ich zum Codieren von Video in einem Java Applet verwenden?

Es wird bevorzugt, die verwendete Bandbreite zu minimieren, daher ist das Senden von jpeg-Snapshots an den Server und die serverseitige Codierung mein letzter Ausweg.

Gibt es leichte Java-Videokodierungsbibliotheken, die keinen systemeigenen Code erfordern?

Antwort

0

Warum müssen Sie die Bilder oder das Videoformular direkt senden? Klingt wie ein großer Bandbreitenaufwand. Serialisieren und senden Sie einfach den Strom von UI-Ereignissen mit Zeitstempeln und rekonstruieren Sie, was der Benutzer später auf Ihrem Server sehen sollte (einige visuelle Details können vom Computer/Setup des Benutzers abhängen, aber Ihr Applet wird nicht zu ihnen gelangen anständig sowieso).

+0

Alex: Dies ist auch eine Option, die ich erforsche. Mit den Rechen- und Speicheranforderungen des Applets bin ich mir nicht sicher, was eine größere Ausgabe wäre, die ~ 10MB Bandbreite eines Youtube-Qualitätsvideos oder die Rechenleistung, um die Benutzerinteraktion Server-Seite neu zu erstellen. –

1

Ich bin neu in Java so tut dies nicht, um ernst :)

ich einen guten Start mit Videocodierung in Java erraten ist Java Media Framework. Ich habe es nicht versucht, also weiß ich nicht, was sie bei FLV-Codierung unterstützen.

Da Flash Media Server kommerziell ist, konnten Sie nicht Red5 verwenden? Sie hätten ein swf, kein Applet, aber Sie werden einen breiteren Prozentsatz der Zuschauer bekommen, da Flash Player ziemlich weit verbreitet ist.

Und Alex hat einen guten Punkt, da Sie das Video auf youtube hochladen müssen, warum nicht verwenden, sind sie API?

hth

+0

George: Ich habe in der Vergangenheit mit red5 gearbeitet, aber ich kann mich nicht erinnern, ob es die Fähigkeit hatte, Inhalt selbst zu erzeugen, oder es einfach an/von Flash-Clients zu empfangen. Ich werde JMF erkunden müssen ... –

1

Xuggler kann so ziemlich jedes Format von Java zu kodieren, verwendet werden, aber es erfordert eine native Komponente mit ihm installiert werden. Im benutzerfreundlichen Download ist keine Applet-Version verfügbar, aber einige Benutzer haben benutzerdefinierte Versionen von FFmpeg und Xuggler erstellt, die sie in herunterladbaren Anwendungen verwendet haben. Versuchen Sie, in der Benutzergruppe xuggler-users nachzufragen, ob andere helfen können.

1

Sie können Ihre Bilder in H.264/MP4 kodieren, so dass es sofort für das Web-Streaming geeignet wäre. Um es parallel zur Aufnahme hochzuladen, können Sie Ihre Sequenz in kleine Stücke aufteilen, sagen wir 25-100 Bilder und laden jedes Stück als separaten Film hoch.

Sie können es in reinem Java ohne systemeigenen Code tun, verwenden Sie einfach JCodec (http://jcodec.org). Hier ist eine handliche Klasse, die Sie verwenden können:

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); 
    } 
}