Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.04;
Скачать: CL | DM;

Вниз

Print Screen видео   Найти похожие ветки 

 
Eraser ©   (2005-04-11 21:26) [0]

Добрый вечер! Вопрос такой: как сделать Print Screen окна, в котором отображается видео?
Копирование с HDC окна даёт чёрный прямоугольник...

Спасибо.


 
Анонимщик1   (2005-04-11 21:31) [1]

Это, наверное, в случае оверлея? Не знаю способа.


 
Eraser ©   (2005-04-11 21:32) [2]

Анонимщик1

Именно в случае оверлея.


 
DeadMeat ©   (2005-04-12 01:09) [3]

Тут статься про DirectX была...
Не то?
Просто я не читал.. Знаю что была..

---
...Death Is Only The Begining...


 
Sapersky   (2005-04-12 12:34) [4]

Не то?

Если получить surface оверлея в адресном пространстве медиаплеера (c помощью madCollection/madCodeHook, например) - тогда, возможно, то. С тем отличием, что нужно не писать, а получать из оверлея данные (делается той же блокировкой), ну и преобразование обратное YUV -> RGB.
"Возможно", потому что данный метод сильно привязан к версии DX. В статье используется DX7 (DirectDraw). В DX >= 8, по некоторым данным, DirectDraw неявно используется DirectShow для вывода изображения - если это так, данный метод будет работать для всех ДиректИксов. Если нет - придётся ковыряться в DirectShow.


 
@!!ex   (2005-04-12 14:32) [5]

Хм. Я сам таким вопросом не задавался, но знаю, что мой брат с этим заморачиваться не стал. Написал драйвер, который получает прямой доступ к видео памяти и все......


 
Анонимщик1   (2005-04-12 17:14) [6]

Для XP есть более прямой способ - можно, вроде бы, прямо у миксера и спросить. Для NT/2000 такой метод не работает. Больше, к сожалению, сказать ничего не могу. Сам узнать был бы не прочь.


 
Sapersky   (2005-04-12 18:30) [7]

Если нужен только 1 кадр (скриншот), вот ещё вариант - включить в своей программе эксклюзивный видеорежим DirectX (полноэкранный, скажем так). Видеопамять при этом отбирается у остальных приложений, но, вроде, не очищается. Можно предположить, что медиаплеер создаёт первичку и оверлей, и сделать в своей программе то же самое. Если поверхности попадут в те же адреса видеопамяти, получим в оверлее нужный кадр.
То есть, теоретически должны получить...


 
Eraser ©   (2005-04-12 21:24) [8]

Спасибо всем... я так понял вопрос нетривиальный...

@!!ex

Твой брат писал драйвер ядра?


 
Sapersky   (2005-04-14 12:24) [9]

Попробовал ради интереса сделать по методу [4]. С оверлеем для DX7 работает, а с медиаплеером не хочет. Ну, правильно - даже если используется DirectDraw, зачем MS обращаться к нему через интерфейсы? Они же непосредственно объекты могут использовать.

Так что если делать перехватом функций - нужно влезать в DirectShow. Здесь я не специалист... Но если в DirectShow-программе в принципе можно получить кадр видео, независимо от метода вывода (что-то было недавно про SampleGrabber - или это только для видеозахвата?) - тогда можно заставить это сделать и посторонний медиаплеер.

Что касается драйвера... Ну, получим доступ к памяти - а как оверлей в ней искать?


 
Eraser ©   (2005-04-14 15:52) [10]

Sapersky

ИМХО есть способ проще... существует ряд программ, которые умеют делать принт скрин медиаплееров... может надо DC брать (getwindowDC) конкретно у окна отображения, а не всего десктопа...?


 
Sapersky   (2005-04-14 21:30) [11]

Есть способ проще - отключить оверлей, чтобы видео выводилось на обычную поверхность. Делается в настройках фильтра "Video Renderer", причём эти настройки глобальны для DirectShow, так что, наверное, их можно поменять в своей программе.
Но вроде как просил "именно для оверлея", вот я и изощряюсь... :)


 
Eraser ©   (2005-04-14 22:00) [12]

Sapersky
Но вроде как просил "именно для оверлея", вот я и изощряюсь... :)


Вообще я любому совету по этой теме рад! ))
Задача "проста"- перехватить картинку в Media плеере, например...


 
LA   (2005-04-14 23:53) [13]

