FilterGraph.Mode := gmNormal
FilterGraph.Mode := gmDVD
procedure TVdmonitor.PlayDVD(FileName: WideString);
var
Status : TAMDVDRenderStatus;
DvdCmd: IDvdCmd;
HR: HRESULT;
begin
FilterGraph1.ClearGraph;
// --------------------------------------------------------------------------------------
// This is a workaround the problem that we don't always get the EC_CLOCK_CHANGED.
// and because we didn't get the EC_CLOCK_CHANGED the DSTrackbar and DSVideoWindowEx1
// didn't got reassigned and that returned in misfuntions.
FilterGraph1.Active := False;
FilterGraph1.Active := True;
// --------------------------------------------------------------------------------------
// Render DVD
HR := FilterGraph1.RenderDvd(Status, FileName);
if HR <> S_OK then
begin
case HR of
HRESULT(E_INVALIDARG): Application.MessageBox('Недействительный Аргумент.','Ошибка', mb_ok);
HRESULT(S_FALSE) : begin
if Status.hrVPEStatus <> 0 then Application.MessageBox(PChar(GetErrorString(Status.hrVPEStatus)), 'Ошибка', mb_OK);
if Status.bDvdVolInvalid then Application.MessageBox('Указанный том цифрового видеодиска, который будет запущен не существует.', 'Ошибка', mb_OK);
if Status.bDvdVolUnknown then Application.MessageBox('Никакой том цифрового видеодиска не определен или не найден.', 'Ошибка', mb_OK);
if Status.bNoLine21In then Application.MessageBox('Видео декодер не производит линию 21 (закрытый заголовок) данные.', 'Ошибка', mb_OK);
if Status.bNoLine21Out then Application.MessageBox('Видео декодер нельзя показать как закрытый заголовок на видео из-за проблемы со строительством графа.', 'Ошибка', mb_OK);
if status.iNumStreamsFailed > 0 then Application.MessageBox('Не может создать один или более потоков.', 'Ошибка', mb_OK);
end;
HRESULT(VFW_E_DVD_DECNOTENOUGH) : Application.MessageBox('Нет достаточно многих аппаратных средств ЭВМ или декодеров программного обеспечения, чтобы расшифровать все потоки.', 'Ошибка', mb_OK);
HRESULT(VFW_E_DVD_RENDERFAIL) : Application.MessageBox('Некоторая основная ошибка произошла в построении графа. '#13'Возможностей включают DVD фильтр Навигатора или видео или аудио renderer не установлены, '#13'тривиальная связь или скрепляют неудачу перечисления, или ни одно из предоставления потоков.', 'Ошибка', mb_OK);
end;
FilterGraph1.ClearGraph;
exit;
end;
FilterGraph1.Play;
with FilterGraph1 as IDVDControl2 do
begin
SetOption(DVD_NotifyParentalLevelChange, false); //not notify us when parental level changes не уведомляют нас, когда родительский уровень изменяется
SetOption(DVD_HMSF_TimeCodeEvents, true); // use new HMSF timecode format используйте новый HMSF timecode формат
end;
FilterGraph1.Play;
with FilterGraph1 as IDvdControl2 do PlayForwards(1.0, DVD_CMD_FLAG_None, DvdCmd);
end;
const
DVD_Navigator = 'DVD Navigator';
CLSID_DVD_Navigator: TGUID = '{9B8C4620-2C1A-11D0-8493-00A02438AD48}';
var
Filter: IBaseFilter;
CoCreateInstance(CLSID_DVD_Navigator, nil, CLSCTX_INPROC, IID_IBaseFilter, Filter);
(FilterGraph as IGraphBuilder).AddFilter(Filter, 'DVD Navigator');
function FilterGetPin(pFilter: IBaseFilter; pPinDir: TPinDirection; iNum: integer;
var outPin: IPin): HRESULT;
var
pEnum: IEnumPins;
HR: HRESULT;
cFetched: cardinal;
pPin: IPin;
PinDir: TPinDirection;
begin
if not Assigned(pFilter) then
begin
Result := E_POINTER;
Exit;
end;
HR := pFilter.EnumPins(pEnum);
if FAILED(HR) then
begin
Result := HR;
Exit;
end;
HR := E_FAIL;
while pEnum.Next(1, pPin, @cFetched) = S_OK do
begin
pPin.QueryDirection(PinDir);
if PinDir = pPinDir then
begin
if iNum = 0 then
begin
outPin := pPin;
HR := S_OK;
Break;
end;
Dec(iNum);
end;
pPin := nil;
end;
pEnum := nil;
Result := HR;
end;
FilterGetPin(DVD_Source, PINDIR_OUTPUT, 0, OutPin);
(FilterGraph as IGraphBuilder).Render(OutPin);
FilterGetPin(DVD_Source, PINDIR_OUTPUT, 1, OutPin);
(FilterGraph as IGraphBuilder).Render(OutPin);
FilterGetPin(DVD_Source, PINDIR_OUTPUT, 2, OutPin);
(FilterGraph as IGraphBuilder).Render(OutPin);
VideoWindow.GraphFilter
= FilterGraph
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.