Re: 能夠顯示YUV / RGB格式影像的code...
※ 引述《ithinkurdumb (Yankees Rule All)》之銘言:
: 我找了DirectX 9的SDK和MSDN Library,
: 但是沒有找到相關的資料.
: 因為我對這些是初次接觸,
: 能夠麻煩你說的詳細一些嗎?
: 謝謝...:)
: ※ 引述《catyun ()》之銘言:
: : 你有連續播放的需求嗎
: : 若要連續播放請用directx
: : 用gdi來畫的話fps會很低
: : directdraw的surface可以吃YUV的資料的樣子
: : 我之前是用Overlay..直接餵YUV資料進去就會顯示出來了
你還沒說你有沒有要連續播放啊
若你只是要抓frame出來就不用directx了...粉麻煩
我這裡有以前寫的sample code...可以參考看看
主要是先把4:2:0轉回4:4:4
再用線性轉換公式把YUV轉回RGB
clip()是用來保證轉出來的pixel值在0~255間
//把4:2:0變到4:4:4
kdu_byte *buf = decompressor.get_frame();
kdu_byte *Uptr=buf+myDim.x*myDim.y;
kdu_byte *Vptr=buf+(myDim.x*myDim.y*5/4);
for(int j=0;j<myDim.y;j=j+2)
for(int i=0;i<myDim.x;i=i+2)
{
U[myDim.x*j+i]=*Uptr;
U[myDim.x*j+i+1]=*Uptr;
U[myDim.x*(j+1)+i]=*Uptr;
U[myDim.x*(j+1)+i+1]=*Uptr;
Uptr++;
V[myDim.x*j+i]=*Vptr;
V[myDim.x*j+i+1]=*Vptr;
V[myDim.x*(j+1)+i]=*Vptr;
V[myDim.x*(j+1)+i+1]=*Vptr;
Vptr++;
}
//轉換回RGB並顯示在螢幕上(BCB)
mybitmap->Width=myDim.x;
mybitmap->Height=myDim.y;
mybitmap->PixelFormat=pf24bit;
float R,G,B;
for (int y=0; y < myDim.y;y++)
{
Byte *ptr=(byte *)mybitmap->ScanLine[y];
for (int x=0; x < myDim.x;x++)
{
//clock_t t_time=clock();
R=clip(buf[x+y*myDim.x]+2.032*(V[x+y*myDim.x]-128));
G=clip(buf[x+y*myDim.x]-0.395*(U[x+y*myDim.x]-128)-0.581*(V[x+y*my
Dim.x]-128));
B=clip(buf[x+y*myDim.x]+1.140*(U[x+y*myDim.x]-128));
//file_time += ((double)(clock()-t_time)) / CLOCKS_PER_SEC;
ptr[x*3]=B;
ptr[x*3+1]=G;
ptr[x*3+2]=R;
}
}
directx比較困難,我之前是用directdraw建立surface,fourcc指定為YV12
然後把YUV的資料直接搬到surface的記憶體中,就顯示在螢幕上了
連續frame播放也很快,用上面這種GDI的方法的話
fps大概十張上下吧(P4-2.8G)
用directx的話,視你decoder而定,到上百張也都可能
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.166.171.177
討論串 (同標題文章)
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章