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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2013, 15:29   #1
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
Вопрос DirectShow9

Доброе время суток!
Подскажите пожалуйста как в DirectShow проиграть видео бесконечно?
PHP код:
procedure TForm1.FormCreate(SenderTObject);
begin
CoCreateInstance
(CLSID_FilterGraph,nil,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,MyGraphBuilder);
MyGraphBuilder.RenderFile('Видео.av'i,nil);
MyGraphBuilder.QueryInterface(IID_IMediaControl,MyMediaControl);
MyGraphBuilder.QueryInterface(IID_IVideoWindow,VideoWindow);
VideoWindow.Put_Owner(Self.Panel1.Handle);
VideoWindow.Put_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS);
VideoWindow.SetWindowPosition(0,0,Panel1.Width,Panel1.Height);
MyMediaControl.Run;
end
С уважением,
Volkogriz!
Не количеством плюсов измеряется репутация человека...!
Volkogriz вне форума Ответить с цитированием
Старый 05.01.2013, 20:28   #2
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

В двух словах, вам нужно ловить сообщение EC_COMPLETE от DirectShow и устанавливать при этом позицию воспроизведения равную 0.

Вот небольшой пример. Основные моменты прокомментированы.
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, ActiveX, DirectShow9, Vcl.StdCtrls, Vcl.Dialogs;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormResize(Sender: TObject);
  protected
    procedure WndProc(var Message: TMessage); override;
  private
    FGraph: IGraphBuilder;
    FVideo: IVideoWindow;
    FEvent: IMediaEventEx;
    FControl: IMediaControl;
    FPosition: IMediaPosition;
  end;

  const
  WM_DS_MESSAGE = WM_USER + 1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not OpenDialog1.Execute then
    Exit;
  TButton(Sender).Visible := False;

  // Открытие файла
  FGraph.RenderFile(PWideChar(OpenDialog1.FileName), nil);

  // Настройка окна вывода изображения
  FVideo.put_Owner(Handle);
  FVideo.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
  FVideo.put_Left(0);
  FVideo.put_Top(0);
  Resize;

  // Запуск воспроизведения
  FControl.Run;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CoInitialize(nil);

  // Инициалтзация Graph Builder и интерфейсов
  CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
    FGraph);
  FGraph.QueryInterface(IID_IVideoWindow, FVideo);
  FGraph.QueryInterface(IID_IMediaPosition, FPosition);
  FGraph.QueryInterface(IID_IMediaEventEx, FEvent);
  FGraph.QueryInterface(IID_IMediaControl, FControl);

  // Установка окна, для отправки событий воспроизведения
  FEvent.SetNotifyWindow(Handle, WM_DS_MESSAGE, 0);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  FVideo.put_Width(ClientWidth);
  FVideo.put_Height(ClientHeight);
end;

procedure TForm1.WndProc(var Message: TMessage);
var
  Code: Integer;
  l1, l2: LONG_PTR;
begin
  inherited;

  case Message.Msg of
    WM_DS_MESSAGE:
      begin
        // Обработка событий от Direct Show
        while FEvent.GetEvent(Code, l1, l2, 1) = S_OK do
        begin
          if Code = EC_COMPLETE then
            //Начать воспроизведение с 0
            FPosition.put_CurrentPosition(0);

          FEvent.FreeEventParams(Code, l1, l2);
        end;

      end;
  end;
end;

end.
kangreon вне форума Ответить с цитированием
Старый 05.01.2013, 22:22   #3
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
По умолчанию

Спасибо большое!
Не количеством плюсов измеряется репутация человека...!
Volkogriz вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Те кто работал с DirectShow9 и полноэкранным режимом помогите Anatol_rus Мультимедиа в Delphi 8 10.11.2008 11:15