11
février
2010
Obtenir une preview d’une video, un thumbnail quoi!!
février
2010
Un article de Sotoaleono
Pas de commentaires
Simple :
long Get_Thumbnail(long Object)
{
Debug("Get_Thumbnail","Début de la fonction Get_Thumbnail");
HRESULT hr;
CoInitialize (NULL);
SmartPtr < IMediaDet > pDet;
hr = CoCreateInstance( CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER, IID_IMediaDet, (void**) &pDet );
if (FAILED(hr))return FALSE;
BSTR Origin_File = SysAllocString(Convert_to_LPC(Odyssea_Media[Object].FileName));
hr = pDet->put_Filename(Origin_File);
if (FAILED(hr)) return FALSE;
double StreamLength;
pDet->get_StreamLength(&StreamLength);
long lStreams;
hr = pDet->get_OutputStreams(&lStreams);
if (FAILED(hr))return FALSE;
bool bFound = false;
for (int i=0; i<lStreams; i++)
{
GUID major_type;
hr = pDet->put_CurrentStream(i);
if (SUCCEEDED(hr))
hr = pDet->get_StreamType(&major_type);
if (FAILED(hr))
break;
if (major_type == MEDIATYPE_Video)
{
bFound = true;
break;
}
}
if (!bFound)
return VFW_E_INVALIDMEDIATYPE;
long width = 0, height = 0;
AM_MEDIA_TYPE mt;
hr = pDet->get_StreamMediaType(&mt);
if (SUCCEEDED(hr))
{
if ((mt.formattype == FORMAT_VideoInfo) &&
(mt.cbFormat >= sizeof(VIDEOINFOHEADER)))
{
VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat);
width = pVih->bmiHeader.biWidth;
height = pVih->bmiHeader.biHeight;
}
else
hr = VFW_E_INVALIDMEDIATYPE;
}
if (FAILED(hr))return FALSE;
BSTR Texture_File = SysAllocString(Convert_to_LPC(Odyssea_Media[Object].TexF));
hr = pDet->WriteBitmapBits((double)(StreamLength/2), width, height, Texture_File);
hr=D3DXCreateTextureFromFileEx(g_pd3dDevice,Convert_to_LPC(Odyssea_Media[Object].TexF),D3DX_DEFAULT_NONPOW2,D3DX_DEFAULT_NONPOW2, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL,&Temporary_Texture);
D3DXSaveTextureToFileA(Odyssea_Media[Object].TexF, D3DXIFF_JPG,Temporary_Texture,NULL);
if (FAILED(hr)) return FALSE;
Debug("Get_Thumbnail","Fin de la fonction Get_Thumbnail");
return S_OK;
}
{
Debug("Get_Thumbnail","Début de la fonction Get_Thumbnail");
HRESULT hr;
CoInitialize (NULL);
SmartPtr < IMediaDet > pDet;
hr = CoCreateInstance( CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER, IID_IMediaDet, (void**) &pDet );
if (FAILED(hr))return FALSE;
BSTR Origin_File = SysAllocString(Convert_to_LPC(Odyssea_Media[Object].FileName));
hr = pDet->put_Filename(Origin_File);
if (FAILED(hr)) return FALSE;
double StreamLength;
pDet->get_StreamLength(&StreamLength);
long lStreams;
hr = pDet->get_OutputStreams(&lStreams);
if (FAILED(hr))return FALSE;
bool bFound = false;
for (int i=0; i<lStreams; i++)
{
GUID major_type;
hr = pDet->put_CurrentStream(i);
if (SUCCEEDED(hr))
hr = pDet->get_StreamType(&major_type);
if (FAILED(hr))
break;
if (major_type == MEDIATYPE_Video)
{
bFound = true;
break;
}
}
if (!bFound)
return VFW_E_INVALIDMEDIATYPE;
long width = 0, height = 0;
AM_MEDIA_TYPE mt;
hr = pDet->get_StreamMediaType(&mt);
if (SUCCEEDED(hr))
{
if ((mt.formattype == FORMAT_VideoInfo) &&
(mt.cbFormat >= sizeof(VIDEOINFOHEADER)))
{
VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat);
width = pVih->bmiHeader.biWidth;
height = pVih->bmiHeader.biHeight;
}
else
hr = VFW_E_INVALIDMEDIATYPE;
}
if (FAILED(hr))return FALSE;
BSTR Texture_File = SysAllocString(Convert_to_LPC(Odyssea_Media[Object].TexF));
hr = pDet->WriteBitmapBits((double)(StreamLength/2), width, height, Texture_File);
hr=D3DXCreateTextureFromFileEx(g_pd3dDevice,Convert_to_LPC(Odyssea_Media[Object].TexF),D3DX_DEFAULT_NONPOW2,D3DX_DEFAULT_NONPOW2, 1, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL,&Temporary_Texture);
D3DXSaveTextureToFileA(Odyssea_Media[Object].TexF, D3DXIFF_JPG,Temporary_Texture,NULL);
if (FAILED(hr)) return FALSE;
Debug("Get_Thumbnail","Fin de la fonction Get_Thumbnail");
return S_OK;
}
Tout simplement…