目前日期文章:201505 (6)

瀏覽方式: 標題列表 簡短摘要

本文以 OpenGL ES 範例 - GLSurfaceView 實作 與 影像播放器實作 - 使用 MediaCodec 類别 為基礎實作影像播放器 (不含聲音). MediaCodc 輸出影像至使用SurfaceTexture 類別建立之 Surface.

<<SurfaceTexture>>

建立 SurfaceTexture, 建構元需要傳入由 glGenTextures() 產生的 texturehandler. 再將 SurfaceTexture 傳入 Surface 建構元.

配置 SurafceTexture.OnFrameAvailableListener(), OnFrameAvailable() 將在 MediaCodec.releaseOutputBuffer() 後觸發.

if (id == R.id.action_play) {
// Create SurfaceTexture and set callback for frame update event triggered by
// MediaCodec releaseOutputBuffer()
if (surfaceTexture == null) {
surfaceTexture = new SurfaceTexture(glRenderer.getTextureHandle());
surfaceTexture.setOnFrameAvailableListener(this);
文章標籤

版大 發表在 痞客邦 留言(0) 人氣()

使用 MediaPlayer 類别可以快速的開發影音播放器但是缺少了對於底層缓冲區操作的可能. 本文使用 MediaCodec 類别實作簡易的影像播放器, 並不包含聲音與影音同步與大部分的錯誤處理.

對於MediaPlayer 類别的實作請参考 影音播放器實作 - 使用 MediaPlayer 類别  一文.

<<原始碼>>

GitHub SampleMediaCodec  

<<類别介绍 - MediaExtractor>>

用來取得媒體檔案資訊 (MediaFormat) 與原始影像資料 (SampleData).

<<類别介绍 - MediaCodec>>

處理原始影像資料 (SampleData) 並輸出解碼後影像, 原始影像資料來源為可從 MediaExtractor.readSampleData() 取得.

輸入缓冲區由 getInputBuffer() 取得, 但是需要先呼叫 dequeueInputBuffer() 取得可用缓冲區索引值 (index). 將原始影像資料置入輸入缓冲區後, 呼叫 queueInputBuffer() 讓 MediaCodec 解碼.

解碼後的影像 (輸出缓冲區) 可由 getOutputBuffer() 取得並修改, 同樣的, 需要先呼叫 dequeueOutputBuffer() 取得可用缓冲區索引值, 與呼叫 releaseOutputBuffer() 通知 MediaCodec 輸出缓冲區的操作完成.

文章標籤

版大 發表在 痞客邦 留言(0) 人氣()

本文使用 MediaPlayer 類别實作影音播放器. 

<<Commit>>

commit 40967ef47d6df1d13b3dff69e4f4e886d8c7e2d3
Use MediaPlayer.prepareAsync() instead of prepare() to avoid UI no response in buffering

commit 4b757d8cda01b91a44ade5c7c9a615b244050180
Implement video playback
Playback video from internet
Create SurfaceView and SurfaceHolder and set MediaPlayer video surface on it

commit 656bc0b269f32bffe69c0543916d4aa1581c9e99
Implement playback timer

文章標籤

版大 發表在 痞客邦 留言(0) 人氣()

Fragment shader 又稱為像素 (Pixel) 着色器.

本文使用像素着色器修改原始圖片 (纹理, Texture), 將圖片分成四個象限缩圖, 第一象限為原色, 其餘為過濾 R, G , B 後的输出.

<<像素着色器原始碼>>

private final String fragmentShaderCode =
"precision mediump float;" +
"uniform sampler2D texture;" +
"varying vec2 texCoordVar;" +
"void main() {" +
" vec4 texColor;" +
" vec2 position = texCoordVar;" +
文章標籤

版大 發表在 痞客邦 留言(0) 人氣()

着色器原始碼與程式執行時利用 glCompileShader() 编譯, 本文說明编譯着色器原始碼的除錯方式.

<<步驟>>

使用 glGetShaderiv() 與参數 GL_COMPILE_STATUS 取得着色器编譯结果.

使用 glGetShaderiv() 與参數 GL_INFO_LOG_LENGTH 取得錯誤訊息長度.

使用 glGetShaderInfoLog() 取得錯誤訊息.

<<原始碼>>

private static int loadShader(int type, String shaderCode) {
int shader;

shader = GLES20.glCreateShader(type);
文章標籤

版大 發表在 痞客邦 留言(0) 人氣()

本文提供 OpenGL ES 範例, 作業環境為 Ubuntu 14.04 LTS 使用 Android Studio 1.2.1.1. 原始碼可從 GitHub 下載.

 

<<原始碼>>

QR SampleOpenGL  

<<範例一>>

創建 GLSurfaceView 與 SampleGLRenderer 物件並填满绿色背景. SampleGLRenderer 類别為 .Renderer 的實作.

Commit:

https://github.com/ArtisteHsu/SampleOpenGL/commit/5a689950ee8eea33bd67a22ffb191fbf20f926cd

<<範例二>>

使用 OpenGL ES2.0 的 Vexter shader 與 Fragment shader 繪製三角型.

文章標籤

版大 發表在 痞客邦 留言(0) 人氣()