avi per mci
-
Hallo zusammen,
ich will ein AVI auf dem Bildschirm ausgeben. Grundlage meines Progs ist der Beitrag "avi per mci" aus den FAQs. Das funktioniert soweit auch gut, nur spielt das Video in der linken oberen Ecke des Fensters.
Gibt es eine Möglichkeit, die Ausgabe im Fewnster zu zentrieren ?
Gruß
HobbyComp
-
Lass das AVI doch einfach in einem Child-Window abspielen und positioniere dieses entsprechend
-
Daran hab ich auch schon gedacht, dazu müßte ich jedoch die Bildgröße des AVIs erfragen. Wie komme ich da dran ?
Gruß
HobbyComp
-
-
Hallo, vielen Dank.
Ich hab mal ein kurzes Demo zur Anwendung geschrieben. Weiss jemand eine Möglichkeit, den Namen des Codecs zu bestimmen ?
Gruss
HobbyComp
// AviFileInfoTest.cpp // #pragma comment(lib, "Vfw32.lib") #include <windows.h> #include <vfw.h> #define MAXLENSTR 300 LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, int); char DateiPfad[MAXLENSTR]; // Pfad der darzustellenden Dateien DWORD DateiAnzahl; // Anzahl der darzustellende Dateien char DateiName[MAXLENSTR]; // Dateiname des anzuzeigenden AVIs char astring[MAXLENSTR]; char bstring[MAXLENSTR]; char cstring[MAXLENSTR]; char dstring[MAXLENSTR]; char estring[MAXLENSTR]; HINSTANCE hInstGlobal; LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { char WMPastring[MAXLENSTR]; static HWND hwndList; DWORD i; HDC hdc; PAINTSTRUCT ps; PAVIFILE pfile; AVIFILEINFO pfi; switch (message) { case WM_CREATE: // Startverzeichnis ermitteln GetModuleFileName(NULL,astring,MAXLENSTR); _splitpath(astring, bstring, cstring, dstring, estring); lstrcpy(DateiPfad,bstring); lstrcat(DateiPfad,cstring); SetCurrentDirectory(DateiPfad); // Listbox-Element aufbauen und mit AVI-Dateien füllen hwndList = CreateWindow("listbox",NULL,WS_CHILDWINDOW | LBS_SORT, 0,80,200,20, hwnd, (HMENU) 80, hInstGlobal,NULL); SendMessage(hwndList, LB_DIR, 0x0000, (LPARAM) "*.avi"); // Dateianzahl bestimmen DateiAnzahl = SendMessage(hwndList, LB_GETCOUNT,0,0); wsprintf(astring, "AviInfoTest - Path: %s - Files: %i", DateiPfad,DateiAnzahl); SetWindowText(hwnd,astring); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); if (DateiAnzahl > 0) { TextOut(hdc,10,10,"KB/s",4); TextOut(hdc,60,10,"Compression",5); TextOut(hdc,120,10,"Streams",7); TextOut(hdc,180,10,"BufferSize",10); TextOut(hdc,260,10,"Width",5); TextOut(hdc,310,10,"Height",6); TextOut(hdc,370,10,"Bps",3); TextOut(hdc,410,10,"Length",6); TextOut(hdc,470,10,"Filename",8); TextOut(hdc,570,10,"Filetype",8); for (i=0; i<DateiAnzahl; i++) { SendMessage(hwndList, LB_GETTEXT, i, (LPARAM) DateiName); AVIFileInit(); // opens AVIFile library AVIFileOpen(&pfile, DateiName, OF_SHARE_DENY_WRITE, 0L); AVIFileInfo(pfile,&pfi, (LONG)sizeof(AVIFILEINFO)); AVIFileRelease(pfile); // closes the file AVIFileExit(); // releases AVIFile library wsprintf(WMPastring,"%i",pfi.dwMaxBytesPerSec/1024); TextOut(hdc,10,i*20+50,WMPastring,lstrlen(WMPastring)); if ( pfi.dwCaps == AVIFILECAPS_NOCOMPRESSION ) TextOut(hdc,60,i*20+50,"No",2); else TextOut(hdc,60,i*20+50,"Yes",3); wsprintf(WMPastring,"%i",pfi.dwStreams); TextOut(hdc,120,i*20+50,WMPastring,lstrlen(WMPastring)); wsprintf(WMPastring,"%i",pfi.dwSuggestedBufferSize); TextOut(hdc,180,i*20+50,WMPastring,lstrlen(WMPastring)); wsprintf(WMPastring,"%i",pfi.dwWidth); TextOut(hdc,260,i*20+50,WMPastring,lstrlen(WMPastring)); wsprintf(WMPastring,"%i",pfi.dwHeight); TextOut(hdc,310,i*20+50,WMPastring,lstrlen(WMPastring)); wsprintf(WMPastring,"%i",pfi.dwRate/pfi.dwScale); TextOut(hdc,370,i*20+50,WMPastring,lstrlen(WMPastring)); wsprintf(WMPastring,"%i",pfi.dwLength); TextOut(hdc,410,i*20+50,WMPastring,lstrlen(WMPastring)); TextOut(hdc,470,i*20+50,DateiName,lstrlen(DateiName)); wsprintf(WMPastring,"%s",pfi.szFileType); TextOut(hdc,570,i*20+50,WMPastring,lstrlen(WMPastring)); } } else { wsprintf(WMPastring,"Keine AVI-Dateien im Pfad \"%s\" gefunden.",DateiPfad); TextOut(hdc, 10,10,WMPastring,lstrlen(WMPastring)); } EndPaint(hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, message, wParam, lParam); } } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { HWND hwnd; MSG msg; WNDCLASS wndclass; hInstGlobal = hInstance; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wndclass.lpszMenuName = 0; wndclass.lpszClassName = "WinProg"; RegisterClass(&wndclass); hwnd = CreateWindow("WinProg", "AviInfoTest", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, SW_SHOWMAXIMIZED); UpdateWindow(hwnd); while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (msg.wParam); }
[EDIT] bitte das nächste mal code-tags verwenden, thx - CMatt[/EDIT]
-
AVIStreamInfo
-
CMatt schrieb:
AVIStreamInfo
Und wo da?
-
WebFritzi schrieb:
Und wo da?
2. Parameter = AVISTREAMINFO
typedef struct {
...
DWORD fccHandler;
...
} AVISTREAMINFO;fccHandle
Four-character code of the compressor handler...
-
Hallo,
Thema "Namen des Codecs" ist noch unklar.
Folgende Vorgehensweise stelle ich mir vor:
Nach einem AVIFileOpen kommt ein AVIFileGetStream. Mit dem hier gewonnenen HANDLE AVIInfoStream bedienen. Anschließend mit fccType und fccHandler ICInfo aufrufen und aus der ICINFO-Struktur unter szName oder szDescripion den Klartext für den CODEC-Namen holen.
Jetzt 2 Fragen:
1. Ist die grundsätzliche Vorgehensweise OK ?
2. Auf was muss ich den vierten Parameter von AVIFileGetStream setzen und warum ?Gruss
HobbyComp
-
1. Ist OK.
2.
Der 4. Paremeter gibt an, welchen stream du nun genau möchtest. In einem avi kannst nur mehrer Sound-, Text- und Videospuren haben. Nehmen wir an du hast einen Film in deutscher und englsicher Sprache, wie kommst du nun an die 2 verschieden stream? Genau. über diesem Paramter 4
kleines beispiel:PAVISTREAM pAudio[MAX_AUDIO_STREAMS],pVideo[MAX_VIDEO_STREAMS]; // deine streams int nNumAudioStreams=0, nNumVideoStreams=0; do { if(AVIFileGetStream(pAviFile, &pAudio[nNumAudioStreams], streamtypeAUDIO, nNumAudioStreams)) break; } while(++nNumAudioStreams < MAX_AUDIO_STREAMS); do { if(AVIFileGetStream(pAviFile, &pVideo[nNumVideoStreams], streamtypeVIDEO, nNumVideoStreams)) break; } while(++nNumVideoStreams < MAX_VIDEO_STREAMS); // sind hast du alle audio und video-stream die in dem avi geöffnet und brauchst sie nur mehr abspielen, je nach Sprachauswahl
-
Hi,
ich hab den Code mal in folgender Form eingebaut:
AVIFileInit(); // opens AVIFile library AVIFileOpen(&pfile, DateiName, OF_SHARE_DENY_WRITE, 0L); AVIFileInfo(pfile,&pfi, (LONG)sizeof(AVIFILEINFO)); if ( pfi.dwCaps != AVIFILECAPS_NOCOMPRESSION ) { // von CMatt aus C/C++Forum::WINAPI Anfang PAVISTREAM pVideo[MAX_VIDEO_STREAMS]; // deine streams int nNumVideoStreams; nNumVideoStreams=0; do { if(AVIFileGetStream(pfile, &pVideo[nNumVideoStreams], streamtypeVIDEO, nNumVideoStreams) == 0) break; } while(++nNumVideoStreams < MAX_VIDEO_STREAMS); // von CMatt aus C/C++Forum::WINAPI Ende AVIStreamInfo(pVideo[nNumVideoStreams], &psi,sizeof(AVISTREAMINFO)); ICInfo(psi.fccType, psi.fccHandler, &icinfo); AVIStreamRelease(pVideo[nNumVideoStreams]); } AVIFileRelease(pfile); // closes the file AVIFileExit(); // releases AVIFile library
Leider liefern icinfo.szName und icinfo.szDescription entweder NULL-Strings oder Unsinn (->Anwendungsschutzverletzung)
Vielleicht habe ich mich auch verheddert, und es gibt ne einfachere Lösung, an den Codecnamen heranzukommen. Kann jemand helfen ?
Gruss
HobbyComp
-
Ihr redet immer von dem Codec. Kann es nicht auch mehrere geben?
Andere Sache:
Wenn man z.B. im alten MediaPlayer (vs 6) einen DivX-Film startet, im Filmfenster die rechte Maustaste bedient, auf "Eigenschaften" klickt und dann in den Reiter "Erweitert" aktiviert, dann sind dort die Filter und Codecs aufgelistet. Komischerweise ist im Codec-Fenster nichts und im Filter-Fenster steht u.a. DivX. Da frage ich mich, was der Unterschied zwischen Filter und Codec ist.
-
@HobbyComp:
hier mal ein beispiel, musst es dann selbst erweitern..bool GetCodecName(DWORD fccType, DWORD fccHandler,char codecname[64]) { ICINFO icinfo; char str[128]; HIC hic; if ((hic=ICOpen(ICTYPE_VIDEO,fccHandler,ICMODE_QUERY))!=NULL) { icinfo.dwSize=sizeof(ICINFO); if (ICGetInfo(hic,&icinfo,sizeof(ICINFO))>0) { WideCharToMultiByte(CP_ACP,0,icinfo.szDescription,-1, str,128,NULL,NULL); lstrcpy(codecname,str); } else { lstrcpy(codecname,"Unbekannter codec"); return false; } ICClose(hic); } else { lstrcpy(codecname,"Unbekannter codec"); return false; } return true; } .... AVISTREAMINFO si; PAVISTREAM pstm; AVIStreamOpenFromFile(&pstm,strFile,streamtypeVIDEO,0,OF_READ | OF_SHARE_DENY_NONE,NULL); AVIStreamInfo(pstm,&si,sizeof(AVISTREAMINFO)); AVIStreamRelease(pstm); char codecname[128]; GetCodecName(ICTYPE_VIDEO,si.fccHandler,codecname); MessageBox(NULL,codecname,"Codec name",MB_OK); return 0;
@WebFritzi:
Jo, ist möglich. Du kannst in nen avi auch mehrere video streams haben (nicht wie in mpeg, da ist nur einer erlaubst). Natürlich ist es dann auch möglich verscheidene codes in den streams zu verwenden.
Zum filter und codec:
Ein Filter im wesentlichen ein decoder. Wenn du von nem divx filter redest, meinst du einen dvix decoder. Redest du vom divx codec ist der compressionsalgorithums gemeint (also encoder & decoder).
-
Eingebaut, funktioniert, und was dazugelernt.
Vielen DankGruss
Hobbycomp