а конкретный код у кого-нибудь имеется? поделитесь, плз...
причем, мне нужно сделать скриншоты с фильмов, например, на 10-ой, 30-ой и 60-ой минутах фильма... желательно, чтобы сам этот фильм не отображался... т.е. проге подсовывается файл и она в заданную папку генерит скрины...


 
Анонимщик1   (2005-04-15 11:34) [14]

>> LA
Вот интересно, с чего эта тема стала такой популярной последнее время?


 
Eraser ©   (2005-04-15 14:14) [15]

LA

Ну это уже немного другая задача... тут внутрь avi файла лезть надо.


 
Анонимщик1   (2005-04-15 14:29) [16]

Зато в ней оверлея нет. Во всяком случае для простых avi сделать токое несложно все с помощью того же DirectShow. Хотя для более сложных случаев тоже можно, главное, чтобы декодеры были соответсвующие и давали возможность выстроить цепочку фильтров с SampleGrabber"ом. Сложность может быть в случае, когда декодер заточен под выдачу видео именно на оверлей (есть такие, сам сталкивался, хотя для них есть возможность отключать такую опцию). Еще одна проблема - непосредственная попытка соединения фильтра файла-источника и SampleGrabber"а. Дело в том, что IntelligentConnect не всегда правильно понимает, что о него требуется, и подсовывает соединение с граббером через аудиоконтакт, например. Ну, в таком случае можно либо вручную строить весь граф, либо, если есть желание помучиться, сделать файлу Render, потом убрать аудиоветвь, найти VideoRenderer, и вместо него подставить соединение с SampleGrabber"ом, а затем все сливать на NullRenderer. Сам же файл проигрывать не нужно, достаточно только позиционироваться с помощью интерфейса IMediaSeeking, а, чтобы при проигрывании не было лишних кадров, вызвать метод ISampleGrabber"а - SetOneShot(TRUE).


 
LA   (2005-04-16 20:57) [17]

