Как поменять параметры фильтра ?

 
Начать новую тему   Ответить на тему    Список форумов DirectShow форум -> Общий
Предыдущая тема :: Следующая тема  
Автор Сообщение
tvout
Новенький


Зарегистрирован: 02.05.2008
Сообщения: 1

СообщениеДобавлено: Пт Май 02, 2008 11:54 pm    Заголовок сообщения: Как поменять параметры фильтра ? Ответить с цитатой

Уважаемые, подскажите как можно задать параметры фильтра в теле программы ?

Вот на сайте нашёл экзампл для дельфи http://directshow.wonderu.com/Samples/WavToMP3_Sample.zip , проверил, работает, но я хочу задать например битрейт 32 кбит/с для mp3 кодера, как ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AndrеySol
Активный


Зарегистрирован: 27.02.2007
Сообщения: 57

СообщениеДобавлено: Сб Май 10, 2008 1:09 pm    Заголовок сообщения: Ответить с цитатой

Такой вот пример кода, думаю разберетесь. В общем идея такова - получаем список возможных форматов для указанного пина, сохраняем этот список в массиве, отображается диалог выбора нужного формата, затем по индексу из массива применяем выбранный формат для пина.
Код:
   HRESULT hr;
   int retVal = -1; // ошибка
   CFormatSel pFormatSelDlg;
   AUDIO_STREAM_CONFIG_CAPS confCaps = {0};
   IPin* pPinSet = NULL;
   IAMStreamConfig* pStreamConfig = NULL;

   // если пин задан явно - устанавливаем формат для него
   if(pFromThisPin != NULL)
      pPinSet = pFromThisPin;
   else
   {   // иначе, ищем пин в соответсвии с заданным типом
      // Pin enumeration
      IEnumPins* pEnumPins = NULL;
      hr = pBaseFilter->EnumPins(&pEnumPins);
      if(FAILED(hr))
         return -1;

      IPin *pPin = NULL;
      while(pEnumPins->Next(1, &pPin, 0) == S_OK)
      {
         PIN_DIRECTION sDirection;
         pPin->QueryDirection(&sDirection);
         // Output Pin ?
         if(sDirection == PINDIR_OUTPUT)
         {
            pPinSet = pPin;
            break;
         }
         pPin->Release();
      }
      // Free memory
      pEnumPins->Release();
   }

   // подключаем интерфейс установки формата для пина
   hr = pPinSet->QueryInterface(IID_IAMStreamConfig, (void**) &pStreamConfig);
   if(hr == S_OK)
   {
      // получаем список валидных форматов
      if(bIsSelFormat == TRUE)
      {   // обнуляем тип перед выбором нового
         pMediaType = NULL;
         iSelectFormat = -1;

         int nCount = 0, nSize = 0;
         pStreamConfig->GetNumberOfCapabilities(&nCount, &nSize);
         for(int i = 0; i < nCount; i++)
         {
            hr = pStreamConfig->GetStreamCaps(i, &pMediaType, reinterpret_cast<BYTE*>(&confCaps));
            if(hr == S_OK)
            {   // добавляем формат в массив
               pFormatCapabilities[i].m_pMediaType = pMediaType;

               // формируем описание формата
               CString szFormat, szChannel;
               if(pFormatCapabilities[i].NumberOfChannels() < 2)
                  szChannel = "Mono";
               else
                  szChannel = "Stereo";
               szFormat.Format("%s - %s - %d kHz - %d kbps", pFormatCapabilities[i].FormatTag(), szChannel, pFormatCapabilities[i].SamplesPerSecond()/1000, (pFormatCapabilities[i].BytesPerSec()*8)/1000);
               szChannel.Format("%i", i);

               // передаем строку в диалог выбора формата
               pFormatSelDlg.strAddFormat.SetAtGrow(i, szFormat);

               if(sizeof(confCaps) == nSize)
                  pFormatCapabilities[i].m_pConfCaps = confCaps;
            }
         }

         // вызываем диалог выбора формата
         if(pFormatSelDlg.DoModal() == IDOK)
            iSelectFormat = pFormatSelDlg.iSelFormat;
         else
            return 0; // отмена выбора формата
      }
   }

   if(pFormatCapabilities[iSelectFormat].m_pMediaType)
   {
      hr = pStreamConfig->SetFormat(pFormatCapabilities[iSelectFormat].m_pMediaType);
      if(hr == S_OK)
      {
         retVal = 1; // формат установлен

         // очищаем
         FreeMediaType(*m_pMediaType);
      }
      else
      {
         char szError[1024];
         AMGetErrorText(hr, szError, 1024);
         CString szDesc(szError);
         MessageBox(szDesc, "Сообщение интерфейса DirectShow !", MB_OK | MB_ICONERROR);
      }
   }

   pStreamConfig->Release();
   pStreamConfig = NULL;
   pPinSet->Release();
   pPinSet = NULL;

   return retVal;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов DirectShow форум -> Общий Часовой пояс: GMT + 4
Страница 1 из 1
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB


Рейтинг@Mail.ru