Форум: "Media";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
ВнизКак написать свой MediaPlayer Найти похожие ветки
← →
ARTEMKA (2003-09-23 12:06) [0]Мастера хочу написать свой MediaPlayer, дайте ссылочку где взять описания этого процесса.
← →
Mihey (2003-09-23 17:33) [1]В принципе, всё очень просто и ничего конкретного по процессу написания из литературы не существует. Есть только в книгах разбор простеньких медиаплееров, но все они основаны на стандартных возможностях TMediaPlayer. Суть в том, что нужно найти компонент, на котором будет основан медиалпеер. Далее, берёшь любой медиаплеер, хоть тот же стандартный, смотришь, что в нём есть и пишешь такой же. Я не верю, что всё это вызовет трудности. Трудности обычно вызывают какие-то отдельные реализации. Конечно, более конкретные вопросы ты всегда можешь задать на форуме - на них как-то лучше отвечают.
← →
XenonXX (2003-09-24 02:16) [2]Mihey,
А какой компонент ты посоветуешь?
← →
NailMan (2003-09-24 10:48) [3]Я бы посоветовал не заморачиваться готовым компонентом, а написать плеер на DirectShow, бо проще этого "компонента", данного нам Билли нет. Если юзать всякие там готовые компоненты, получится негибко и не то что хочется.
Я свой плеер(скачать можно с http://nailman.narod.ru) писал чисто на DirectShow.
Кстате для затравки вот пример модуля для рендера фильма в любом окне:
unit UTVideoPlayer;
interface
Uses
Windows,
DirectShow,
ActiveX;
TYPE
TVideoRenderer = CLASS
Private
FGraph : IGraphBuilder;
FMediaControl : IMediaControl;
FVidWin : IVideoWindow;
FEvent : IMediaEvent;
Public
Constructor Create;
Destructor Destroy; override;
Procedure Play(const fn: string; wnd: HWND);
END;
Function PlayVideo(fn:String;Wnd:HWND):Boolean;
implementation
Function PlayVideo(fn:String;Wnd:HWND):Boolean;
var
v: TVideoRenderer;
begin
result := true;
try
v := TVideoRenderer.Create;
try
v.Play(fn, wnd);
finally
v.free;
end;
except
result := false;
end;
end;
Constructor TVideoRenderer.Create;
begin
CoInitialize(nil);
// Create the filter graph manager and query for interfaces.
CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, FGraph);
FGraph.QueryInterface(IID_IMediaControl, FMediaControl);
FGraph.QueryInterface(IID_IVideoWindow, FVidWin);
FGraph.QueryInterface(IID_IMediaEventEx, FEvent);
end;
destructor TVideoRenderer.Destroy;
begin
FEvent := nil;
FGraph := nil;
FMediaControl.Stop;
FMediaControl := nil;
FVidWin.put_Visible(false);
FVidWin := nil;
CoUninitialize;
end;
procedure TVideoRenderer.Play(const fn: string; wnd: HWND);
var
wc: array[0..1023] of WideChar;
r: trect;
code: integer;
begin
StringToWideChar(fn, wc, length(wc));
FGraph.RenderFile(wc, nil);
//Set the video window.
FVidWin.put_Owner(wnd);
FVidWin.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);
GetClientRect(wnd, r);
FVidWin.SetWindowPosition(0, 0, r.right, r.bottom);
FMediaControl.Run;
FEvent.WaitForCompletion(INFINITE , Code);
end;
end.
методу Play передаешь Handle своей формы и усе готово.
Только здесь не предусмотрено управление потоком. Хотя его можно организовать удалив FEvent.WaitForCompletion(INFINITE , Code);
и повесив на баттоны соответсвенно FMediaControl.Run, FMediaControl.stop, FMediaControl.pause;
Соответсвенно потребуется скачать заголовки DirectX с http://www.delphi-jedi.org/Jedi:GRFGRAPHICS:493970
← →
XenonXX (2003-09-24 12:57) [4]А можно без DirectShow? То есть определить тип файла, создать стрим, подгрузить кодек и брать с его вихода фрейми, которие последовательно виводить. Такое вообще возможно?
← →
крот (2003-09-24 13:20) [5]В принципе, возможно. Раз на Луну летают, значит возможно :).Но, по-моему, это до предела трудно, а если не нравиться DirectShow (почему, если не секрет?), то еще есть Video for Windows. (На ем, на родимом VirtualDub работает)
← →
NailMan (2003-09-24 14:40) [6]XenonXX ©
Можно конечно. Я вот определялово AVI-шных головешек в плеере сделал, ничего трудного, можно и стримы создавать, да больно геморройно все это делать. Тем более сделать пайп круче чем мелкософтский(как по гибкости, так и по скорости) очень и очень сложно. Лучше юзать DShow и максимально использовать его возможности.
Я вот и 30% еще не заюзал. DVD-шку вот хочу прикрутить, а то достало смотреть дивидишки всяким калом навроде WinDVD, который постоянно отрубает ТВ-выход на моем жефорсе. Тем более DVD заюзать без DShow нереально.
крот
Пробовал я эту штуку в игрушку затолкать - блин тормозила как хрен знает што. Потом все таки сделал вышеприведенный модуль и стало приемлемо.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c