2015-10-19 132 views
4

是否可以在兩個進程之間共享SurfaceTexture,例如Activity和Service?Android在兩個進程之間共享SurfaceTexture

我想用TextureView創建一個Activity,並從一個單獨的Service更新它的SurfaceTexture。

到目前爲止,我創建了OpenGL的產生的紋理(通過glGenTextures)一個表面紋理,然後我這個表面紋理設置爲我TextureView:

mSurfaceTexture = new SurfaceTexture(texture_id); 
mTextureView.setSurfaceTexture(mSurfaceTexture); 

顯示相機預覽這個表面紋理上的有效性做工精細:

mCamera = Camera.open(); 
mCamera.setPreviewTexture(mTextureView.getSurfaceTexture()); 
mCamera.startPreview(); 

我想這樣做,但是從一個單獨的服務,傳遞texture_id吧,是這樣的:

mCamera = Camera.open(); 
mCamera.setPreviewTexture(new SurfaceTexture(texture_id)); 
mCamera.startPreview(); 

原因是我有一個單獨的進程調用一個需要SurfaceTexture來傳輸一些內容的私有api,並且這個過程通過應用程序的aidl來訪問。

感謝

回答

4

系統支持做你想要什麼,但我不知道是否有可能與目前的公共API。

一些背景知識,以確保我們在同一頁上...

面是生產者 - 消費者對的製片方。藉助SurfaceTexture,該應用程序可以訪問兩端。渲染到SurfaceTexture表面的任何東西都會轉換爲OpenGL ES「外部」紋理。

媒體和顯示API的工作方式是讓消費者創建對,然後將Surface傳遞到應用程序。這就是爲什麼,如果你創建了一個SurfaceView,直到surfaceCreated()回調觸發 - BufferQueue對象由系統圖形合成器(SurfaceFlinger)創建,並且生產者端通過Binder IPC傳遞到你的應用程序,你將無法使用Surface 。對於由mediaserver進程創建的MediaCodec編碼器的表面輸入同樣如此。

您可以將您從SurfaceView或SurfaceTexture獲得的Surface傳遞到產生輸出的東西,例如Camera preview或MediaCodec解碼器。在引擎蓋下,這些通過IPC的表面通過mediaserver過程。在生成幀時,圖形緩衝區通過引用傳遞給消費者。 SurfaceFlinger顯示它從SurfaceView獲取的框架,SurfaceTexture只是將它們轉換爲紋理。

所以你想要做的是在應用程序中創建一個SurfaceTexture,爲它構造一個Surface並將該Surface傳遞給你的服務。您的服務將生成框架並將其寫入到Surface中,該框架將通過IPC將它們發送到應用中的SurfaceTexture使用者,並將其轉換爲GLES紋理。

我還沒有嘗試過通過AIDL傳遞Surface,所以我不知道它是否會真正起作用。

在進程之間傳遞紋理ID將不起作用。如果在創建第二個上下文作爲參數傳遞第一個上下文時,您可以從兩個不同的EGLContext訪問紋理,但我認爲這不是跨期預期的工作。

有關係統工作方式的更多詳細信息,請參閱architecture doc

+0

非常感謝您的解釋,我確實想知道如果使用Surface視圖是我唯一的選擇,您確認了這一點。 –