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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2009, 20:33   #1
BAZA
Пользователь
 
Регистрация: 30.12.2008
Сообщений: 16
По умолчанию видео

Я запускаю видео а оно у меня слишком быстро перематывается что надо сделать что было нормально?может в другой формат?
BAZA вне форума Ответить с цитированием
Старый 30.01.2009, 20:35   #2
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

если ты юзаешь медиаплеер, то такое бывает из за кодека...
Перед тем как спросить ищи на форуме и в GOOGLE
KORN вне форума Ответить с цитированием
Старый 30.01.2009, 21:57   #3
BAZA
Пользователь
 
Регистрация: 30.12.2008
Сообщений: 16
По умолчанию

а как можно воспроизвести видео что оно нормально шло?
BAZA вне форума Ответить с цитированием
Старый 31.01.2009, 07:09   #4
KORN
Банхаммер
Участник клуба
 
Аватар для KORN
 
Регистрация: 17.02.2007
Сообщений: 1,754
По умолчанию

либо кодек другой, либо ищи другой компонент для работы с видео
Перед тем как спросить ищи на форуме и в GOOGLE
KORN вне форума Ответить с цитированием
Старый 31.01.2009, 10:00   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Не компонент, а смотрим в сторону DirectShow, потом IGraphBuilder.RenderFile потом убиваем пин стандартного рендеринга и ставим свой перехват и выводим через SampleBuffer, если конечно надо отлавливать каждый кадр и не нужно окно вывода, потом ставим фильтр NullRenderer и вперед на IMediaControl.Run
BOBAH13 вне форума Ответить с цитированием
Старый 31.01.2009, 14:12   #6
BAZA
Пользователь
 
Регистрация: 30.12.2008
Сообщений: 16
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Не компонент, а смотрим в сторону DirectShow, потом IGraphBuilder.RenderFile потом убиваем пин стандартного рендеринга и ставим свой перехват и выводим через SampleBuffer, если конечно надо отлавливать каждый кадр и не нужно окно вывода, потом ставим фильтр NullRenderer и вперед на IMediaControl.Run

извеняюсь но я мало что понял я токо начинающий програмист можно обьяснить по подробней пожалуйсто!
BAZA вне форума Ответить с цитированием
Старый 31.01.2009, 14:15   #7
BAZA
Пользователь
 
Регистрация: 30.12.2008
Сообщений: 16
По умолчанию

и большая просьба обьяснять где что находится!!!
BAZA вне форума Ответить с цитированием
Старый 31.01.2009, 14:50   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

DirectShow - система предоставляет этот набор инструментов-интерфейсов для работы со всеми форматами, для которых существуют кодеки на машине, где приложение ваше запускается. Отрываю от сердца куски кода, реализовал это в галерее-стеке в моей программы XWindows Dock. Извените но объяснять комментами лень, все в сети можно прочитать, но то как выводить видео куда вы захотите НИГДЕ нет. Но я с помощью одного человека с сайта "DirectShow по русски" сделал это.
Понадобится DirectShow9

На счет SampleGrabber - будут вопросы, отвечу.

Код:
GraphBuilder: IGraphBuilder;
    FilterSampleGrabber: IBaseFilter;
    SampleGrabber: ISampleGrabber;
    MediaControl: IMediaControl;
    MediaPosition: IMediaPosition;
    NullRenderer: IBaseFilter;

...

procedure TfrmImageGallery.Play;
var
  MediaType: TAMMediaType;
  Result: HRESULT;
