Retrieving Media File Information for C++

This simple C++ example for using the ltmmMediaInfo object retrieves the source file properties and displays them in message boxes.

#define MAKE_MEDIA_PATH(pFileName) (TEXT("C:\\LEADTOOLS 17.5\\Media\\")TEXT(pFileName))


#include "ltmm.h"
#include <atlbase.h>
#include <atlconv.h>

void AddStringToMsg(char *pszTitle, BSTR sString, char *pszMsg);
void AddNumberToMsg(char *pszTitle, double dNumber, char *pszMsg, BOOL bFloat);

int main()
{
   IltmmMediaInfo *pMediaInfo;
   BSTR sString;
   char szMsg[8196];
   long lStreams, lIndex, l;
   double d;
   USES_CONVERSION;

   CoInitialize(NULL);

   // create an ltmmMediaInfo object: 
   HRESULT hr = CoCreateInstance(CLSID_ltmmMediaInfo, NULL, CLSCTX_INPROC_SERVER, IID_IltmmMediaInfo, (void**)&pMediaInfo);

   if (FAILED(hr))
      return FALSE;

   memset(szMsg, 0, 8196);

   // set the source file: 
   sString = SysAllocString(MAKE_MEDIA_PATH("Test.avi"));
   pMediaInfo->put_SourceFile(sString);
   SysFreeString(sString);

   // general properties: 
   pMediaInfo->get_SourceFile(&sString);
   AddStringToMsg("Source file: ", sString, szMsg);
   SysFreeString(sString);

   pMediaInfo->get_SourceFileSize(&d);
   AddNumberToMsg("File size: ", d, szMsg, FALSE);

   pMediaInfo->get_OutputStreams(&lStreams);
   AddNumberToMsg("Number of streams: ", (double)lStreams,  szMsg, FALSE);

   pMediaInfo->get_SourceDuration(&d);
   AddNumberToMsg("File duration: ", d, szMsg, TRUE);

   pMediaInfo->get_SourceBitRate(&l);
   AddNumberToMsg("Source BitRate : ", (double)l, szMsg, FALSE);

   pMediaInfo->get_SourceFormat(&l);
   AddNumberToMsg("Source format: ", (double)l, szMsg, FALSE);

   pMediaInfo->get_SourceFormatName(&sString);
   AddStringToMsg("Source format name: ", sString, szMsg);
   SysFreeString(sString);

   pMediaInfo->get_SourceFilterClassID(&sString);
   AddStringToMsg("Source filter CLSID: ", sString, szMsg);
   SysFreeString(sString);

   pMediaInfo->get_SourceFilterName(&sString);
   AddStringToMsg("Source filter name: ", sString, szMsg);
   SysFreeString(sString);

   pMediaInfo->get_Title(&sString);
   AddStringToMsg("Title: ", sString, szMsg);
   SysFreeString(sString);

   pMediaInfo->get_Author(&sString);
   AddStringToMsg("Author: ", sString, szMsg);
   SysFreeString(sString);

   pMediaInfo->get_Description(&sString);
   AddStringToMsg("Description: ", sString, szMsg);
   SysFreeString(sString);

   pMediaInfo->get_Rating(&sString);
   AddStringToMsg("Rating: ", sString, szMsg);
   SysFreeString(sString);

   pMediaInfo->get_Copyright(&sString);
   AddStringToMsg("Copyright: ", sString, szMsg);
   SysFreeString(sString);

   MessageBox(NULL, A2BSTR(szMsg), TEXT("MediaInfo Sample: General..."), MB_OK);

   // stream properties: 
   for (lIndex=0; lIndex<lStreams; lIndex++)
   {
      memset(szMsg, 0, 8196);

      pMediaInfo->put_CurrentStream(lIndex);

      pMediaInfo->get_CurrentStream(&l);
      AddNumberToMsg("Stream number: ", (double)l, szMsg, FALSE);

      pMediaInfo->get_StreamType(&sString);
      AddStringToMsg("Stream type: ", sString, szMsg);
      SysFreeString(sString);

      pMediaInfo->get_StreamTypeName(&sString);
      AddStringToMsg("Stream type name: ", sString, szMsg);
      SysFreeString(sString);

      pMediaInfo->get_StreamSubtype(&sString);
      AddStringToMsg("Stream subtype: ", sString, szMsg);
      SysFreeString(sString);

      pMediaInfo->get_StreamSubtypeName(&sString);
      AddStringToMsg("Stream subtype name: ", sString, szMsg);
      SysFreeString(sString);

      pMediaInfo->get_StreamDuration(&d);
      AddNumberToMsg("Stream duration: ", d, szMsg, TRUE);

      // video specific 
      strcat(szMsg, "\n");
      strcat(szMsg, "\t*** Video specific properties ***\n");

      pMediaInfo->get_VideoFrameRate(&d);
      AddNumberToMsg("Video frame rate: ", d, szMsg, TRUE);

      pMediaInfo->get_VideoWidth(&l);
      AddNumberToMsg("Video width: ", (double)l, szMsg, FALSE);

      pMediaInfo->get_VideoHeight(&l);
      AddNumberToMsg("Video height: ", (double)l, szMsg, FALSE);

      pMediaInfo->get_VideoBitCount(&l);
      AddNumberToMsg("Video bit count: ", (double)l, szMsg, FALSE);

      pMediaInfo->get_VideoCompression(&l);
      AddNumberToMsg("Video compression: ", (double)l, szMsg, FALSE);

      pMediaInfo->get_VideoBitRate(&l);
      AddNumberToMsg("Video bit rate: ", (double)l, szMsg, FALSE);

      pMediaInfo->get_VideoFrames(&l);
      AddNumberToMsg("Video frames count: ", (double)l, szMsg, FALSE);

      // Audio specific 
      strcat(szMsg, "\n");
      strcat(szMsg, "\t*** Audio specific properties ***\n");

      pMediaInfo->get_AudioFormatTag(&l);
      AddNumberToMsg("Audio format tag: ", (double)l, szMsg, FALSE);

      pMediaInfo->get_AudioChannels(&l);
      AddNumberToMsg("Audio channels: ", (double)l, szMsg, FALSE);

      pMediaInfo->get_AudioSamplesPerSec(&l);
      AddNumberToMsg("Audio frequency: ", (double)l, szMsg, FALSE);

      pMediaInfo->get_AudioBitsPerSample(&l);
      AddNumberToMsg("Audio sample size: ", (double)l, szMsg, FALSE);

      pMediaInfo->get_AudioAvgBytesPerSec(&l);
      AddNumberToMsg("Audio average bytes per second: ", (double)l, szMsg, FALSE);

      MessageBox(NULL, A2BSTR(szMsg), TEXT("MediaInfo Sample: Streams..."), MB_OK);
   }

   pMediaInfo->ResetSource();
   pMediaInfo->Release();

   CoUninitialize();
                
 return 0;
}

void AddStringToMsg(char *pszTitle, BSTR sString, char *pszMsg)
{
   USES_CONVERSION;

   strcat(pszMsg, pszTitle);
   if (sString)
      strcat(pszMsg, W2A(sString));
   else
      strcat(pszMsg, "NA");
   strcat(pszMsg, " \n");
}

void AddNumberToMsg(char *pszTitle, double dNumber, char *pszMsg, BOOL 
 bFloat)
{
   char szNumber[64];

   if (bFloat)
      sprintf(szNumber, "%f", dNumber);
   else
      sprintf(szNumber, "%.f", dNumber);

   strcat(pszMsg, pszTitle);
   strcat(pszMsg, szNumber);
   strcat(pszMsg, " \n");
}