Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2012, 12:32   #1
Alexmpei
Новичок
Джуниор
 
Регистрация: 05.05.2011
Сообщений: 2
По умолчанию Зависает проигрывание DVD (DSPack) обычно при перемотке

проигрывание иногда зависает при перемотке dvd (переход между главами). Для проигрывания ДВД использую следующий код:
Создание:

Код:
mainFilterGraph := TFilterGraph.Create(nil);
mainFilterGraph.Mode := gmDVD;
mainFilterGraph.OnDVDCurrentHMSFTime := FilterGraphDVDCurrentHMSFTime;

DSVideoWindowEx.FilterGraph := mainFilterGraph;

mainFilterGraph.LinearVolume := true;
mainFilterGraph.GraphEdit := true;
mainFilterGraph.Active := false;
mainFilterGraph.AutoCreate := false;
mainFilterGraph.Tag := 0;

dsTrackBar := TDSTrackBar.Create(nil);
dsTrackBar.FilterGraph := mainFilterGraph;
dsTrackBar.TimerInterval := 1000;
dsTrackBar.Frequency := 1;
dsTrackBar.Enabled := false;
dsTrackBar.OnTimer := dsTrackBarTimer;

начало проигрывания (передаю сюда путь к .IFO):
Код:
procedure TDSPlayer.PlayDVD(FileName: WideString);
var
Status : TAMDVDRenderStatus;
DvdCmd: IDvdCmd;
HR: HRESULT;
DVDControl2 : IDVDControl2;
begin
mainFilterGraph.Mode := gmDVD;
// Activate the filter Graph
if not mainFilterGraph.Active then
begin
mainFilterGraph.Active := true;
// Render DVD
HR := mainFilterGraph.RenderDvd(Status, FileName);
if HR <> S_OK then
begin
case HR of
HRESULT(E_INVALIDARG): ;//Application.MessageBox('Invalid Argument.','Error', mb_ok);
HRESULT(S_FALSE) : ;{begin
if Status.hrVPEStatus <> 0 then Application.MessageBox(PChar(GetErrorString(Status.hrVPEStatus)), 'Error', mb_OK);
if Status.bDvdVolInvalid then Application.MessageBox('The specified DVD volume to be played does not exist.', 'Error', mb_OK);
if Status.bDvdVolUnknown then Application.MessageBox('No DVD volume is specified or isn''t found.', 'Error', mb_OK);
if Status.bNoLine21In then Application.MessageBox('The video decoder doesn''t produce line 21 (closed captioning) data.', 'Error', mb_OK);
if Status.bNoLine21Out then Application.MessageBox('The video decoder can''t be shown as closed captioning on video due to a problem with graph building.', 'Error', mb_OK);
if status.iNumStreamsFailed > 0 then Application.MessageBox('Can''t render one or more stream.', 'Error', mb_OK);
end; }
HRESULT(VFW_E_DVD_DECNOTENOUGH) : ;//Application.MessageBox('There isn''t enough hardware or software decoders to decode all streams.','Error', mb_OK);
HRESULT(VFW_E_DVD_RENDERFAIL) : ;//Application.MessageBox('Some basic error occurred in building the graph.'#13'Possibilities include the DVD Navigator filter or the video or audio renderer not instantiating,'#13'a trivial connection or pin enumeration failing, or none of the streams rendering.','Error', mb_OK);
end;
mainFilterGraph.ClearGraph;
exit;
end;
mainFilterGraph.Play;

If Succeeded(mainFilterGraph.QueryInterface(IID_IDVDControl2, DVDControl2)) then
begin
DVDControl2.SetOption(DVD_NotifyParentalLevelChange,false); //not notify us when parental level changes
DVDControl2.SetOption(DVD_HMSF_TimeCodeEvents, true); // use new HMSF timecode format
end;
end
else
begin
mainFilterGraph.Pause;
Sleep(100);
If Succeeded(mainFilterGraph.QueryInterface(IID_IDVDControl2, DVDControl2)) then
DVDControl2.PlayForwards(1.0,DVD_CMD_FLAG_None, DvdCmd);
Sleep(100);
mainFilterGraph.Play;
end;
DVDControl2 := Nil;
end;

переход между главами (Previous/Next):
Код:
var
DvdCmd: IDvdCmd;
DVDControl2 : IDVDControl2;
begin
if mainFilterGraph.Active then
begin
if Succeeded(mainFilterGraph.QueryInterface(IID_IDVDControl2, DVDControl2)) then
begin
DvdControl2.PlayNextChapter(DVD_CMD_FLAG_None, DvdCmd);
end;
end;
DVDControl2 := nil;
end;
end;
для перехода назад DvdControl2.PlayPrevChapter

Иногда при вызове PlayNextChapter/PlayPrevChapter картинка замирает и висит. Если при этом сделать какое-то обращение к
mainFilterGraph или какому-нибудь интерфейсу (DVDControl, Seek, ...) зависнет вообще вся программа, так как после обращения
из вызванной функции графа или интерфейса мы не выйдем. Бывает что отвисает само минуты через 2, бывает что не отвисает.
Пока висит обращений к ДВД нет - вижу по светодиоду на сидироме. Если вытащить ДВД диск из сидирома тоже может отвиснуть, а может нет.
Как с этим справиться???
Alexmpei вне форума Ответить с цитированием
Старый 26.06.2012, 13:24   #2
Alexmpei
Новичок
Джуниор
 
Регистрация: 05.05.2011
Сообщений: 2
По умолчанию

Даже при ускоренном просмотре бывает зависает. Возможно и при простом просмотре - просто нет времени столько смотреть видео. При перемотках часто довольно случается. Сейчас зависло на ускоренном просмотре и обращение к двд было (мигал сдром). Вытащил диск, прошли эвенты GraphPaused
DVDDomainStop
DVDPlaybackStopped
все отвисло и стало работать.
Хоть куда смотреть подскажите? Версия DirectShow, кодеки, что? В программе не вижу проблем, висит на вид где-то в недрах.
Alexmpei вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При компиляции программа зависает utro35 Общие вопросы Delphi 5 20.01.2012 11:24
пк зависает при перезагрузки ОС netbioz Компьютерное железо 6 19.11.2011 21:43
проигрывание AVI файла при запросе kotzzz Общие вопросы Delphi 6 23.03.2010 11:07
DSPack ошибка сертификации при открытии mp3 matalata Мультимедиа в Delphi 2 17.11.2009 21:34