Консультация № 144600
21.09.2008, 20:33
0.00 руб.
0 8 0
Здравствуйте господа эксперты. Продолжаю изучать DSPack, воспроизведение DVD. Выяснил один факт, который мне ну ни как не подходит. Компонент VideоWindow, при воспроизведение с параметром mode:= vmNormal, воспроизведение идёт как положено в этом окне, а вот при mode:= vmVMR - открывается окно activmovewindow, не могу сообразить, как заставить воспроизводиться в окне компонента.

Обсуждение

Неизвестный
21.09.2008, 20:46
общий
Для этого нужно установить
Код:
 FilterGraph.Mode := gmNormal 
, а не
Код:
 FilterGraph.Mode := gmDVD 
. Так как в случае с
gmDVD создаётся Overlay Mixer , который не работает в VMR режиме .
давно
Профессионал
153662
1070
21.09.2008, 20:56
общий
Но при FilterGraph.Mode := gmNormal нет воспроизведения DVD, выходит ошибка о невозможности воспроизвести файл. Либо мой кодек это не поддерживает (AсeMega), хотя после деинсталляции его, прога воспроизводит DVD без проблем.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
21.09.2008, 21:43
общий
Если вы используете FilterGraph.RenderDvd , то автоматически в цепочку фильтров встраивается Overlay Mixer, который ... (см. выше), тогда для вывода изображения
используется TDSVideoWindowEx2 , если цепочку фильтров вы строите сами, тогда каждый шаг построения вы контролируете сами .
А так как вы не удосужились выложить хотя-бы часть кода, то помочь вам не представляется возможным.
давно
Профессионал
153662
1070
21.09.2008, 21:56
общий
Использование VideoWindowEx2 меня не устраивает по той причине, что при выводе двигающихся объектов на оверлей не удаётся избавиться от мерцаний картинки. Вот процедура запуска видео:

Код:
 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;
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
21.09.2008, 22:43
общий
Вы как раз и используете способ с Overlay Mixer , а для него TVideoWindow в режиме VMR не подходит. Если вы посмотрите все примеры, прилагаемые к пакету DsPack, то вы не найдёте в них использование TVideoWindow в плейере DVD. Для использования VMR
при воспроизведении DVD
, необходимо цепочку фильтров строить самому.

Кратко алгоритм следующий:

1. Добавить в граф фильтр DVD - источника
Код:

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');

2. Затем отрендерить каждый выход этого фильтра (их всего три)
Код:

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);



При этом можно использовать TVideoWindow в режиме VMR.

Важно: Св-во
Код:
 VideoWindow.GraphFilter 
должно установлено
Код:
 = FilterGraph 
до вышеуказанных манипуляций.
давно
Профессионал
153662
1070
21.09.2008, 22:54
общий
Спасибо буду пробовать.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
22.09.2008, 18:14
общий
To Gladiator. Что - то я совсем затупил - не могу собрать Ваши советы в кучу. Не найду где воткнуть рендер файла и т.п.
Вы писали VideoWindow.GraphFilter = FilterGraph, как я понимаю это опечатка, так как нет такого свойства у VideoWindow.
Помогите ещё плиз.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
22.09.2008, 23:03
общий
Точно очепятка: св-во FilterGraph , оно устанавливается перед компиляцией своей программы

А порядок действий я уже описал в алгоритме.
Форма ответа