Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Media";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.01 c
14-1123743417
Makhanev A.S.
2005-08-11 10:56
2005.09.04
Code Insight и тормоза


4-1121344478
viper
2005-07-14 16:34
2005.09.04
Время загрузки


14-1123669090
ocean
2005-08-10 14:18
2005.09.04
Надо передохнуть


1-1123825518
***_Diman_***
2005-08-12 09:45
2005.09.04
ошибка форматирования (число->строка)


14-1123924242
PZ
2005-08-13 13:10
2005.09.04
Чтобы это значило ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский