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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2009, 15:06   #1
Gonzales1979
 
Регистрация: 15.10.2009
Сообщений: 9
По умолчанию Загрузка файла в граф (DirectShow)

Если я построил граф например для файла 1.avi, а потом мне надо проиграть файл 2.avi, то нужно создавать граф заново или можно в этот как-нить загрузить новый файл?

PS: Файлы одинаковые по параметрам.
Gonzales1979 вне форума Ответить с цитированием
Старый 15.10.2009, 17:02   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

всей цепочке желательно присвоить nil и уже потом загружать новый
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.10.2009, 01:00   #3
Gonzales1979
 
Регистрация: 15.10.2009
Сообщений: 9
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
всей цепочке желательно присвоить nil и уже потом загружать новый
Т.е. заново все равно придется делать? Для фильтра источника нету какой-нить функции/метода/интерфейса загрузить файл?

PS: Сейчас и сделано всей цепочке release, nil после обрабтки и построение графа заново. В том и вопрос, можно ли не строить заново, а просто указать новый источник.
Gonzales1979 вне форума Ответить с цитированием
Старый 16.10.2009, 01:46   #4
Gonzales1979
 
Регистрация: 15.10.2009
Сообщений: 9
По умолчанию

Цитата:
заблокируйте меня пожалуйста навечноооо!!!!!
Неожиданное заявление. С чем связано???
Gonzales1979 вне форума Ответить с цитированием
Старый 16.10.2009, 15:54   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
Смех

Цитата:
Т.е. заново все равно придется делать? Для фильтра источника нету какой-нить функции/метода/интерфейса загрузить файл?
- ну вообще при загрузке файла все равно граф пере-построить придется, абсолютно одинаковых ну редко...

и желательно обнулить, вот например так:
Код:
   if Assigned(MediaEventEx) then MediaEventEx:= NIL;
   if Assigned(MediaSeeking) then MediaSeeking:= NIL;
   if Assigned(MediaControl) then MediaControl:= NIL;
   if Assigned(BasicAudio)   then BasicAudio  := NIL;
   if Assigned(BasicVideo)   then BasicVideo  := NIL;
   if Assigned(pVProcAmp)    then pVProcAmp   := 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;
d;
...собственно, а в чем вы видите проблему? этот процесс идет без тормозов...

пы-сы: если вы приведете как вы делаете, помогу разобраться, ибо когда-то полностью делал плеер на directshow методах, примерчик
http://raxp.radioliga.com/cnt/s.php?p=ram.zip
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.10.2009, 17:33   #6
Gonzales1979
 
Регистрация: 15.10.2009
Сообщений: 9
По умолчанию

Цитата:
- ну вообще при загрузке файла все равно граф пере-построить придется,
Так и делаю в итоге, пробовал удалять, а потом добавлять SourceFilter, потом при Connect болше времени уходит, чем если все заново строить.

Цитата:
абсолютно одинаковых ну редко...
Здесь все файлы одинаковые, пишутся устройством одним...

Последний раз редактировалось Gonzales1979; 16.10.2009 в 17:36.
Gonzales1979 вне форума Ответить с цитированием
Старый 16.10.2009, 17:44   #7
Gonzales1979
 
Регистрация: 15.10.2009
Сообщений: 9
По умолчанию

Сделано вот так сейчас (Builder), для показа первой картинки из ролика.
Код:
// Ищем CLSID для декодера
hr=SearchDMOCLSID("Mpeg4s Decoder DMO",CLSID_DMO);
if(hr) {
       ReleaseAll();
       LoadError();
       return;
       }
// Создаем граф фильтров
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder,(void**) &pGraphBuilder);
if(hr) {
       ReleaseAll();
       return;
       }
// Добавляем к графу фильтров фильтр файла-источника
hr = pGraphBuilder->AddSourceFilter(wFileName,wFileName, &pSourceFileFilter);
if(hr) {
       ReleaseAll();
       return;
       }
// Создаем DMO фильтр
hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&pDMOBaseFilter);
if(hr) {
       ReleaseAll();
       return;
       }
// Инициализируем DMO
hr = pDMOBaseFilter->QueryInterface(IID_IDMOWrapperFilter,(void **)&pDMOWrapper);
if(hr) {
       ReleaseAll();
       return;
       }
hr = pDMOWrapper->Init( CLSID_DMO, DMOCATEGORY_VIDEO_DECODER);
if(hr) {
       ReleaseAll();
       return;
       }
// Добовляем DMO в граф
hr = pGraphBuilder->AddFilter(pDMOBaseFilter, L"Mpeg4s Decoder DMO");
if(hr) {
       ReleaseAll();
       return;
       }
// Создаем SampleGrabber
hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&pSampleGrabberFilter);
if(hr) {
       ReleaseAll();
       return;
       }
// Добаваляем SampleGrabber в граф
hr = pGraphBuilder->AddFilter(pSampleGrabberFilter,L"SampleGrabber");
if(hr) {
       ReleaseAll();
       return;
       }
// Создаем NullRenderer
hr = CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&pNullRenderFilter);
if(hr) {
       ReleaseAll();
       return;
       }
// Добаваляем NullRenderer в граф
hr = pGraphBuilder->AddFilter(pNullRenderFilter,L"NullRenderer");
if(hr) {
       ReleaseAll();
       return;
       }
// получаем интерфейс ISampleGrabber
hr = pSampleGrabberFilter->QueryInterface(IID_ISampleGrabber,(void**)&pSG);
if(hr) {
       ReleaseAll();
       return;
       }
// Устанавливаем формат кадра
hr = pSG->SetMediaType(&MediaType);
if(hr) {
       ReleaseAll();
       return;
       }
// получаем интерфейс IMediaControl и IMediaEvent:
hr = pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&pMediaControl);
if(hr) {
       ReleaseAll();
       return;
       }
// получаем интерфейс IMediaEvent:
hr = pGraphBuilder->QueryInterface(IID_IMediaEvent, (void**)&pMediaEvent);
if(hr) {
       ReleaseAll();
       return;
       }
hr = pSG->SetOneShot(true);
if(hr) {
       ReleaseAll();
       return;
       }
hr = pSG->SetBufferSamples(true);
if(hr) {
       ReleaseAll();
       return;
       }

// Соединяем SourceFile и Mpeg4s
hr = pSourceFileFilter->FindPin(L"Raw Video 1",&OutPin);
if(hr) {
       ReleaseAll();
       return;
       }
hr = pDMOBaseFilter->FindPin(L"in0",&InPin);
if(hr) {
       ReleaseAll();
       return;
       }
hr = pGraphBuilder->Connect(InPin,OutPin);
if(hr) {
       ReleaseAll();
       return;
       }

// Соединяем Mpeg4s и SampleGrabber
hr = pDMOBaseFilter->FindPin(L"out0",&OutPin);
if(hr) {
       ReleaseAll();
       return;
       }
hr = pSampleGrabberFilter->FindPin(L"In",&InPin);
if(hr) {
       ReleaseAll();
       return;
       }
hr = pGraphBuilder->Connect(InPin,OutPin);
if(hr) {
       ReleaseAll();
       return;
       }

// Соединяем SampleGrabber и NullRenderer
hr = pSampleGrabberFilter->FindPin(L"Out",&InPin);
if(hr) {
       ReleaseAll();
       return;
       }
hr = pNullRenderFilter->FindPin(L"In",&OutPin);
if(hr) {
       ReleaseAll();
       return;
       }
hr = pGraphBuilder->Connect(InPin,OutPin);
if(hr) {
       ReleaseAll();
       return;
       }

hr = pMediaControl->Run();
hr = pMediaEvent->WaitForCompletion(INFINITE, &rcode);

