avi per mci





  • 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 Dank

    Gruss

    Hobbycomp


Anmelden zum Antworten