我想通過NDK呈現視頻,添加一些功能,只是不支持在sdk中。我使用FFmpeg來解碼視頻,並且可以通過ndk進行編譯,並以this作爲起點。我已經修改了這個例子,而不是使用glDrawTexiOES來繪製紋理,我已經設置了一些頂點並且在這個頂點上渲染了紋理(opengl es渲染四邊形的方式)。android ffmpeg opengl es渲染電影
下面是我正在做的渲染,但創建glTexImage2D是緩慢的。我想知道是否有任何方法可以加快速度,或者提高速度,例如試圖在背景中設置一些紋理並渲染預先設置的紋理。或者,如果有其他方法可以更快速地將視頻幀繪製到Android屏幕上?目前我只能獲得12fps左右。
glClear(GL_COLOR_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D, textureConverted);
//this is slow
glTexImage2D(GL_TEXTURE_2D, /* target */
0, /* level */
GL_RGBA, /* internal format */
textureWidth, /* width */
textureHeight, /* height */
0, /* border */
GL_RGBA, /* format */
GL_UNSIGNED_BYTE,/* type */
pFrameConverted->data[0]);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, indices);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
編輯 我改變了我的代碼來初始化一個gltextImage2D只有一次,並與glSubTexImage2D修改它,它並沒有太大的改進,幀率的。
然後我修改了代碼來修改NDK上的本地位圖對象。通過這種方法,我有一個後臺線程運行處理下一幀並在本機側填充位圖對象。我認爲這有潛力,但我需要提高將AVFrame對象從FFmpeg轉換爲本地位圖的速度。下面是目前我正在使用的一種蠻力方法。有什麼方法可以提高速度或優化此轉換嗎?
static void fill_bitmap(AndroidBitmapInfo* info, void *pixels, AVFrame *pFrame)
{
uint8_t *frameLine;
int yy;
for (yy = 0; yy < info->height; yy++) {
uint8_t* line = (uint8_t*)pixels;
frameLine = (uint8_t *)pFrame->data[0] + (yy * pFrame->linesize[0]);
int xx;
for (xx = 0; xx < info->width; xx++) {
int out_offset = xx * 4;
int in_offset = xx * 3;
line[out_offset] = frameLine[in_offset];
line[out_offset+1] = frameLine[in_offset+1];
line[out_offset+2] = frameLine[in_offset+2];
line[out_offset+3] = 0;
}
pixels = (char*)pixels + info->stride;
}
}
UPDATE ::使用圖像上方的fill_bitmap方法是黑白從FFMPEG的幀輸出轉換圖像時我得到更好的幀率,但是,我通過側得到像側的重複。 – broschb 2012-01-19 05:30:48