hr = pSG->GetCurrentBuffer(&bufSize,NULL);
if(hr) {
       ReleaseAll();
       return;
       }
buffer=new char [bufSize];
if(!buffer)
       {
       ReleaseAll();
       return;
       }
hr = pSG->GetCurrentBuffer(&bufSize,(long*)buffer);
if(hr) {
       ReleaseAll();
       return;
       }
// Показать первый кадр
ptr=buffer;
for(i=0;i<240;i++)
 {
 CopyMemory(PreviewImage -> Picture ->Bitmap ->ScanLine [239-i],ptr,320*4);
 ptr+=320*4;
 }
delete []buffer;
PreviewImage->Picture->Bitmap->Modified=true;

hr = pMediaControl->Stop();
if(hr) {
       ReleaseAll();
       return;
       }
ReleaseAll();
Gonzales1979 вне форума Ответить с цитированием
Старый 16.10.2009, 18:01   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Сделано вот так сейчас (Builder), для показа первой картинки из ролика.
гы, в мене на дельфях, но directshow то остался


...попробуйте в процедуре загрузки файла так, если GraphBuilder УЖЕ построен то if
Код:
var _dsmp: TDSMP;
Assigned(_dsmp.GraphBuilder)
    then dsmpFree(_dsmp) else dsmpReset(_dsmp);
//дальше строим граф, все как у вас
где tdsmp
Код:
type
  //DirectShow Media Player
  TDSMP = record
    GraphBuilder : IGraphBuilder;
    MediaControl : IMediaControl;
    MediaSeeking : IMediaSeeking;
    MediaEventEx : IMediaEvent;
    BasicAudio   : IBasicAudio;
    BasicVideo   : IBasicVideo;
    VideoWindow  : IVideoWindow;
    //grab-
    pGrabber     : ISampleGrabber;
    pGrabberF    : IBaseFilter;
    // дык и так ясно
и
Код:
procedure dsmpReset(var _dsmp: TDSMP);
begin
 FillChar(_dsmp, SizeOf(_dsmp), 0)
end;

procedure dsmpFree(var _dsmp: TDSMP);
begin
 with _dsmp do
  begin
   if Assigned(MediaEventEx) then MediaEventEx:= NIL;
   if Assigned(MediaSeeking) then MediaSeeking:= NIL;
   if Assigned(MediaControl) then MediaControl:= NIL;
   if Assigned(BasicAudio)   then BasicAudio  := NIL;
   if Assigned(BasicVideo)   then BasicVideo  := NIL;
   if Assigned(pVProcAmp)    then pVProcAmp   := NIL;
   if Assigned(VideoWindow)  then VideoWindow := NIL;
   //некоторые ваши интерфейсы
   if Assigned(pGrabber)     then pGrabber    := NIL;
   if Assigned(GraphBuilder) then GraphBuilder:= NIL;

   dsmpReset(_dsmp)
  end
end;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.10.2009, 18:49   #9
Gonzales1979
 
Регистрация: 15.10.2009
Сообщений: 9
По умолчанию

Так почти и сделано.
По теме: Без перестройки графа загрузить новый файл нельзя, как я понял. Я просто думал что есть какая-нибудь функция/метод для загрузки файла в фильтр источник.
Gonzales1979 вне форума Ответить с цитированием
Старый 16.10.2009, 18:57   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

нет, только очистка
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка файла?! Mr.Qwerty Общие вопросы Delphi 1 10.09.2009 21:28
Проблема такова: язык:Delphi7; сохранения файла; загрузка файла в String Grid lightdevil Общие вопросы Delphi 3 06.03.2009 23:10
загрузка из файла RAVAL)) Общие вопросы Delphi 2 04.03.2009 12:48
Загрузка из файла Raivolo Помощь студентам 3 05.02.2009 22:25
Загрузка Файла Volkogriz Общие вопросы Delphi 3 31.10.2007 21:14