Ниже привожу полный код проекта с подробными комментариями.unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, directshow9, ActiveX, ExtCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
Timer1: TTimer;
CheckBox1: TCheckBox;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
//описываем будущие интерфейсы FGraphBuilder: IGraphBuilder = Nil;
//интерфейс графа FCaptureGraphBuilder: ICaptureGraphBuilder2 = nil;
//вспомагательный интерфейс FMediaControl: IMediaControl = Nil;
//интерфейс управления воспроизведением в графе FVideoWindow: IVideoWindow = Nil;
// интерфейс управления окном вывода видео FAudioRender : IBaseFilter = nil;
//интерфейс фильтра вывода звука FVideoRender : IBaseFilter = nil;
//интерфейс фильтра вывода видео fl_SrcFile : IBaseFilter = nil;
//интерфейс фильтра источника //имя файла для записи FileName:String;
//описываем интерфейсы фильтра VMR (VideoMixingRenderer) FConfig : IVMRFilterConfig;
// Интерфейс IVMRFilterConfig используется, чтобы сконфигурировать режим смешивания FBitmap : IVMRMixerBitmap;
//Интерфейс IVMRMixerBitmap дает возможность приложению смешать статическое изображение VMRBitmap : VMRALPHABITMAP;
//Структура, используемая для управления смешиванием Bitmap: TBitmap;
// объект BitMap w,h: integer;
//ширина и высота буквы x,y:integer;
//координаты положения окна текста a,b:integer;
//ширина и высота окна вывода видеоimplementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//освобождаем подключенные интерфейсы if Assigned(FMediaControl) then FMediaControl:= NIL;
if Assigned(FVideoWindow) then FVideoWindow := NIL;
if Assigned(FAudioRender) then FAudioRender := nil;
if Assigned(FVideoRender) then FVideoRender:= nil;
if Assigned(FCaptureGraphBuilder) then FCaptureGraphBuilder := NIL;
if Assigned(FGraphBuilder) then FGraphBuilder:= NIL;
if Assigned(FBitmap) then FBitmap:= NIL;
//создаем объект для построения графа фильтров FGraphBuilderCoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, FGraphBuilder);
//создаем объект для построения графа захвата FCaptureGraphBuilderCoCreateInstance(CLSID_CaptureGraphBuilder2, NIL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, FCaptureGraphBuilder);
//указываем графу захвата граф фильтровFCaptureGraphBuilder.SetFiltergraph(FGraphBuilder);
//вызываем диалог открытия файла видеоif not(OpenDialog1.Execute) then exit;
filename:=OpenDialog1.FileName;
//добавляем в граф фильтр источника видео и загружаем в него видео файлFGraphBuilder.AddSourceFilter(StringToOleStr(FileName),'',fl_SrcFile);
//создаем объект для фильтра вывода звука FAudioRenderCoCreateInstance(CLSID_AudioRender, nil, CLSCTX_INPROC, IID_IBaseFilter, FAudioRender);
//добавляем его в графFGraphBuilder.AddFilter(FAudioRender, 'DirectSound Audio Renderer');
//создаем объект для фильтра вывода видео FVideoRender он же будет микшировать наше видео с изображением текстаCoCreateInstance(CLSID_VideoMixingRenderer, nil, CLSCTX_INPROC, IID_IBaseFilter, FVideoRender);
//добавляем его в графFGraphBuilder.AddFilter(FVideoRender, 'Video Renderer');
//получаем интерфейс конфигурации смешиванияif failed(FVideoRender.QueryInterface(IID_IVMRFilterConfig, FConfig)) then exit;
//задаем поток для смешиванияFConfig.SetNumberOfStreams(1);
//получаем интерфейс для смешивания изображенияif failed(FVideoRender.QueryInterface(IID_IVMRMixerBitmap, FBitmap)) then exit;
//строим ветвь графа в зависимости от расширения файла видеоwith FCaptureGraphBuilder do
begin
//проверяем, если это wmvif lowercase(ExtractFileExt(filename))='.wmv' then begin
//то строим такой граф if FAILED(RenderStream(nil, @MEDIATYPE_Video, fl_SrcFile, nil , FVideoRender)) then
Begin
ShowMessage('Внимание! Произошла ошибка при инициализации видео');
Exit;
End;
//иначе строим такой графend else begin
if FAILED(RenderStream(nil, @MEDIATYPE_Stream, fl_SrcFile, nil , FVideoRender)) then
Begin
ShowMessage('Внимание! Произошла ошибка при инициализации видео');
Exit;
End;
end;
//строим ветвь графа для вывода звука if FAILED(RenderStream(nil, nil, fl_SrcFile, nil, FAudioRender)) then
Begin
ShowMessage('Внимание! Произошла ошибка при инициализации аудио');
Exit;
End;
end;
//получаем интерфейс управления воспроизведением ImediaControl FGraphBuilder.QueryInterface(IID_IMediaControl, FMediaControl);
//получаем интерфейс управления окном видео IVideoWindow FGraphBuilder.QueryInterface(IID_IVideoWindow, FVideoWindow);
//запускаем на воспроизведение FMediaControl.Run;
end;
//установка чебокса для наложения текстаprocedure TForm1.CheckBox1Click(Sender: TObject);
begin
//проверяем, если воспроизведение идетif Assigned(FVideoWindow)then begin
//то получаем размеры окна воспроизведения FVideoWindow.get_Width(a) ;
FVideoWindow.get_Height(b);
//и задаем размеры bitmap для наложения текста Bitmap.Width:= a;
Bitmap.Height:= b;
//задаем максимальное значение для трекбаров,
//которые будут регулировать положение текста на экране TrackBar1.Max:=a;
TrackBar2.Max:=b;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//освобождаем созданные интерфейсы FMediaControl:= Nil;
//интерфейс управления воспроизведением в графе FVideoWindow:= Nil;
// интерфейс управления окном вывода видео FAudioRender := nil;
//интерфейс фильтра вывода звука FVideoRender := nil;
//интерфейс фильтра вывода видео fl_SrcFile := nil;
//интерфейс фильтра источника FBitmap:= NIL;
// Интерфейс IVMRMixerBitmap FCaptureGraphBuilder:= nil;
//вспомагательный интерфейс FGraphBuilder:= Nil;
//интерфейс графа CoUninitialize;
Bitmap.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//инициализируем com интерфейсCoInitialize(nil);
// Создаем BitMap и задаем настройки для текста, который будем накладывать на видео Bitmap:= TBitmap.Create;
//цвет кисти Bitmap.Canvas.Brush.Color:= clBlack;
//Шрифт Bitmap.Canvas.Font.Name:= 'arial';
//размер шрифта Bitmap.Canvas.Font.Size:= 16;
//Начертание Bitmap.Canvas.Font.Style:= [fsBold];
//цвет шрифта Bitmap.Canvas.Font.Color:= clRed;
//размер буквы W:= Bitmap.Canvas.TextWidth('W');
H:= Bitmap.Canvas.TextHeight('W');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
alpha: single;
//прозрачность i:integer;
s:string;
//текст для микшированияbegin
//если чебокс установленif CheckBox1.Checked=false then exit;
//то очищаем bitmap, путем рисования на нем прямоугольника во весь его размер Bitmap.Canvas.Rectangle(0,0,a,b);
//задаем координаты для вывода текста x:=TrackBar1.Position;
y:=TrackBar2.Position;
//формируем текст на битмапе из строк мемо поля for i := 0 to memo1.Lines.Count-1 do
begin
//читаем строку в мемо s:=memo1.Lines.Strings[i];
//выводим на битмап Bitmap.Canvas.TextOut(x,i*20+y,s);
end;
//проверяем если интерфейс управления видео получен if Assigned(FVideoWindow)then begin
//то задаем прозрачность 0 до 1 alpha:= 1;
//обнуляем память ZeroMemory(@VMRBitmap, sizeof(VMRBitmap));
//устанавливаем флаги смесителя VMRBitmap.dwFlags := VMRBITMAP_HDC or VMRBITMAP_SRCCOLORKEY;
//устанавливаем ключевой цвет для смешивания VMRBitmap.clrSrcKey:= 0;
//задаем контекст устройства Bitmap.Canvas VMRBitmap.hdc := Bitmap.Canvas.Handle;
//задаем область источника в данном контексте устройства VMRBitmap.rSrc := Bitmap.Canvas.ClipRect;
//задаем область вывода окна
//здесь можно изменять область вывода,
//если взять числа больше 1 то изображение будет масштабироваться.
//если left взять больше чем right то изображение зеркально отразится и т.д. VMRBitmap.rDest.left := 0.0;
VMRBitmap.rDest.right := 1.0;
VMRBitmap.rDest.top := 0.0;
VMRBitmap.rDest.bottom:= 1.0;
//задаем прозрачноссть VMRBitmap.fAlpha := alpha;
//смешиаем FBitmap.SetAlphaBitmap(VMRBitmap);
end
end;
end.
Сохраняем проект и тестируем.
Кроме изменения позиции текста можно аналогично добавить изменение размера шрифта, расстояния между строками, цвет текста и т.д.