Як написати свій MediaPlayer

Майстра хочу написати свій MediaPlayer, дайте посилання де взяти описи цього процесу.

В принципі, все дуже просто і нічого конкретного щодо написання з літератури не існує. Є тільки в книгах розбір простих медіаплеєрів, але всі вони засновані на стандартних можливостях TMediaPlayer. Суть у тому, що потрібно знайти компонент, на якому буде засновано медіалпеєр. Далі, береш будь-який медіаплеєр, хоч той самий стандартний, дивишся, що в ньому є і пишеш такий самий. Я не вірю, що все це спричинить труднощі. Проблеми зазвичай викликають якісь окремі реалізації. Звичайно, конкретніші питання ти завжди можеш поставити на форумі - на них якось краще відповідають.

Mihey, А який компонент ти порадиш?

Я б порадив не морочитися готовим компонентом, а написати плеєр на 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; var v: TVideoRenderer; begin result := true; try v := TVideoRenderer.Create; try v.Play(fn, wnd); finally v.free; end; except result := false; end; end;

ConstructorTVideoRenderer.Create; почати CoInitialize(nil); // Створіть менеджер графів фільтрів і запит для інтерфейсів. 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); кінець;

деструктор TVideoRenderer.Destroy; begin FEvent := nil; FGraph := нуль; FMediaControl.Stop; FMediaControl := нуль; FVidWin.put_Visible(false); FVidWin := нуль; CoUninitialize; кінець;

procedure TVideoRenderer.Play(const fn: рядок; wnd: HWND); var wc: масив [0..1023] WideChar; r: trect; код: ціле; begin StringToWideChar(fn, wc, length(wc)); FGraph.RenderFile(wc, nil); //Встановити вікно відео. FVidWin.put_Owner(wnd); FVidWin.put_WindowStyle(WS_CHILD або WS_CLIPSIBLINGS); GetClientRect(wnd, r); FVidWin.SetWindowPosition(0, 0, r.right, r.bottom); FMediaControl.Run; FEvent.WaitForCompletion(INFINITE, код);

методу Play передаешь Handle своей формы и усе готово.

Тільки тут не передбачено управління потоком. Хоча його можна організувати удалив FEvent.WaitForCompletion(INFINITE , Code); і повесив на баттони відповідно FMediaControl.Run, FMediaControl.stop, FMediaControl.pause;

Відповідно, необхідно завантажити заголовки DirectX з http://www.delphi-jedi.org/Jedi:GRFGRAPHICS:493970

А можна без DirectShow? Щоб визначити тип файлу, створіть стрім, завантажте кодек і виберіть з його виходом фрейми, які послідовно виводите. Такое взагалі можливо?

В принципе, можливо. Раз на Луну летают, значит возможно :).Но, по-моему, це до предела трудно, а если неподобається DirectShow (чому, якщо не секрет?), тобто є Video for Windows. (На ньому, на рідному VirtualDub працює)

кротПробував я цю штуку в іграшку заштовхати - млинець гальмувала як хрін знає що. Потім все-таки зробив наведений вище модуль і стало прийнятно.