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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2013, 04:24   #1
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию Зависание при перемотки видео put_CurrentPosition

Здравствуйте. Играю видео из интернета при помощи DirectShow и фильтров Lav. В некоторых видео (контейнер flv), при попытке перемотать (IMediaPosition - put_CurrentPosition), происходит зависание всего приложения. Данные для воспроизведения в это время загружаются с указанной позиции, если верить снифферу, но воспроизведение не начинается.

Как можно остановить воспроизведение в таком случае и освободить память фильтров и графа?

Последний раз редактировалось kangreon; 22.06.2013 в 04:27.
kangreon вне форума Ответить с цитированием
Старый 22.06.2013, 08:21   #2
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

может использовать поток?
Кольша вне форума Ответить с цитированием
Старый 22.06.2013, 12:47   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...как обычно:
Код:
 if Assigned(MediaControl) then begin
  MediaControl.Stop;
  MediaControl:= NIL
 end;

 if Assigned(BasicAudio)   then BasicAudio  := NIL;
 if Assigned(BasicVideo)   then BasicVideo  := NIL;
 if Assigned(VideoWindow)  then VideoWindow := NIL;
 if Assigned(pBitmap)      then pBitmap     := NIL;
 if Assigned(pConfig)      then pConfig     := NIL;
 if Assigned(pRenderer)    then pRenderer   := NIL;
 if Assigned(pGrabber)     then pGrabber    := NIL;
 if Assigned(GraphBuilder) then GraphBuilder:= NIL;

 if Assigned(FTee_Audio)  then FTee_Audio:= nil;
 if Assigned(FTee_Video)  then FTee_Video:= nil;
 if Assigned(FASFReader)  then FASFReader:= nil;
 if Assigned(FSink)  then FSink:= NIL;
 if Assigned(FMux)  then FMux:= NIL;
 if Assigned(FCaptureGraphBuilder) then FCaptureGraphBuilder   := NIL;


 CoUninitialize
и построить граф заново.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 22.06.2013, 15:44   #4
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Спасибо за ответы.
Попробовал вынести метод put_CurrentPosition в отдельный поток, но это не принесло никаких изменений. Во время загрузки данных, приложение перестает получать от Windows какие-либо сообщения, т.к. DirectShow не возвращает результат на прошлое сообщение.

После небольших изменений, пробовал вызывать метод Abort у IGraphBuilder. Это ничего не дало. При вызове метода IMediaControl - Stop из отдельного потока, происходит зависание и в нем.

Структура приложения построена таким образом, что в случае зависания DirectShow не зависает основное приложение. Для каждого экземпляра DirectShow создается отдельный поток со своим окном и обработчиком сообщений, созданным при помощи WinApi. Поток с DirectShow и основное приложение отлично синхронизируются и в случае зависания первого, второе отлично работает. Но существует проблема с перемоткой некоторых видео, о которых я писал в первом посте. Все бы ничего, пусть бы себе висело пока не отвиснет само и не освободит ресурсы, но во время этого зависания происходит загрузка данных из интернета (канал не резиновый =( ). Вот и хочется остановить эту уже не нужную загрузку.
Может стоит уже начинать смотреть в исходники фильтров Lav? Или может есть способ избежать такого зависания?
kangreon вне форума Ответить с цитированием
Старый 22.06.2013, 15:56   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...избежать, смотреть скорее исходники. Можно и ведь и отслеживать своеобразный таймаут между началом действия пользователя (изменением положения ползунка) и зависанием потока, и в случае чего прибивать граф.

p.s.: кстати, если не секрет, где взяли этот фильтр LAV?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 22.06.2013, 16:01   #6
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Фильтр расположен на Google Code http://code.google.com/p/lavfilters/

UPD
Реализовать проверку зависания в течении некоторого времени конечно можно, но опять же, не получится остановить граф и освободить память.

PS Разработчик фильтра, как я понял, не уделяет особого внимания на LAV Splitter, т.к. я еще в январе писал о таймауте открытия файлов. В итоге пришлось самому перекомпилировать проект с необходимыми изменениями.

Последний раз редактировалось kangreon; 22.06.2013 в 16:11.
kangreon вне форума Ответить с цитированием
Старый 22.06.2013, 17:07   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а пробовали сразу в nil интерфейсы, без Stop?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 23.06.2013, 00:45   #8
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Попробовал интерфейсы в nil и в конце CoUninitialize. Не помогло.

Спасибо за ответы. Буду пытаться найти решение проблемы в исходниках фильтра.

UPD
Частично проблему удалось решить изменением кода фильтра. Изменил время ожидания сообщения с постоянно на 20 сек. и в случае превышения таймаута, управление возвращается основному приложению, в котором уже останавливается воспроизведение. Данные больше не загружаются, но освободить память не получается, т.к. зависает на методе Stop.

Последний раз редактировалось kangreon; 23.06.2013 в 02:08.
kangreon вне форума Ответить с цитированием
Старый 23.06.2013, 11:39   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

20 секунд многовато для пользователя, 5-10 в самый раз.

Цитата:
Попробовал интерфейсы в nil
а тупо прибить поток (раз в отдельном)?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 24.06.2013, 22:43   #10
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

А что нельзя использовать TWebBrowser и HTML-код проигрывателя в программе?
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависание при работе с HttpWebRequest при обращении к некоторым сайтам Mishiko C# (си шарп) 0 16.08.2012 12:24
Ползунок перемотки видео в TMediaPlayer Illegal Production Мультимедиа в Delphi 1 05.12.2010 16:36
Зависание при скачке файла Lauri Общие вопросы Delphi 2 11.10.2010 10:25
Зависание ПК при печати. delf7 Компьютерное железо 3 09.06.2010 11:16