Avatar billede fruut Nybegynder
01. marts 2006 - 20:16 Der er 16 kommentarer

fil information (avi video)

Hej,

Jeg søger en guide eller kort forklaring af hvilke handles der skal bruges til følgende:

Jeg ønsker at lave et program som basalt set får informationer om en .avi fil såsom længde, fps, og den slags information man finder ved at højreklikke på en avi fil -> summary

Noget generelt for C++ foretrækkes, men ellers MS Visual C++/Borland C++

På forhånd mange tak :)
Avatar billede fruut Nybegynder
01. marts 2006 - 20:59 #2
tak for din henvisning
Avatar billede bertelbrander Novice
01. marts 2006 - 21:03 #3
Borland og MS Visual Studio 6.0 og "platform sdk" har aviriff.h hvor strukturene er beskrevet.
mingw og digital mars har den ikke.
Jeg kan godt forsøge at lave et eksempel senere.
Avatar billede fruut Nybegynder
01. marts 2006 - 21:20 #4
Hvis du har tid ville jeg sætte stor pris på det - kun hvis du har tid.

Tak :)
Avatar billede bertelbrander Novice
01. marts 2006 - 23:16 #5
Jeg fik strikket noget sammen som burde kunne bruges som en start, og til at se hvordan man gør. Jeg har kompileret det men BorlandC++

#include <windows.h>
#include <aviriff.h>
#include <iostream>
#include <fstream>

int main(int argc, char *argv[])
{
  if(argc != 2)
  {
      std::cout << "Com On! give me the name of some file!" << std::endl;
      return 1;
  }
  std::ifstream File(argv[1]);
  if(!File)
  {
      std::cout << "I told you to give me the name of a openable file!" << std::endl;
      return 2;
  }

  RIFFLIST RiffList;
  File.read((char *)&RiffList, sizeof(RiffList));

  if(memcmp((char *)&RiffList.fcc, "RIFF", 4) || memcmp((char *)&RiffList.fccListType, "AVI ", 4))
  {
      std::cout << "Please let me have a valid avi file!" << std::endl;
      return 3;
  }
  std::cout << "FileSize: " << RiffList.cb << " bytes" << std::endl;
  if(memcmp((char *)&RiffList.fccListType, "AVI ", 4))
  {
      std::cout << "It does not seem to be a AVI file" << std::endl;
      return 4;
  }
  DWORD Temp;
  char Fcc[4];
  File.read(Fcc, 4);  // LIST
  File.read((char *)&Temp, sizeof(DWORD));
  std::cout << "HeaderSize: " << Temp << std::endl;
  File.read(Fcc, 4); // hdrl

  AVIMAINHEADER AviMainHeader;

  File.read((char *)&AviMainHeader, sizeof(AviMainHeader));

  if(memcmp((char *)&AviMainHeader.fcc, "avih", 4))
  {
      std::cout << "Ups, not a header" << std::endl;
      return 4;
  }
  std::cout << "Width: " << AviMainHeader.dwWidth << ", Height: " << AviMainHeader.dwHeight << std::endl;

  File.read(Fcc, 4);  // LIST
  if(memcmp(Fcc, "LIST", 4))
  {
      std::cout << "Not list" << std::endl;
      return 5;
  }
  File.read((char *)&Temp, sizeof(DWORD));
  std::cout << "HeaderSize: " << Temp << std::endl;
  File.read(Fcc, 4);  // strl
  if(memcmp(Fcc, "strl", 4))
  {
      std::cout << "Not strl" << std::endl;
      return 5;
  }
  AVISTREAMHEADER AviStreamHeader;
  File.read((char *)&AviStreamHeader, sizeof(AviStreamHeader));

  std::cout << int(AviStreamHeader.dwRate/AviStreamHeader.dwScale) << " Frames/Sec" << std::endl;
  std::cout << "Hit Enter to exit" << std::endl;
  std::cin.get();
}
Avatar billede fruut Nybegynder
02. marts 2006 - 21:45 #6
Tak for dit fremragende eksempel på anvendelse.
Avatar billede fruut Nybegynder
03. marts 2006 - 23:34 #7
Håber du har tid til at forjlare mig noget... Jeg hentede Borland C++ compiler fra Borlands hjemmeside, men får en del fejl hvis jeg forsøger at compilere din kode :(

Jeg kan følge dig i den kode du skriver, men det er compileren ikke enig i, f.eks.:
Error E2090 C:\Documents and Settings\<**>\Skrivebord\main.cpp 28: Qualifier
'std' is not a class or namespace name in function main(int,char * *)
Error E2379 C:\Documents and Settings\<**>\Skrivebord\main.cpp 28: Statement
missing ; in function main(int,char * *)

Eller har jeg overset noget?
Avatar billede bertelbrander Novice
03. marts 2006 - 23:46 #8
Er det kommandolinie versionen af BorlandC++?
Hvad er de første warning du får fra compileren?
Avatar billede fruut Nybegynder
04. marts 2006 - 00:17 #9
Ja, kommandolinie versionen.

Det mærkelige er at det først er at de inkluderede filer ikke blev åbnet, og da jeg rettede det ved at sige stien dertil og erstatte > og < med " hele vejen igennem så endte jeg med en fejlfri compilation, men intet output (eller .exe for den sags skyld)
Avatar billede bertelbrander Novice
04. marts 2006 - 00:22 #10
Har du lavet en bcc32.cfg i samme mappe som bcc32.exe?

Den skal se ca. sådan ud:
-I"C:\Program\Bcc55\include"
-L"C:\Program\Bcc55\lib"
-L"C:\Program\Bcc55\lib\psdk"

Lav også en ilink32.cfg i samme mappe, der skal se ca. sådan ud:
-L"C:\Program\Bcc55\lib;C:\program\bcc55\lib\psdk"

Der er en guide til opsætning af BorlandC++ her:
http://community.borland.com/article/0,1410,21205,00.html

Skriver den slet ikke noget når du compilerer?
Hvordan ser kommandoen du compilerer med ud?
Avatar billede fruut Nybegynder
04. marts 2006 - 00:27 #11
Ah ja, nu kørte den straks bedre, men den brokker sig over at den ikke kan starte ilink.

C:\Documents and Settings\<*>>C:\Borland\BCC55\Bin\bcc32.exe "C:\Docu
ments and Settings\Casper Jebjerg\Desktop\main.cpp"
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
C:\Documents and Settings\<*>\Desktop\main.cpp:
Error E2133: Unable to execute command 'ilink32.exe'

Jeg må ærligt indrømme at jeg ikke har beskæftiget mig med Borlands C++ compiler før, så jeg undskylder for mine dumme fejl
Avatar billede bertelbrander Novice
04. marts 2006 - 01:08 #12
Har du puttet mappen med bcc32.exe og ilink32.exe i windows PATH?

Du kan gøre det midlertidigt for den kommandoprompt du har åben ved at køre kommandoen:
path=C:\Borland\BCC55\Bin;%Path%

Så bør du kunne køre kompileren ved blot at skrive:
bcc32 "C:\Documents and Settings\Casper Jebjerg\Desktop\main.cpp"

Du kan også sætte path permanent: Tryk <Windows Tast>+<Pause> -> Vælg Avanceret i boksen der dukker op, og tryk på "miljøvariable". Dette vil ikke virke for de kommandoprompter du har åben, kun for nye.
Avatar billede fruut Nybegynder
04. marts 2006 - 02:36 #13
Så fungerede det :) Endnu engang tusind tak for hjælpen
Avatar billede fruut Nybegynder
06. marts 2006 - 17:34 #14
Bertelbrander kan du hjælpe mig igen?

Jeg har gennemsøgt aviriff.h og msdn for at finde variablen der indeholder "bitrate" for avi filen. windows explorer kan vise hvad lyd-bitraten er (højreklik->summary), men det ser ikke ud til at det DWORD er med i riff'en?

Hvis det ikke er muligt, er det så muligt at bestemme størrelsen af lyden/størrelsen af videoen på anden vis?

På forhånd tak
07. marts 2006 - 07:19 #15
<bertelbrander>: Du har tidl. været 'kreativ' for mig - ka' du gi' et input til http://www.eksperten.dk/spm/692962 ?
(Sorry for SPAM)
Avatar billede bertelbrander Novice
13. marts 2006 - 15:28 #16
Det er ikke helt simpelt. Avi filer kan være encodet på mange måder og nogle har variabel bitrate.
For nogle .avi filer vil jeg tror at du kan læse bitrate i "AviMainHeader.dwMaxBytesPerSec" (du skal måske gange med 8), men for andre .avi'er er denne 0.
Du kender antallet af rammer (dwTotalFrames), rammer pr. sekund (AviStreamHeader.dwRate/AviStreamHeader.dwScale) og størrelsen på filen (du skal nok trække 2k fra, da de første 2048 bytes vist er header), og så burde du kunne udregne den gennemsnitlige bitrate.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester