Sådan programmeres videodimensioner i Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at tilføje en funktion til et program, jeg skriver for at bestemme bredden og højden af ​​en videofil (som kan vælges med en browsing .. -knap). Jeg bruger Python og Qt, og jeg har kigget over og kan ikke synes at finde nogen hjælp herom. Videoformatet er i øjeblikket .flv, men vil blive udvidet i fremtiden for at inkludere andre formater som H.264.


Windows Explorer kan fortælle mig videodimensionerne, hvis jeg højreklikker på filen og vælger egenskaber, vælg derefter oversigtsfanebladet og klik på avanceret. Bredden og højden der vises der er præcis, hvad jeg har brug for.


Nogle ideer?


Tak


Marlon

Bedste reference


Windows Stifinder læser filhovedet for denne info.


Jeg ser 3 muligheder:



  • Du kan analysere overskriften manuelt på udkig efter metadataoplysninger (åh gud, vær venlig at ikke)

  • Brug et cmd-linieværktøj og parser det s output (check popen () for at vide, hvordan du gør det)

  • Brug et tredjepartsbibliotek til at hente de relevante oplysninger fra videofilen



Jeg antager, at du vil gøre, hvad der er nemmere. Jeg tror, ​​at at skrive en wrapper omkring et cmd-line værktøj som mediainfo til at vise information om videofiler og derefter parsere det s output til at fange videoegenskaberne ville være lettere. Hvis du allerede har ffmpeg installeret på dit system, kunne du gå med det også. [2] [3] [4]


En anden måde at gøre det på er at bruge 3rd party biblioteker som libavformat (som er en del af ffmpeg) til at læse videoegenskaberne. For en komplet demo kig på tutorial01.c: [5]


  // Register all formats and codecs
  av\_register\_all();

  // Open video file
  if(av\_open\_input\_file(&pFormatCtx, argv[1], NULL, 0, NULL)!=0)
    return -1; // Couldn't open file

  // Retrieve stream information
  if(av\_find\_stream\_info(pFormatCtx)<0)
    return -1; // Couldn't find stream information

  // Find the first video stream
  videoStream=-1;
  for(i=0; i<pFormatCtx->nb\_streams; i++)
    if(pFormatCtx->streams[i]->codec->codec\_type==CODEC\_TYPE\_VIDEO) {
      videoStream=i;
      break;
    }
  if(videoStream==-1)
    return -1; // Didn't find a video stream

  // Get a pointer to the codec context for the video stream
  pCodecCtx=pFormatCtx->streams[videoStream]->codec;

  // The relevant structure here is: pCodecCtx
  // More precisely: pCodecCtx->width and pCodecCtx->height