это все, конечно, хорошо... только вот слова оверлей, DirectShow, SampleGrabber ничего мне не говорят (разве лишь говорят то, что где-то я их уже слышал) :(... может быть имеется уже готовый код, который это все делает?


 
Eraser ©   (2005-04-17 00:26) [18]

LA

Поддерживаю!


 
Анонимщик1   (2005-04-17 22:39) [19]

Есть, кончено. У меня.


 
Анонимщик1   (2005-04-18 10:51) [20]

Код я написал под ваш заказ и в боевых условиях не тестировал.
Поэтому вылавливайте глюки сами. Понимание кода - тоже ваша проблема, когда поймете, попробуйте переделать с использованием DSPack"а - выйдет проще.
Проект состоит из dpr-файла:

program SetMediaPos_Sample;

uses
 Forms,
 main in "main.pas" {Form1};

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.


И одного pas-модуля c dfm-ом. Я использовал библиотеку RX, так что, если у вас ее нет - не взыщите. Да, забыл сказать, что делает программа: она позволяет выбирать avi-файл (другие форматы тоже, в принципе, не исключаются, но, как я уже говорил на два поста выше, с ними могут быть проблемы), задавать, в миллисекундах время стоп-кадров, и задавать директорию, в которую эти самые стоп-кадры будут складироваться.
Итак, main.dfm:

object Form1: TForm1
 Left = 192
 Top = 107
 Width = 755
 Height = 480
 Caption = "Set Media Position And Get Cadrs"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 Menu = MainMenu1
 OldCreateOrder = False
 OnCreate = FormCreate
 OnDestroy = FormDestroy
 PixelsPerInch = 96
 TextHeight = 13
 object Label1: TLabel
   Left = 0
   Top = 0
   Width = 747
   Height = 13
   Align = alTop
 end
 object Label2: TLabel
   Left = 323
   Top = 22
   Width = 85
   Height = 13
   Caption = "Destination Folfer:"
 end
 object DBGridEh1: TDBGridEh
   Left = 0
   Top = 13
   Width = 320
   Height = 421
   Align = alLeft
   DataSource = DataSource1
   Flat = True
   FooterColor = clWindow
   FooterFont.Charset = DEFAULT_CHARSET
   FooterFont.Color = clWindowText
   FooterFont.Height = -11
   FooterFont.Name = "MS Sans Serif"
   FooterFont.Style = []
   TabOrder = 0
   TitleFont.Charset = DEFAULT_CHARSET
   TitleFont.Color = clWindowText
   TitleFont.Height = -11
   TitleFont.Name = "MS Sans Serif"
   TitleFont.Style = []
   Columns = <
     item
       EditButtons = <>
       FieldName = "StopCadr"
       Footers = <>
       Title.Alignment = taCenter
       Title.Caption = "&#209;&#242;&#238;&#239;-&#234;&#224;&#228;&#240;&#251;, &#236;&#232;&#235;&#235;&#232;&#241;&#229;&#234;&#243;&#237;&#228;&#251;"
       Width = 264
     end>
 end
 object DirectoryEdit1: TDirectoryEdit
   Left = 412
   Top = 18
   Width = 327
   Height = 21
   NumGlyphs = 1
   TabOrder = 1
 end
 object BitBtn1: TBitBtn
   Left = 323
   Top = 64
   Width = 75
   Height = 25
   Caption = "&Run"
   TabOrder = 2
   OnClick = BitBtn1Click
   Glyph.Data = {
     76010000424D7601000000000000760000002800000020000000100000000100
     04000000000000010000120B0000120B00001000000000000000000000000000
     800000800000008080008000000080008000808000007F7F7F00BFBFBF000000
     FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF00333333000000
     033333FFFF77777773F330000077777770333777773FFFFFF733077777000000
     03337F3F3F777777733F0797A770003333007F737337773F3377077777778803
     30807F333333337FF73707888887880007707F3FFFF333777F37070000878807
     07807F777733337F7F3707888887880808807F333333337F7F37077777778800
     08807F333FFF337773F7088800088803308073FF777FFF733737300008000033
     33003777737777333377333080333333333333F7373333333333300803333333
     33333773733333333333088033333333333373F7F33333333333308033333333
     3333373733333333333333033333333333333373333333333333}
   NumGlyphs = 2
 end
 object MainMenu1: TMainMenu
   Left = 14
   Top = 32
   object File1: TMenuItem
     Caption = "&File"
     object Load1: TMenuItem
       Caption = "&Load ..."
       OnClick = Load1Click
     end
   end
 end
 object OpenDialog1: TOpenDialog
   Filter = "AVI-files|*.avi|All files|*.*"
   Left = 46
   Top = 32
 end
 object RxMemoryData1: TRxMemoryData
   Active = True
   FieldDefs = <
     item
       Name = "StopCadr"
       DataType = ftLargeint
     end>
   Left = 14
   Top = 66
   object RxMemoryData1StopCadr: TLargeintField
     FieldName = "StopCadr"
   end
 end
 object DataSource1: TDataSource
   DataSet = RxMemoryData1
   Left = 46
   Top = 66
 end
end


 
Анонимщик1   (2005-04-18 10:55) [21]

main.pas:

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus, StdCtrls, DB, Grids, DBGridEh, RxMemDS, Mask, ToolEdit,
 Buttons;

type
 TForm1 = class(TForm)
   Label1: TLabel;
   MainMenu1: TMainMenu;
   File1: TMenuItem;
   Load1: TMenuItem;
   OpenDialog1: TOpenDialog;
   RxMemoryData1: TRxMemoryData;
   DBGridEh1: TDBGridEh;
   DataSource1: TDataSource;
   DirectoryEdit1: TDirectoryEdit;
   Label2: TLabel;
   BitBtn1: TBitBtn;
   RxMemoryData1StopCadr: TLargeintField;
   procedure Load1Click(Sender: TObject);
   procedure BitBtn1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
   procedure FullProcessing;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses ActiveX, DirectShow9;

var
 currFileName: String = "";
 pSampleGrabber: ISampleGrabber;

type
 TGrabCB = class(TComponent, ISampleGrabberCB)
 private
   function SampleCB(SampleTime: Double; pSample: IMediaSample): HRESULT; stdcall;
   function BufferCB(SampleTime: Double; pBuffer: PByte; BufferLen: Longint): HRESULT; stdcall;
   function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;
   function _AddRef: Integer; stdcall;
   function _Release: Integer; stdcall;
           end;

function TGrabCB.QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;
begin
 Result := inherited QueryInterface(IID, Obj);
end;

function TGrabCB._AddRef: Integer; stdcall;
begin
 Result := 2;
end;

function TGrabCB._Release: Integer; stdcall;
begin
 Result := 1;
end;

function TGrabCB.SampleCB(SampleTime: Double; pSample: IMediaSample): HRESULT;
begin
 ShowMessage("&#202;&#243;-&#234;&#243;!");
end;


 
Анонимщик1   (2005-04-18 10:56) [22]

Продолжение:

function TGrabCB.BufferCB(SampleTime: Double; pBuffer: PByte; BufferLen: Longint): HRESULT; stdcall;

 function GetDIBLineSize(BitCount, Width: Integer): Integer;
 begin
   if BitCount = 15 then BitCount := 16;
   Result := ((BitCount * Width + 31) div 32) * 4;
 end;

var
 Bmp         : TBitmap;
 BitmapHandle: HBitmap;
 MediaType   : TAMMediaType;
 BiHeaderPtr : PBitmapInfoHeader;
 DIBPtr      : Pointer;
 DIBSize     : LongInt;
 errorCode: Integer;
 newMediaType: TAMMediaType;
 BMPInfo: TBitmapInfo;
begin
 Result := pSampleGrabber.GetConnectedMediaType(MediaType);
 if Result <> S_OK then exit;

 try
   Bmp := TBitmap.Create;
   if not IsEqualGUID(MediaType.majortype, MEDIATYPE_VIDEO) then exit;
   BiHeaderPtr := nil;
   if IsEqualGUID(MediaType.formattype, FORMAT_VideoInfo) then begin
     if MediaType.cbFormat = SizeOf(TVideoInfoHeader) then
       BIHeaderPtr := @(PVideoInfoHeader(MediaType.pbFormat)^.bmiHeader);
   end else if IsEqualGUID(MediaType.formattype, FORMAT_VideoInfo2) then begin
     if MediaType.cbFormat = SizeOf(TVideoInfoHeader2) then
       BIHeaderPtr := @(PVideoInfoHeader2(MediaType.pbFormat)^.bmiHeader);
   end;

   if not Assigned(BiHeaderPtr) then begin
     New(BiHeaderPtr);
     BiHeaderPtr.biSize := SizeOf(TVideoInfoHeader);
     BiHeaderPtr.biWidth := PVideoInfoHeader(MediaType.pbFormat).bmiHeader.biWidth;
     BiHeaderPtr.biHeight := PVideoInfoHeader(MediaType.pbFormat).bmiHeader.biHeight;
     BiHeaderPtr.biPlanes := PVideoInfoHeader(MediaType.pbFormat).bmiHeader.biPlanes;
     BiHeaderPtr.biBitCount := PVideoInfoHeader(MediaType.pbFormat).bmiHeader.biBitCount;
   end;

   BitmapHandle := CreateDIBSection(0, PBitmapInfo(BIHeaderPtr)^, DIB_RGB_COLORS, DIBPtr, 0, 0);

   if BitmapHandle <> 0 then begin
     try

       if DIBPtr = nil then exit;

       DIBSize := BIHeaderPtr.biSizeImage;
       if DIBSize = 0 then DIBSize := GetDIBLineSize(BIHeaderPtr.biBitCount, BIHeaderPtr.biWidth) *
                                       BIHeaderPtr.biHeight * BIHeaderPtr.biPlanes;

       if not Assigned(pBuffer) then begin
         BufferLen := 0;
         if (pSampleGrabber.GetCurrentBuffer(BufferLen, 0) <> S_OK) or (BufferLen <= 0) then exit;
         if BufferLen > DIBSize then BufferLen := DIBSize;
         if pSampleGrabber.GetCurrentBuffer(BufferLen, DIBPtr) <> S_OK then exit;
       end else begin
         if BufferLen > DIBSize then BufferLen := DIBSize;
         Move(pBuffer^, DIBPtr^, BufferLen);
       end;
       Bmp.Handle := BitmapHandle;

     finally
       if Bmp.Handle <> BitmapHandle
       then DeleteObject(BitmapHandle)
       else Bmp.SaveToFile(currFileName);
     end;
   end;

 finally

   if MediaType.cbFormat <> 0 then begin
     CoTaskMemFree(MediaType.pbFormat);
     MediaType.cbFormat := 0;
     MediaType.pbFormat := 0;
   end;
   if MediaType.pUnk <> nil then MediaType.pUnk := nil;

   Bmp.Free;

 end;

 Result := S_OK;
end;

function GetPin(pFilter: IBaseFilter; pinDir: PIN_DIRECTION): IPin;
var
 bFound: boolean;
 pEnum : IEnumPins;
 pPin  : IPin;

 PinDirThis: PIN_DIRECTION;

begin
 bFound := false;
 pFilter.EnumPins(pEnum);
 while (pEnum.Next(1, pPin, 0) = S_OK ) do
 begin
   pPin.QueryDirection(PinDirThis);
   if (pinDir = PinDirThis) then begin
     bFound := true;
     break;
   end;
 end;
 pEnum.Reset;

 if bFound
 then Result := pPin
 else result := nil;

end;

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

procedure TForm1.FormDestroy(Sender: TObject);
begin
 CoUninitialize;
end;

procedure TForm1.Load1Click(Sender: TObject);
begin
 if not OpenDialog1.Execute then exit;
 Label1.Caption := OpenDialog1.FileName;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
 fName: String;
begin
 if Label1.Caption = "" then raise Exception.Create("&#205;&#229; &#231;&#224;&#228;&#224;&#237;&#238; &#232;&#236;&#255; &#226;&#232;&#228;&#229;&#238;&#244;&#224;&#233;&#235;&#224;");
 if not FileExists(Label1.Caption) then raise Exception.Create("&#194;&#232;&#228;&#229;&#238;&#244;&#224;&#233;&#235; &#237;&#229; &#237;&#224;&#233;&#228;&#229;&#237;");
 if DirectoryEdit1.Text = "" then raise Exception.Create("&#205;&#229; &#231;&#224;&#228;&#224;&#237;&#238; &#232;&#236;&#255; &#228;&#232;&#240;&#229;&#234;&#242;&#238;&#240;&#232;&#232; &#237;&#224;&#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255;");
 if not DirectoryExists(DirectoryEdit1.Text) then raise Exception.Create("&#196;&#232;&#240;&#229;&#234;&#242;&#238;&#240;&#232;&#255; &#237;&#224;&#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255; &#237;&#229; &#237;&#224;&#233;&#228;&#229;&#237;&#224;");
 if RxMemoryData1.IsEmpty then raise Exception.Create("&#205;&#229; &#231;&#224;&#228;&#224;&#237;&#238; &#226;&#240;&#229;&#236;&#255; &#241;&#242;&#238;&#239;-&#234;&#224;&#228;&#240;&#238;&#226;");
 RxMemoryData1.First;
 while not RxMemoryData1.Eof do
 begin
   fName := DirectoryEdit1.Text + "\" + RxMemoryData1StopCadr.AsString + ".bmp";
   if FileExists(fName) then raise Exception.Create("&#212;&#224;&#233;&#235; " + fName + " &#243;&#230;&#229; &#241;&#243;&#249;&#229;&#241;&#242;&#226;&#243;&#229;&#242;. &#206;&#242;&#236;&#229;&#237;&#224; &#238;&#239;&#229;&#240;&#224;&#246;&#232;&#232;.");
   RxMemoryData1.Next;
 end;
 FullProcessing;
end;


 
Анонимщик1   (2005-04-18 10:59) [23]

Начало окончания:

procedure TForm1.FullProcessing;
var
 hr: HRESULT;
 rt: REFERENCE_TIME;
 evCode: Integer;

 pGraphBuilder        : IGraphBuilder;
 pSourceFile          : IBaseFilter;
 pMediaControl        : IMediaControl;
 pMediaEvent          : IMediaEvent;
 pMediaSeeking        : IMediaSeeking;
 pNullRenderer        : IBaseFilter;

 pSourceOutPin        : IPin;
 pSampleGrabberInPin  : IPin;
 pSampleGrabberOutPin : IPin;
 pNullRenderInPin     : IPin;

 pGrabCB              : TGrabCB;

 length               : LongLong;
begin
 Enabled := false;
 pGraphBuilder         := nil;
 pSourceFile           := nil;
 pMediaControl         := nil;
 pMediaEvent           := nil;
 pMediaSeeking         := nil;
 pNullRenderer         := nil;

 pSourceOutPin         := nil;
 pSampleGrabberInPin   := nil;
 pSampleGrabberOutPin  := nil;
 pNullRenderInPin      := nil;

 pGrabCB               := nil;


 
Анонимщик1   (2005-04-18 11:03) [24]

Середина окончания:

 try
   hr := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC, IID_IGraphBuilder, pGraphBuilder);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#241;&#238;&#231;&#228;&#224;&#242;&#252; GraphBuilder");

   hr := CoCreateInstance(CLSID_SampleGrabber, nil, CLSCTX_INPROC, IID_ISampleGrabber, pSampleGrabber);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#241;&#238;&#231;&#228;&#224;&#242;&#252; SampleGrabber");

   pGrabCB := TGrabCB.Create(nil);
   if not Assigned(pGrabCB) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#241;&#238;&#231;&#228;&#224;&#242;&#252; SampleGrabberCB");

   hr := pSampleGrabber.SetCallback(pGrabCB, 1);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#232;&#242;&#252; callback - &#244;&#243;&#237;&#234;&#246;&#232;&#254;");

   pSampleGrabber.SetOneShot(TRUE);

   hr := CoCreateInstance(CLSID_NullRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter, pNullRenderer);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#241;&#238;&#231;&#228;&#224;&#242;&#252; NullRenderer");

   hr := pGraphBuilder.QueryInterface(IID_IMediaControl, pMediaControl);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#232;&#237;&#242;&#229;&#240;&#244;&#229;&#233;&#241; MediaControl");

   hr := pGraphBuilder.QueryInterface(IID_IMediaEvent, pMediaEvent);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#232;&#237;&#242;&#229;&#240;&#244;&#229;&#233;&#241; MediaEvent");

   hr := pGraphBuilder.AddSourceFilter(StringToOleStr(Label1.Caption), "", pSourceFile);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#228;&#238;&#225;&#224;&#226;&#232;&#242;&#252; &#244;&#232;&#235;&#252;&#242;&#240; &#232;&#241;&#242;&#238;&#247;&#237;&#232;&#234;&#224;");

   hr := pGraphBuilder.AddFilter(pSampleGrabber as IBaseFilter, "Sample Grabber");
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#228;&#238;&#225;&#224;&#226;&#232;&#242;&#252; SampleGrabber");

   hr := pGraphBuilder.AddFilter(pNullRenderer, "Null Renderer");
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#228;&#238;&#225;&#224;&#226;&#232;&#242;&#252; NullRenderer");

   pSourceOutPin := GetPin(pSourceFile, PINDIR_OUTPUT);
   if not Assigned(pSourceOutPin) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#232;&#241;&#245;&#238;&#228;&#255;&#249;&#232;&#233; &#234;&#238;&#237;&#242;&#224;&#234;&#242; &#244;&#232;&#235;&#252;&#242;&#240;&#224; &#232;&#241;&#242;&#238;&#247;&#237;&#232;&#234;&#224;");

   pSampleGrabberInPin := GetPin(pSampleGrabber as IBaseFilter, PINDIR_INPUT);
   if not Assigned(pSampleGrabberInPin) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#226;&#245;&#238;&#228;&#255;&#249;&#232;&#233; &#234;&#238;&#237;&#242;&#224;&#234;&#242; &#231;&#224;&#227;&#240;&#224;&#225;&#224;&#241;&#242;&#238;&#240;&#224;");

   hr := pGraphBuilder.Connect(pSourceOutPin, pSampleGrabberInPin);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#241;&#238;&#229;&#228;&#232;&#237;&#232;&#242;&#252; &#244;&#232;&#235;&#252;&#242;&#240; &#232;&#241;&#242;&#238;&#247;&#237;&#232;&#234;&#224; &#232; SampleGraber");

   pSampleGrabberOutPin := GetPin(pSampleGrabber as IBaseFilter, PINDIR_OUTPUT);
   if not Assigned(pSampleGrabberOutPin) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#232;&#241;&#245;&#238;&#228;&#255;&#249;&#232;&#233; &#234;&#238;&#237;&#242;&#224;&#234;&#242; &#231;&#224;&#227;&#240;&#224;&#225;&#224;&#241;&#242;&#238;&#240;&#224;");

   pNullRenderInPin := GetPin(pNullRenderer, PINDIR_INPUT);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#226;&#245;&#238;&#228;&#255;&#249;&#232;&#233; &#234;&#238;&#237;&#242;&#224;&#234;&#242; NullRenderer""&#224;");

   hr := pGraphBuilder.Connect(pSampleGrabberOutPin, pNullRenderInPin);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#241;&#238;&#229;&#228;&#232;&#237;&#232;&#242;&#252; SampleGraber &#232; NullRenderer");

   hr := pGraphBuilder.QueryInterface(IID_IMediaSeeking, pMediaSeeking);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#232;&#237;&#242;&#229;&#240;&#244;&#229;&#233;&#241; MediaSeeking");

   hr := pMediaSeeking.SetTimeFormat(TIME_FORMAT_MEDIA_TIME);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#243;&#241;&#242;&#224;&#237;&#238;&#226;&#232;&#242;&#252; &#231;&#224;&#225;&#232;&#242;&#251;&#233; &#236;&#237;&#238;&#254; &#244;&#238;&#240;&#236;&#224;&#242; &#226;&#240;&#229;&#236;&#229;&#237;&#232;");

   hr := pMediaSeeking.GetDuration(length);
   if FAILED(hr) then raise Exception.Create("&#205;&#229; &#243;&#228;&#224;&#229;&#242;&#241;&#255; &#239;&#238;&#235;&#243;&#247;&#232;&#242;&#252; &#228;&#235;&#232;&#242;&#229;&#235;&#252;&#237;&#238;&#241;&#242;&#252;");


 
