Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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


Ответ
 
Опции темы
Старый 17.04.2017, 10:08   #1
shvedoff
Пользователь
 
Регистрация: 18.01.2010
Сообщений: 18
По умолчанию Проигрывание MP4 файла, кроме WMP

Как можно проиграть один видео файл формата MP4 без использования WMP?!
Нужен пример.
Помогите.
shvedoff вне форума Ответить с цитированием
Старый 17.04.2017, 10:52   #2
shvedoff
Пользователь
 
Регистрация: 18.01.2010
Сообщений: 18
По умолчанию

Делаю так:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
MyGraphBuilder: IGraphBuilder;
MyMediaControl: IMediaControl;
VideoWindow: IVideoWindow;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
CoInitialize(nil);
{получаем интерфейс IGraphBuilder}
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, MyGraphBuilder);

{вызываем RenderFile - граф фильтров строится автоматически}
MyGraphBuilder.RenderFile('1.mp4', nil);

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

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

{располагаем окошко с видео на панель}
VideoWindow.SetOwner(Self.Panel1.Ha ndle);
VideoWindow.Set_WindowStyle(WS_CHIL D or WS_CLIPSIBLINGS);
VideoWindow.SetWindowPosition(0, 0, Panel1.ClientRect.Right, Panel1.ClientRect.Bottom);

{проигрываем видео}
MyMediaControl.Run;

ShowMessage('Нажмите OК');

CoUninitialize;
end;

end.

Ошибка:
[dcc32 Error] Unit1.pas(49): E2003 Undeclared identifier: 'SetOwner'
[dcc32 Error] Unit1.pas(50): E2003 Undeclared identifier: 'Set_WindowStyle'
shvedoff вне форума Ответить с цитированием
Старый 17.04.2017, 16:12   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 679
По умолчанию

как-то вот так надо:
Код:
procedure ClearGraph;
begin
  if Assigned(pMediaControl) then
  pMediaControl.Stop;
  fVideoRenderer:= nil;
  fVideoDecoder := nil;
  fSource := nil;
  pMediaControl := nil;
  pCaptureGraphBuilder :=nil;
  pGraphBuilder := nil;
end;

function buildGraph(fn : string): HRESULT;
const
  CLSID_FfdshowVideoDecoder : TGUID = '{04FE9017-F873-410E-871E-AB91661A4EF7}';
  CLSID_ffdshowAudioDecoder : TGUID = '{0F40E1E5-4F79-4988-B1A9-CC98794E6B55}';
begin
  Result := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER ,
                           IID_IGraphBuilder, pGraphBuilder);
  Result := CoCreateInstance(CLSID_CaptureGraphBuilder2, NIL,
                          CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2,
                         pCaptureGraphBuilder);
  pCaptureGraphBuilder.SetFiltergraph(pGraphBuilder);
  Result := pGraphBuilder.AddSourceFilter(StringToOleStr(Fn),'source',fsource);
  if Result <> S_OK then
  begin
    MessageBox(Application.Handle,'AddSourceFilter error','error', MB_ICONERROR);
    ClearGraph;
    Exit;
  end;
  Result :=  coCreateInstance(CLSID_VideoRendererDefault, nil,
                                   CLSCTX_INPROC_SERVER,
                                   IID_IBaseFilter, fVideoRenderer);
  if Result <> S_OK then
  begin
    MessageBox(Application.Handle,'video renderer load error','error', MB_ICONERROR);
    ClearGraph;
    Exit;
  end;

  pGraphBuilder.AddFilter(fVideoRenderer,'Video renderer');

  Result := CoCreateInstance(CLSID_FfdshowVideoDecoder,nil,CLSCTX_INPROC_SERVER,
                               IID_IBaseFilter,fVideoDecoder);
  if Result <> S_OK then
  begin
    MessageBox(Application.Handle,PChar('FFDShow load error'+#13#10+
                     guidtostring(CLSID_FfdshowVideoDecoder)),'error', MB_ICONERROR);
    ClearGraph;
    Exit;
  end;
  pGraphBuilder.AddFilter(fVideoDecoder,'video decoder');
  Result := pCaptureGraphBuilder.RenderStream(nil,@MEDIATYPE_VIDEO,
                                   fSource,fVideoDecoder,fVideoRenderer);
  if Result <> S_OK then
  begin
    MessageBox(Application.Handle,'RenderStream error','error', MB_ICONERROR);
    ClearGraph;
    Exit;
  end;
  pGraphBuilder.QueryInterface(IID_IVideoWindow,pVideoWindow);
  pGraphBuilder.QueryInterface(IID_IMediaControl,pMediaControl);

  pVideoWindow.put_Owner(Form3.pnl1.Handle);
  pVideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
  pVideoWindow.SetWindowPosition(0,0,Form3.pnl1.Width,Form3.pnl1.Height);
  pMediaControl.Run;
end;

Последний раз редактировалось BLACK_RAIN; 17.04.2017 в 16:16.
BLACK_RAIN вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление из срр файла всего текста кроме комментариев julia9311 Общие вопросы C/C++ 17 19.10.2018 03:16
Выбрать из файла весь текст, кроме url mishammm PHP 2 07.11.2015 22:09
Проигрывание файла MP3 InfaMan Мультимедиа в Delphi 2 14.05.2015 05:50
проигрывание AVI файла при запросе kotzzz Общие вопросы Delphi 6 23.03.2010 12:07
Циклическое проигрывание midi-файла без разрывов в звучании LordYuri Мультимедиа в Delphi 2 23.04.2008 18:09


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS