2011-06-19 67 views
3

我一直在尋找基於Java的視頻播放器,不,我不需要它。看看是否有多少Java視頻播放器。令我大吃一驚的是,我沒有發現。至少沒有任何流行的,如VLC,WMP等。我認爲這些球員有一些Java替代品。基於Java的視頻播放器能夠足夠快嗎?

很明顯,我發現許多聲明說Java對玩家來說太慢了。從我讀到的內容可以分爲兩個子問題:

首先,關於Java beeing的腳本編寫太慢,不適合視頻解碼。但是自從我開始使用Java之後,我一直認爲它的速度其實非常好。當溫暖的JVM幾乎和C++寫的程序一樣時,我發現了很多基準。非常好。我認爲這是因爲這些基準算法很小,並且是重複的,所以JVM準備了那些代碼並從那裏快速地完成。也許在更大的程序中,由於動態編譯,它實際上會慢得多。我真的不知道。但是由於Java被JVM編譯成本地代碼,所以它的速度真的很重要,它是多少代碼和預編譯速度,對嗎?當然還有其他的不同之處,但最大的一個就是真正的編輯。

第二,人們寫道,他們有用C++編寫的視頻解碼器,並通過JNI獲取圖片數據。但他們說Java太慢了,甚至無法將這些30 FPS甚至是HD Ready圖像進行繪製。但爲什麼?我一直認爲JVM使用可用的最快方法在OS中獲得它的窗口,並且在內部操縱它的內容。如果我在JVM被「加熱」時按下Java足夠快(意味着C++),那麼顯示圖像的問題在哪裏?所有的JVM在這種情況下都要寫數組到OS特定的顯示輸出,對吧?

那麼,Java真的很慢,還是我錯過了什麼?全速(或幾乎全速)的視頻播放器是用純Java編寫的嗎?如果不是,爲什麼?謝謝。

回答

4

三谷歌命中爲「視頻回放的Java」,似乎相關: http://blog.pirelenito.org/2008/08/java-movie-playback-jogl-fobs4jmf/

我不與主體給予了肯定的答案不夠熟悉,但我可以對你提出某些問題展開:

但是,由於Java被JVM編譯爲本機代碼,所以它的速度真的很重要,它是多少代碼和預編譯速度,對吧?當然還有其他的不同之處,但最大的一個就是真正的編輯。

有幾點我不會失望失控。首先,Java規範要求在每次訪問數組元素之前,運行時必須檢查索引是否有效,即0 <= index && index < array.length。我認爲視頻解碼會大量使用數組,因此Java陣列可能不適合完成這項任務。

但他們說Java太慢了,甚至無法繪製這些30 FPS甚至是HD Ready圖像。但爲什麼?我一直認爲JVM使用可用的最快方法在OS中獲得它的窗口,並且在內部操縱它的內容。如果我在JVM被「加熱」時按下Java足夠快(意味着C++),那麼顯示圖像的問題在哪裏?所有的JVM在這種情況下都要寫數組到OS特定的顯示輸出,對吧?

Cough ...我不會爲Java 2D API高效地調用默認渲染器。至少在我的計算機上,使用JDK提供的API直接通過JOGL進行Open GL調用的效率非常高(約爲10)。我懷疑工作中軟件和硬件渲染之間的區別......但這不是主要的語言錯誤,而是它的標準庫。無論編程語言如何,如果沒有硬件加速,沒有任何人能夠正確地思考高性能圖形。此外,渲染通常不僅僅是複製一個數組,例如縮放,顏色空間轉換和緩衝(以避免撕裂)。底線:我認爲可以在Java中進行視頻播放,但它很可能需要使用本地庫來訪問硬件加速,並且可能比純粹的本地解決方案效率稍低。

1

專用視頻播放器已創建,請參閱http://groups.csail.mit.edu/graphics/pubs/spie3528-26.pdf對於一些較早的出版物。

通用庫並未廣泛使用,因爲當前硬件支持視頻編碼/解碼。在大多數情況下,JIT不使用這些擴展。

對於許多目的而言,手工製作的彙編代碼仍然是編寫的。這個任務不能由當前的編譯器建立,因此也不能由JIT建立。一些圖形硬件也能夠加速解碼。這對JIT也是不可用的(至少在目前的實施中)。因此,與高度優化的代碼相比,使用java進行視頻解碼要慢得多(某些視頻播放器爲不同的CPU提供了不同版本的相同代碼)。

這些闡述是爲i386平臺採取的。對於在硬件中運行Java的平臺(例如嵌入式系統),它們可能無法再有效。