2010-09-06 46 views
4

任何人都知道ScreenVideo(v1或v2)的Java視頻編碼器是免費的嗎?我知道ffmpeg有一個C++版本,Lee Felarca在AS3中寫了一個;但我真的想在Java中有一個。
AS3:http://www.zeropointnine.com/blog/assets_code/SimpleFlvWriter.as.txtJava中的ScreenVideo編碼器

+0

好的,所以要獲得賞金,就我而言,我希望它是純java代碼。沒有JNI,JNA等.. – 2010-10-01 19:40:39

+0

我開始了一個純java版本,你可以在這裏看到:http://pastebin.com/X1cGeHat,但從來沒有完成它。 – 2010-10-01 19:44:07

+1

看看我的更新。 – Andy 2010-10-04 15:22:27

回答

8

相信Xuggle庫做你想要的東西 - 儘管它實際上可能是圍繞本機庫等的ffmpeg的包裝。

這裏的示例代碼編碼的桌面截圖片段的FLV(MP4):

final Robot robot = new Robot(); 
final Toolkit toolkit = Toolkit.getDefaultToolkit(); 
final Rectangle screenBounds = new Rectangle(toolkit.getScreenSize()); 

// First, let's make a IMediaWriter to write the file. 
final IMediaWriter writer = ToolFactory.makeWriter("output.mp4"); 

// We tell it we're going to add one video stream, with id 0, 
// at position 0, and that it will have a fixed frame rate of 
// FRAME_RATE. 
writer.addVideoStream(0, 0, 
    FRAME_RATE, 
    screenBounds.width, screenBounds.height); 

// Now, we're going to loop 
long startTime = System.nanoTime(); 
for (int index = 0; index < SECONDS_TO_RUN_FOR*FRAME_RATE.getDouble(); index++) 
{ 
    // take the screen shot 
    BufferedImage screen = robot.createScreenCapture(screenBounds); 

    // convert to the right image type 
    BufferedImage bgrScreen = convertToType(screen, 
     BufferedImage.TYPE_3BYTE_BGR); 

    // encode the image to stream #0 
    writer.encodeVideo(0,bgrScreen, 
     System.nanoTime()-startTime, TimeUnit.NANOSECONDS); 
    System.out.println("encoded image: " +index); 

    // sleep for framerate milliseconds 
    Thread.sleep((long) (1000/FRAME_RATE.getDouble())); 
} 
// Finally we tell the writer to close and write the trailer if 
// needed 
writer.close(); 

這段代碼是從這個tutorial的Xuggle網站上。

更高級的編碼,也在Xuggle網站上here

如果您想要的是原生包裝,請爲"IContainerFormat flv"運行網絡搜索以查找示例代碼的其他位。

而且,已經有一個very similar question


更新:本地Java實現從github上bigbluebutton項目

退房ScreenVideoEncoder.java

+0

很好的答案,但Xuggle是「native」它提供了通過JNI訪問ffmpeg。我正在尋找純java代碼。 – 2010-10-01 19:41:54

+0

Btw你的代碼示例不會編碼到「screenvideo」或ffmpeg「flashsv」中。這段代碼的輸出很可能是mp4容器中的h.264。 – 2010-10-01 21:27:24

+0

我不是很熟悉「screenvideo」,你能提供一個鏈接到更多信息嗎?谷歌只搜索這個術語並沒有透露太多。 – Andy 2010-10-04 03:35:20

0

我相信BigBlueButton實現了一個,但我不知道他們是否開源。在那裏檢查。

+1

沒有想過這些傢伙,但好主意。 – 2010-10-02 05:49:10

0

我不知道你是否發現用純Java寫的東西,而不使用本地代碼。視頻編碼是一項非常耗時的任務,因此通常使用'快速'本機代碼編寫,使用C或甚至彙編語言編寫。視頻編碼通常使用特殊的CPU和GPU指令來提高速度 - 這一切都無法從Java中獲得,因此在Java中編寫用於生產的視頻編碼器是沒有意義的。 如果我是你,我會採取一些本地解決方案,並將其嵌入到JNI,JNA或Swig(流行的Java到本機連接器)中。 如果您需要高可移植性(例如,32位Windows,64位Windows,32位Linux,64位Linux),只需爲這四個平臺編譯此本機庫並嵌入到JAR中即可。 如果您只需要編寫未壓縮的視頻,可以使用Java輕鬆完成,並且與原生代碼一樣快。只需將此SimpleFlvWriter.as發佈並重寫爲Java - 它不應該是一項艱鉅的任務。

2

沃納Randelshofer貼在自己的博客純Java屏幕記錄和還跟發佈來源: http://www.randelshofer.ch/blog/2011/05/pure-java-screen-recorder/ 它看起來你想要做什麼。

+0

不確定Werner的編解碼器是否相同,我會看看。這是與問題相關的編解碼器http://wiki.multimedia.cx/index.php?title=Flash_screen_video – 2011-08-02 13:23:34