begin
  GraphBuilder := NIL;
  FilterSampleGrabber := NIL;
  SampleGrabber := NIL;
  MediaControl := NIL;
  MediaPosition := NIL;
  NullRenderer := NIL;
  
  CoCreateInstance(CLSID_FilterGraph, NIL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, GraphBuilder);

  Result := GraphBuilder.RenderFile(PWCHAR(WideString('test.avi')), NIL);
  if Failed(Result) then
    Exit;

  CoCreateInstance(CLSID_SampleGrabber, NIL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, FilterSampleGrabber);
  FilterSampleGrabber.QueryInterface(IID_ISampleGrabber, SampleGrabber);

  FillChar(MediaType, SizeOf(MediaType), 0);
  MediaType.majortype := MEDIATYPE_Video;
  MediaType.subtype := MEDIASUBTYPE_RGB24;
  SampleGrabber.SetMediaType(MediaType);
  SampleGrabber.SetBufferSamples(True);
  SampleGrabber.SetOneShot(False);
  SampleGrabber.SetCallback(Self, 0);
  GraphBuilder.AddFilter(FilterSampleGrabber, 'Sample Grabber');

  // как раз с параллельной темы, именно этот фильтр делает задержки для каждого кадра видео
  CoCreateInstance(CLSID_NullRenderer, NIL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, NullRenderer);
  GraphBuilder.AddFilter(NullRenderer, 'Null Renderer');

  // если нужно, то именно тут происходить перенаправление видео вывода
  RemoveDefault(GraphBuilder, NullRenderer, FilterSampleGrabber);
  
  GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl);
  GraphBuilder.QueryInterface(IID_IMediaPosition, MediaPosition);
  
  MediaControl.Run;
end;

...

function GetPin(pFilter: IBaseFilter; PintDir: TPinDirection): IPin;
var
  bFound: Boolean;
  pEnum: IEnumPins;
  pPin: IPin;
  hr: HRESULT;
  PinDirThis: TPinDirection;
begin
  Result := NIL;
  bFound := False;

  hr := pFilter.EnumPins(pEnum);
  if Failed(hr) then
    Exit;

  while (pEnum.Next(1, pPin, NIL) = S_OK) do
  begin
    pPin.QueryDirection(PinDirThis);
    bFound := (PintDir = PinDirThis);
    if bFound then
      Break;
    pPin := NIL;
  end;

  pEnum := NIL;
  if bFound then
    Result := pPin;
end;

procedure RemoveDefault(pGraph: IGraphBuilder; pNULLRenderer, pGrabberBase: IBaseFilter);
var
  pVidRenderer, pColorConverter: IBaseFilter;
  Pin, oPin: IPin;
begin
  pGraph.FindFilterByName('Video Renderer', pVidRenderer);
  if (pVidRenderer <> NIL) then
  begin
    Pin := GetPin(pVidRenderer, PINDIR_INPUT);
    oPin := NIL;
    Pin.ConnectedTo(oPin);
    Pin.Disconnect;
    oPin.Disconnect;
    Pin := NIL;

    pGraph.RemoveFilter(pVidRenderer);
    pVidRenderer := NIL;

    pGraph.FindFilterByName('Color Space Converter', pColorConverter);
    if (pColorConverter <> NIL) then
    begin
      oPin := NIL;
      Pin := GetPin(pColorConverter, PINDIR_INPUT);
      Pin.ConnectedTo(oPin);
      Pin.Disconnect;
      oPin.Disconnect;
      Pin := NIL;

      pGraph.RemoveFilter(pColorConverter);
      pColorConverter := NIL;
    end;

    Pin := GetPin(pGrabberBase, PINDIR_INPUT);
    pGraph.Connect(oPin, Pin);
    Pin := NIL;
    oPin := NIL;

    oPin := GetPin(pGrabberBase, PINDIR_OUTPUT);
    Pin := GetPin(pNULLRenderer, PINDIR_INPUT);

    pGraph.Connect(oPin, Pin);
    Pin := NIL;
    oPin := NIL;
  end;
end;

Последний раз редактировалось BOBAH13; 31.01.2009 в 18:36.
BOBAH13 вне форума Ответить с цитированием
Старый 31.01.2009, 15:13   #9
BAZA
Пользователь
 
Регистрация: 30.12.2008
Сообщений: 16
По умолчанию

извени но я мало что понял
BAZA вне форума Ответить с цитированием
Старый 01.02.2009, 01:26   #10
BAZA
Пользователь
 
Регистрация: 30.12.2008
Сообщений: 16
По умолчанию

я понял почему видео шло в ускореном темпе єто из-за формата avi с форматом gpeg всё нормально1!!!
BAZA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Видео в mediaplayer RealSHELS Общие вопросы Delphi 1 30.07.2008 21:53
Видео sf911 Помощь студентам 6 05.06.2008 22:54
видео sf911 Свободное общение 1 05.06.2008 19:55
Видео Stanislav Свободное общение 0 17.11.2007 14:29