Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-93729
Санёк
2003-11-19 16:50
2004.01.29
Перехват на функцию CreateDC


3-93349
Jane
2004-01-02 18:23
2004.01.29
В DBGrid не отображается знаечние поля.


1-93465
INTAARI
2004-01-12 10:47
2004.01.29
Как правильно вести log файл программы???


1-93444
baataars
2004-01-13 17:11
2004.01.29
ООП - вызов родительской функции


3-93381
kirov_igor
2003-12-30 00:38
2004.01.29
Выбор значений в gride ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский