| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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 Сообщения: 54
|
Добавлено: Сб Май 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; |
|
|
| Вернуться к началу |
|
 |
|
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|
|
|