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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2010, 20:40   #1
Konung21
Пользователь
 
Регистрация: 07.05.2010
Сообщений: 14
Смущение ВидеоПлеер в Delphi

Здравствуйте. Мне нужно корректно проигрывать видео в своей форме (хотя бы только AVI). Компонент MediaPlayer не подходит - многие треки проигрываются некорректно - то нет звука, то проигрывание ускорено, то изображения и вовсе нет.
Можете подсказать способы реализовать нормальный плеер у себя в форме, или позвляющие управлять Windows Media Player или Winamp'ом... или еще как то? Может свободно распространяемые компоненты...
Работаю под Delphi 2010. Но могу и на D7.
Заранее спасибо откликнувшимся.
Konung21 вне форума Ответить с цитированием
Старый 02.07.2010, 20:54   #2
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

пример работы с winamp
http://www.delphirus.com/article75.html
можешь погрести еще в сторону winamp sdk

еще попробуй написать что нибудь на ActiveX WindowsMediaPlayer
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###

Последний раз редактировалось mihali4; 02.12.2010 в 17:14.
MadReason вне форума Ответить с цитированием
Старый 02.07.2010, 22:47   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

directshow/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 02.07.2010, 22:53   #4
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Хм... Bass dll?


P.S.
Не видел предыдущего сообщения пока писал своё... В принципе я примерно об том же:
Цитата:
BASS_DSHOW - An extension enabling the playback of video files with BASS, using DirectShow codecs.
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось DomiNick; 02.07.2010 в 22:55. Причина: P.S.
DomiNick вне форума Ответить с цитированием
Старый 04.07.2010, 20:50   #5
Konung21
Пользователь
 
Регистрация: 07.05.2010
Сообщений: 14
По умолчанию

Большое спасибо. Начал копать в сторону DirectShow. Новичек, поэтому полез в интернет. там наткнулся на вот эту популярную статью:
http://www.delphikingdom.com/asp/vie...?catalogid=270
Стал следовать ее инструкциям. Я только начал касаться API и COM технологий в Delphi, так и не нашел откуда брать pas'ник DShow... исполььзовал вместо него directshow9.
Создал проект, бросил на нее стандартную панель, кнопку ... вот код:

Код:
uses
	... directshow9, ActiveX,ComObj;


procedure TForm1.Button1Click(Sender: TObject);
var
	MyGraphBuilder : IGraphBuilder;
	MyMediaControl : IMediaControl;
	VideoWindow : IVideoWindow;

begin

	CoInitialize(nil);
	{получаем интерфейс IGraphBuilder}
	CoCreateInstance(CLSID_FilterGraph,nil,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,MyGraphBuilder);


	{вызываем RenderFile - граф фильтров строится автоматически}
	MyGraphBuilder.RenderFile('C:\Program Files\Borland\Delphi5\Demos\Coolstuf\cool.avi',nil);

	{получаем интерфейс ImediaControl}
	MyGraphBuilder.QueryInterface(IID_IMediaControl,MyMediaControl);
	{Примечание - MyMediaControl - переменная типа IMediaControl}

	{получаем интерфейс IVideoWindow}
	MyGraphBuilder.QueryInterface(IID_IVideoWindow,VideoWindow);
	{Примечание - VideoWindow - переменная типа IVideoWindow}

	{располагаем окошко с видео на панель}
	VideoWindow.Set_Owner(Self.Panel1.Handle);
	VideoWindow.Set_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS);
	VideoWindow.SetWindowPosition(0,0,Panel1.ClientRect.Right,Panel1.ClientRect.Bottom);

	{проигрываем видео}
	MyMediaControl.Run;
	
	ShowMessage('Нажмите OК');

	CoUninitialize;
end;
Проблема с последним: для VideoWindow у меня не определяются методы

Set_Owner(Self.Panel1.Handle); и
Set_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS); для VideoWindow.
в остальном все нормально.

посоветуйте, пожалуйста, как правильно поместить окно изобржения на на панель? а вообще, мне нужно cделать его Full Screen.
Konung21 вне форума Ответить с цитированием
Старый 04.07.2010, 21:12   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Переопределяем SampleGrabber и получаем каждый кадр в свой буфер, его выводим куда и чем угодно Вам.

Код:
type
  TArRGBTriple = array[0..0] of TRGBTriple;
  PArRGBTriple = ^TArRGBTriple;

function GetPin(pFilter: IBaseFilter; PintDir: TPinDirection): IPin;
procedure RemoveDefault(pGraph: IGraphBuilder; pNULLRenderer, pGrabberBase: IBaseFilter);