Анонимщик1   (2005-04-18 11:05) [25]

Конец окончания:

   RxMemoryData1.First;
   while not RxMemoryData1.Eof do
   begin
     currFileName := DirectoryEdit1.Text + "\" + RxMemoryData1StopCadr.AsString + ".bmp";
     rt := RxMemoryData1StopCadr.AsLargeInt * 10000;
     if rt <= length then begin
       hr := pMediaSeeking.SetPositions(rt, AM_SEEKING_AbsolutePositioning, rt, AM_SEEKING_AbsolutePositioning);
       if FAILED(hr) then raise Exception.Create("&#205;&#229; &#236;&#238;&#227;&#243; &#241;&#239;&#238;&#231;&#232;&#246;&#232;&#238;&#237;&#232;&#240;&#238;&#226;&#224;&#242;&#252;&#241;&#255; &#237;&#224; &#234;&#224;&#228;&#240;&#229; &#241;&#238; &#226;&#240;&#229;&#236;&#229;&#237;&#229;&#236; " + IntToStr(RxMemoryData1StopCadr.AsInteger) + " &#236;&#232;&#235;&#235;&#232;&#241;&#229;&#234;&#243;&#237;&#228;");
       hr := pMediaControl.Run;
       if FAILED(hr) then raise Exception.Create("&#205;&#229; &#236;&#238;&#227;&#243; &#231;&#224;&#239;&#243;&#241;&#242;&#232;&#242;&#252; &#239;&#240;&#238;&#232;&#227;&#240;&#251;&#226;&#224;&#237;&#232;&#229; &#237;&#224; &#234;&#224;&#228;&#240;&#229; &#241;&#238; &#226;&#240;&#229;&#236;&#229;&#237;&#229;&#236; " + IntToStr(RxMemoryData1StopCadr.AsInteger) + " &#236;&#232;&#235;&#235;&#232;&#241;&#229;&#234;&#243;&#237;&#228;");
       pMediaEvent.WaitForCompletion(INFINITE, evCode);
     end;  
     RxMemoryData1.Next;
     Application.ProcessMessages;
   end;
 finally
   Enabled := true;
 end;
end;

end.


 
Анонимщик1   (2005-04-18 11:07) [26]

Это все. С зябликами разбирайтесь сами. Если будут вопросы по коду, объяснить смогу только на протяжении сегодняшнего дня.


 
Grief ©   (2005-04-20 18:34) [27]

винамп снимается и принтскрином и через DC, юзай его!


 
Eraser ©   (2005-04-22 15:42) [28]

Grief ©

Так мне общий случай нужен... а не частный.
Кстати в Win медиапелеере некоторые типы файлов снимаются принт скрином, некотрые нет... наверное декодеры разные.



Страницы: 1 вся ветка

Текущий архив: 2005.09.04;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.025 c
4-1121679434
Bobby
2005-07-18 13:37
2005.09.04
Еще раз про PE. А для анализа PE-файла его маппить?


6-1116523854
Dj_Dreamer
2005-05-19 21:30
2005.09.04
VPN! Организовать передачу файлов


11-1106307599
<Falcon>
2005-01-21 14:39
2005.09.04
Работа с TBitmap в KOL


3-1121776635
TAN_K
2005-07-19 16:37
2005.09.04
QuickReport - итог вычисляемого поля


14-1123706290
Дима
2005-08-11 00:38
2005.09.04
Хочу заказать базу данных