2009年12月1日 星期二

[Java] 將連續的 Images (JPEG) 轉成 AVI/MOV

花了非常多的時間看資料,結果成效不彰啊!主要是在找 Java 版的程式庫,但偶爾也會看到幾眼 C 語言版本,兩者交互測試。我想做的事有兩件,第一件事是將連續的 Jpeg 串成影片,第二件事,就是將兩個影片再合併成一個影片,主要用在一些演算法上。


以下是我參考的相關討論,其中 Java Media Framework 中,有很完整的範例程式 JMF 2.1.1 Solutions ,它可以將 jpeg 弄成 mov 影片,並且又提供 merge 的範例,但無論我怎樣試,都沒辦法把兩個 mov 再串成一個 mov ,儘管程式在編譯或執行上都沒有顯示任何問題(除了範例程式使用 Vector 沒有指定 type),但合併的結果卻不是正常的,真讓我十分灰心。





最後,關於 Jpeg 製成 AVI 的部分,我使用 Writing AVI videos using pure Java 這篇提到的 AVIDemo.jar 程式庫,寫得滿乾淨又簡單!


import ch.randelshofer.media.avi.AVIOutputStream;
import java.io.*;
import java.awt.image.BufferedImage ;
import javax.imageio.ImageIO;

class test
{
        public static void main( String[] args ) throws Exception
        {
                if( args.length < 2 )
                {
                        System.out.println( "Usage> test file_out 1.jpg" );
                        System.exit( -1 );
                }
                AVIOutputStream out = null;
                out = new AVIOutputStream( new File( args[0] ) , AVIOutputStream.VideoFormat.JPG );
                out.setVideoCompressionQuality( 1f );
                out.setTimeScale(1);
                out.setFrameRate(1);

                for( int i=1 ; i <args.length ; ++i )
                {
                        out.writeFrame( ImageIO.read(new File( args[i] ) ) );
                }
                out.close();
        }
}


如此一來,就能夠用 java test out.avi 1.jpg 2.jpg 3.jpg 來產生影片啦!


關於 Merge 的部分,暫時沒有 Java 版的成果,以下是相關的參考資料,但我尚未測試成功。



關於將兩個影片串在一起,其實早就有範例可用啦!



看來我的英文真的有待加強!隔行如隔山!下錯關鍵字,成果差很大啦,用上述的範例程式就可以成功把我作的影片合併再一起囉!


如果是 C 的版本,那有 Transcode 可以用喔,裡頭有一支 tool 叫 avimerge ,它可以很成功的將我用上述 Java 程式產生影片合併串在一起。最後,若純粹只是想把 jpeg 串成影片,或將影片再合併起來,滿推薦使用 mencoderTranscode - avimerge ,前者有需要可以再參考這篇 製作 Motion JPEG (Mjpeg) 影片 - 將連續的照片串成影片


1 則留言:

  1. Hello 您好
    請問透過此程式進行jpeg壓縮至avi檔,
    是否有jpeg解析度及jpeg的數量限制,
    假設,有一萬張jpeg,在壓縮的過程中,會不會造成記憶體不夠之類的,

    謝謝您的答覆,感恩。

    版主回覆:(04/13/2010 12:06:03 AM)


    不好意思, 我還沒有試過這個大量的 case 囉, 當初只是拿來練習而已 :D
    所以你的問題我沒辦法回答你

    回覆刪除