2010-07-09 38 views
13

Tôi đang cố tìm cách phát trực tuyến video trực tiếp được tạo trong ứng dụng Java. Ứng dụng cần chụp ảnh màn hình của chính nó và mã hóa chúng thành luồng video và xuất bản luồng.Làm thế nào để truyền tải video trực tiếp từ bên trong một ứng dụng Java?

Cho đến nay tôi đã sử dụng Xuggler (thư viện Java phía trên FFMPEG) để mã hóa ảnh chụp màn hình thành tệp video. Điều này làm việc tuyệt vời. Xuggler tuyên bố có thể truyền tải video trực tiếp qua RTMP nhưng tôi không tìm thấy bất kỳ tài liệu nào về cách thực hiện điều này theo chương trình.

  1. Có ai biết cách phát trực tuyến video RTMP theo chương trình từ Xuggler không?
  2. Có ai có đề xuất về các thư viện khác mà tôi có thể sử dụng để đạt được kết quả tương tự không? Tôi muốn phát video trong MPEG2 qua RTP.

Tôi đã tìm một người khác hỏi một câu hỏi rất giống nhau trên diễn đàn Xuggler here không có phản hồi.

Tôi đã xem xét JMF và nó không phải là một lựa chọn vì các lý do khác.

Trả lời

20

Thành thật mà không lãng phí thời gian của bạn với JMF, bạn có thể xem xét rằng cung cấp đã chết. Đây là cách bạn sẽ làm màn hình shotting đến một dòng rtmp sử dụng h.264 (nhờ [email protected] cho ví dụ). Nếu mã không hiển thị ở đây là dấu gạch ngang cho mã đó: http://pastebin.com/sJHwj0nW

import com.xuggle.xuggler.Configuration; 
import com.xuggle.xuggler.ICodec; 
import com.xuggle.xuggler.IContainer; 
import com.xuggle.xuggler.IContainerFormat; 
import com.xuggle.xuggler.IPacket; 
import com.xuggle.xuggler.IPixelFormat; 
import com.xuggle.xuggler.IRational; 
import com.xuggle.xuggler.IStream; 
import com.xuggle.xuggler.IStreamCoder; 
import com.xuggle.xuggler.IVideoPicture; 
import com.xuggle.xuggler.video.ConverterFactory; 
import com.xuggle.xuggler.video.IConverter; 
import java.awt.AWTException; 
import java.awt.Rectangle; 
import java.awt.Robot; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Properties; 

public class XugglerRtmpReferenceImpl { 

    private static String url = "rtmp://your.test.server/screen/"; 
    private static String fileName = "test/teststream"; 
    private static int framesToEncode = 60; 
    private static int x = 0; 
    private static int y = 0; 
    private static int height = 480; 
    private static int width = 640; 

    public static void main(String[] args) { 
     IContainer container = IContainer.make(); 
     IContainerFormat containerFormat_live = IContainerFormat.make(); 
     containerFormat_live.setOutputFormat("flv", url + fileName, null); 
     container.setInputBufferLength(0); 
     int retVal = container.open(url + fileName, IContainer.Type.WRITE, containerFormat_live); 
     if (retVal < 0) { 
      System.err.println("Could not open output container for live stream"); 
      System.exit(1); 
     } 
     IStream stream = container.addNewStream(0); 
     IStreamCoder coder = stream.getStreamCoder(); 
     ICodec codec = ICodec.findEncodingCodec(ICodec.ID.CODEC_ID_H264); 
     coder.setNumPicturesInGroupOfPictures(5); 
     coder.setCodec(codec); 
     coder.setBitRate(200000); 
     coder.setPixelType(IPixelFormat.Type.YUV420P); 
     coder.setHeight(height); 
     coder.setWidth(width); 
     System.out.println("[ENCODER] video size is " + width + "x" + height); 
     coder.setFlag(IStreamCoder.Flags.FLAG_QSCALE, true); 
     coder.setGlobalQuality(0); 
     IRational frameRate = IRational.make(5, 1); 
     coder.setFrameRate(frameRate); 
     coder.setTimeBase(IRational.make(frameRate.getDenominator(), frameRate.getNumerator())); 
     Properties props = new Properties(); 
     InputStream is = XugglerRtmpReferenceImpl.class.getResourceAsStream("/libx264-normal.ffpreset"); 
     try { 
      props.load(is); 
     } catch (IOException e) { 
      System.err.println("You need the libx264-normal.ffpreset file from the Xuggle distribution in your classpath."); 
      System.exit(1); 
     } 
     Configuration.configure(props, coder); 
     coder.open(); 
     container.writeHeader(); 
     long firstTimeStamp = System.currentTimeMillis(); 
     long lastTimeStamp = -1; 
     int i = 0; 
     try { 
      Robot robot = new Robot(); 
      while (i < framesToEncode) { 
       //long iterationStartTime = System.currentTimeMillis(); 
       long now = System.currentTimeMillis(); 
       //grab the screenshot 
       BufferedImage image = robot.createScreenCapture(new Rectangle(x, y, width, height)); 
       //convert it for Xuggler 
       BufferedImage currentScreenshot = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); 
       currentScreenshot.getGraphics().drawImage(image, 0, 0, null); 
       //start the encoding process 
       IPacket packet = IPacket.make(); 
       IConverter converter = ConverterFactory.createConverter(currentScreenshot, IPixelFormat.Type.YUV420P); 
       long timeStamp = (now - firstTimeStamp) * 1000; 
       IVideoPicture outFrame = converter.toPicture(currentScreenshot, timeStamp); 
       if (i == 0) { 
        //make first frame keyframe 
        outFrame.setKeyFrame(true); 
       } 
       outFrame.setQuality(0); 
       coder.encodeVideo(packet, outFrame, 0); 
       outFrame.delete(); 
       if (packet.isComplete()) { 
        container.writePacket(packet); 
        System.out.println("[ENCODER] writing packet of size " + packet.getSize() + " for elapsed time " + ((timeStamp - lastTimeStamp)/1000)); 
        lastTimeStamp = timeStamp; 
       } 
       System.out.println("[ENCODER] encoded image " + i + " in " + (System.currentTimeMillis() - now)); 
       i++; 
       try { 
        Thread.sleep(Math.max((long) (1000/frameRate.getDouble()) - (System.currentTimeMillis() - now), 0)); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } catch (AWTException e) { 
      e.printStackTrace(); 
     } 
     container.writeTrailer(); 
    } 
} 
+0

Hãy thử như tôi có thể, tôi đoán quá dài đối với khối mã. –

+2

Cảm ơn. Điều này đã giúp bằng cách chỉ cho tôi đi đúng hướng. – Tansir1

+0

Có phải là luồng video từ máy ảnh và mic trong live –

Các vấn đề liên quan