implementation

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;
пример набросок
Код:
...
TfrmExample = class(TForm, ISampleGrabberCB)
private
    function SampleCB(SampleTime: Double; pSample: IMediaSample): HResult; stdcall;
    function BufferCB(SampleTime: Double; pBuffer: PByte; BufferLen: longint): HResult; stdcall;
...
    GraphBuilder: IGraphBuilder;
    FilterSampleGrabber: IBaseFilter;
    SampleGrabber: ISampleGrabber;
    MediaControl: IMediaControl;
    MediaPosition: IMediaPosition;
    NullRenderer: IBaseFilter;
end;

...

function TfrmExample.BufferCB(SampleTime: Double; pBuffer: PByte;
  BufferLen: Integer): HResult;
begin
  Result := S_OK;
end;

function TfrmExample.SampleCB(SampleTime: Double; pSample: IMediaSample): HResult;
var
  BmpHead: PBitmapInfoHeader;
  MediaType: TAMMediaType;
  DIBSize: Integer;
  pBuffer: PByte;
begin
  Result := S_OK;

  if (pSample.GetSize = 0) then
    Exit;

  Result := SampleGrabber.GetConnectedMediaType(MediaType);
  if Failed(Result) then
    Exit;

  if IsEqualGUID(MediaType.majortype, MEDIATYPE_Video) then
  begin
    BmpHead := NIL;
    if IsEqualGUID(MediaType.formattype, FORMAT_VideoInfo) then
    begin
      if (MediaType.cbFormat = SizeOf(TVideoInfoHeader)) then
        BmpHead := @(PVideoInfoHeader(MediaType.pbFormat)^.bmiHeader);
    end;
    if (BmpHead = NIL) then
      Exit;
    
    DIBSize := BmpHead^.biSizeImage;
    if (DIBSize = 0) then
    begin
      with BmpHead^ do
        DIBSize := 3 * biWidth * biHeight * biPlanes;
      BmpHead^.biSizeImage := DIBSize;
    end;

    pSample.GetPointer(pBuffer);
    
    // вот необходимые данные для работы с растром текущего кадра
    // BmpHead^.biWidth, BmpHead^.biHeight, BmpHead^.biWidth * 3, PixelFormat24bppRGB, pBuffer
  end;
end;
BOBAH13 вне форума Ответить с цитированием
Старый 04.07.2010, 21:13   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

как запускать Play/Pause/Stop

Код:
procedure TfrmExample.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('My Video File')), 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);

  MediaPosition.get_Duration(VideoLen);
  MediaControl.Run;
end;

procedure TfrmExample.Pause;
begin
  MediaControl.Pause;
end;

procedure TfrmExample.Stop;
begin
    MediaControl.StopWhenReady;
    FilterSampleGrabber := NIL;
    SampleGrabber := NIL;
    MediaControl := NIL;
    MediaPosition := NIL;
    NullRenderer := NIL;
    GraphBuilder := NIL;
end;
p.s. с вас $40

Edit:
Ах да, http://sourceforge.net/projects/delp...7.exe/download ну или http://sourceforge.net/projects/delphi-dx9sdk/files/

Последний раз редактировалось BOBAH13; 04.07.2010 в 21:15.
BOBAH13 вне форума Ответить с цитированием
Старый 04.07.2010, 22:27   #8
Konung21
Пользователь
 
Регистрация: 07.05.2010
Сообщений: 14
Радость

Большое Спасибо всем) Все сделал.

ps:
в примере из
http://www.delphikingdom.com/asp/vie...?catalogid=270

вместо
Set_Owner(Self.Panel1.Handle); и
Set_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS)

нужно использовать
put_Owner(Self.Panel1.Handle); и
put_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS)
Konung21 вне форума Ответить с цитированием
Старый 05.07.2010, 12:11   #9
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

DSPack облегчает многие моменты.
x128 вне форума Ответить с цитированием
Старый 23.10.2010, 17:48   #10
sekenr
 
Регистрация: 23.10.2010
Сообщений: 6
По умолчанию

BOBAH13, немог бы ты поподробнее объяснить про вывод каждого кадра в отдельный буфер с помощью SampleGrabber'а, а то если честно слабо понятно как закидывается в буфер и как потом из него извлекать и использовать.
sekenr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Видеоплеер blatm100 Фриланс 12 26.04.2010 12:07
Видеоплеер littlecoder Мультимедиа в Delphi 3 16.12.2008 01:09
Ищу видеоплеер Квэнди Софт 8 25.06.2008 14:32
Как открыть БД, написанную в Delphi если нf другой машине Delphi нет? dagarik БД в Delphi 7 22.10.2007 17:54
компонент видеоплеер @Ri$91 Общие вопросы Delphi 5 25.11.2006 13:55