緣由: google 在ICS 上graphicbuffer管理機制作了改動, 可是gralloc.xxx.so目前又不支持HAL_PIXEL_FORMAT_YV12。因此,解決辦法是:註釋掉SoftwareRenderer.cpp,65行,case OMX_COLOR_FormatYUV420Planar: 播放就有視頻出來了。 框架
2. ide
作過Stagefright框架支持庫開發的都知道,Android專門爲數據傳遞封裝了一個類:MediaBuffer,源碼路徑爲: 工具
1)、頭文件:frameworks/base/include/media/stagefright/MediaBuffer.h google
2)、實現源碼:frameworks/base/media/libstagefright/MediaBuffer.cpp spa
該類專用於管理數據緩衝區,是Stagefright各組建間進行數據傳遞的交通工具。以解碼爲例,Extractor將讀取到的Audio和Video數據分別放入不一樣的MediaBuffer中,一個傳入Video decoder進行視頻解碼,一個傳入Audio decoder進行音頻解碼;Video Decoder將解碼後的數據放入一個新的視頻MediaBuffer中,傳遞給Render去顯示,Audio decoder將解碼後的數據也放入一個新的音頻MediaBuffer中送到Render去放音。固然,在傳遞前還有不少附加的信息須要設置傳遞,這裏不作說明。 code
下面就本人在使用MediaBuffer對其的理解是使用重點作詳細說明。MediaBuffer對緩衝區的內部實現進行了很好的封裝,使用者根本不須要關內心面的實現細節,並且全部咱們對緩衝區關心的問題,該類都已經提供了接口。 orm
常見數據區操做: MediaBuffer mBuffer;
視頻
1)、獲取數據緩衝區首地址:mBuffer->data( ); 接口
2)、獲取數據緩衝區的大小:mBuffer->size( ); 開發
3)、獲取緩衝區中有效數據區相對數據緩衝區起始地址的偏移:mBuffer->range_offset( );
4)、設置緩衝區中有效數據區的偏移和長度:mBuffer->set_range(size_t offset, size_t length);
5)、獲取有效數據區的長度:mBuffer->range_length( );
6)、獲取有效數據區的起始地址(偏移):mBuffer->data( ) + mBuffer->range_offset( );
易犯的錯誤:
1)、誤用數據緩衝區首地址代替有效數據區首地址。即用mBuffer->data( )代替mBuffer->data( ) + mBuffer->range_offset( ),這樣獲得的是數據緩衝區的起始地址,而不必定時有效數據區的起始地址;實際使用中,有效數據區一般是數據緩衝區的一個有效子集而已。
2)、誤用數據緩衝區的大小代替有效數據區的大小。即用mBuffer->size( )代替mBuffer->range_length( )