Вверх ↑
Этот топик читают: Гость
Ответов: 204
Рейтинг: 2
#1: 2015-09-29 22:33:43 ЛС | профиль | цитата
В компоненте DirectShowPlayer присутствует лишь одно событие: onEndPlay
Для моих нужд этого мало.
Хотелось бы дополнить компонент событиями:
1. onPlay - начало проигрывания(важно чтобы он срабатывал не в момент попытки открыть файл, а когда уже начинает его непосредственно проигрывать!).
2. Error - ошибка при попытке открыть, загрузить файл

Ну и можно еще всего прочего если не лень!

Более детально для чего и почему мне это надо, прочитать можно вот тут: ТЫК

На первый, дилетантский взгляд не очень сложное зданьице для знающего человека. Озвучивайте, предлагайте цены! Если не слишком алчны, то вам денюшка на ватрушки с майонезом. Нам всем обновленный компонент!

Да, и в личку не пишите от туда мне сообщения не приходят! Пишите здесь не стесняйтесь!
карма: 1

0
vip
#1.1контекстная реклама от партнеров
Ответов: 16884
Рейтинг: 1239
#2: 2015-09-30 12:12:58 ЛС | профиль | цитата
Вопрос к имеющим права : Сколько, с Вашего молчаливого согласия, можно наплодить тем про одно и тоже ?
Я могу только отправить в баньку месяца на три. Не хотелось-бы.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#3: 2015-09-30 12:19:33 ЛС | профиль | цитата
Tad писал(а):
с Вашего молчаливого согласия, можно наплодить тем про одно и тоже ?

Его сюда отправили специально. Может кто подпишется за вознаграждение сделать. Просто ту тему сюда тоже кто-то переместил
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#4: 2015-09-30 12:24:51 ЛС | профиль | цитата
Все эти вопросы можно было решить в самой первой - Перестал работать DirectShowPlayer, а не создавать мусор.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Разработчик
Ответов: 26066
Рейтинг: 2120
#5: 2015-09-30 12:42:54 ЛС | профиль | цитата
Tad писал(а):
Все эти вопросы можно было решить в самой первой

Там ему посоветовали создать тему в куплю/продам, он ее и создал. А вот кто потом переправил тут тему сюда, это остается загадкой
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#6: 2015-09-30 13:15:29 ЛС | профиль | цитата
nesco писал(а):
Там ему посоветовали создать тему в куплю/продам
Ну это ему посоветовали уже в следующей - Опять вопрос по компоненту DirectShowPlayer!
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 204
Рейтинг: 2
#7: 2015-09-30 19:11:30 ЛС | профиль | цитата
Эхъ, хотел как лучше, а получилось как всегда!

Tad писал(а):
Ну это ему посоветовали уже в следующей - Опять вопрос по компоненту DirectShowPlayer!


Ну ведь я же сразу написал в той, новой теме что сомневаюсь правильно ли поступаю и почему её все же создал тоже написал! А потом как верно заметил nesco меня отправили сюда и сюда же кинули и ту тему, вот и получился винегрет!

Мне вот другое интересно, два мега-пупер-супер-друпер-програмёра нашего форума, как кисейные барышни обсуждают фен-шуй сортировки тем, вместо того чтобы отписаться непосредственно по теме вопроса или поучаствовать в решении задачи! И денежку заработать и всем пользователям хорошо сделать!
А нет! Влияние звезды Бетельгейзе и созвездия Ориона в целом на правильное расположение тем, куда более важно для тонкой душевной организации утомленного програмёра!

Эхъ, пойду борща поем! Чувствую, если продолжу писать, могут и в самом деле банным веником огреть по затылку. Отлучат от секты свидетелей Дилмы за упоминание Хаясама в суе! Как жить дальше с таким позором??!!





карма: 1

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#8: 2015-09-30 23:12:30 ЛС | профиль | цитата
ogrif писал(а):
поучаствовать в решении задачи!

У меня, между прочим, твой пример не запустился ни под каким соусом, даже с новыми фильтрами. Темный экран, нажимаешь кнопку, сваливается через полминуты. Во давай пример, чтобы читало не плей лист, а нормальный потоковый файл.
карма: 22

0
Ответов: 8888
Рейтинг: 823
#9: 2015-09-30 23:30:37 ЛС | профиль | цитата
nesco, у меня есть несколько десятков файлов с видео "высокой чёткости" по 30--60 Гб каждый. Выложить для пробы?
карма: 19

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#10: 2015-09-30 23:32:27 ЛС | профиль | цитата
Леонид писал(а):
Выложить для пробы?

Не, спасибо.
карма: 22

0
Ответов: 204
Рейтинг: 2
#11: 2015-10-01 01:04:39 ЛС | профиль | цитата
nesco писал(а):
нормальный потоковый файл.


Странно, .m3u8 должен на ура открываться! Только что перепроверил все работает!

Вот чутка подправил и кинул по два потока на .flv и .m3u8

Add(MainForm,2953706,42,56)
{
Width=687
Height=411
BorderStyle=4
Point(Handle)
Point(onResize)
Point(Width)
Point(Height)
}
Add(DirectShowPlayer,14928441,490,280)
{
Point(doFullScreen)
Point(doClose)
link(FileName,14890105:Value,[(496,268)(489,268)])
link(Handle,8571405:Var1,[(503,268)(531,268)])
}
Add(Hub,14739693,308,287)
{
OutCount=4
link(onEvent1,14890105:doValue,[(351,293)(351,230)])
link(onEvent2,15372529:doTimer,[(371,300)(371,286)])
link(onEvent3,14928441:doClose,[])
link(onEvent4,9848857:doEvent1,[(350,314)(350,384)(75,384)(75,328)])
}
Add(ChildPanel,8571405,525,224)
{
}
BEGIN_SDK
Add(EditMulti,8590332,21,21)
{
VarCount=1
Width=531
Height=347
link(Var1,210257:Handle,[(27,252)(41,252)])
}
Add(Panel,210257,35,105)
{
Left=11
Top=10
Width=410
Height=340
Color=-16777198
Point(Handle)
}
END_SDK
Add(Memory,14890105,483,224)
{
}
Add(Timer,15372529,385,280)
{
Enable=1
AutoStop=1
link(onTimer,2486813:doEvent1,[])
}
Add(Hub,2486813,441,280)
{
link(onEvent1,14928441:doPlay,[])
link(onEvent2,14928441:doFullScreen,[(473,293)(473,300)])
}
Add(Timer,1377823,133,329)
{
Interval=15000
Enable=1
AutoStop=1
link(onTimer,9035997:doWork2,[])
}
Add(ChanelToIndex,9035997,189,322)
{
link(onIndex,9910225:doVisible,[])
}
Add(Hub,9848857,91,322)
{
link(onEvent1,9035997:doWork1,[])
link(onEvent2,1377823:doTimer,[])
}
Add(Label,1115093,217,168)
{
Left=485
Top=155
Width=153
Height=33
Font=[MS Sans Serif,18,4,255,1]
Caption="Ждём 15 сек!"
}
Add(ListBox,9910225,238,280)
{
Left=435
Top=10
Width=240
Height=340
Strings=#35:http://tvnoginsk.ru:8080/stream.flv|36:http://194.44.173.90:8080/stream.flv|0:|70:http://hlsstr03.svc.iptv.rt.ru/hls/CH_C06_1TVHD/variant.m3u8?version=2|46:http://93.95.99.231:1935/live/km/playlist.m3u8|
DataType=1
Point(doVisible)
link(onClick,14739693:doEvent1,[])
}


Все потоки на данный момент рабочие и используют LAV filtr в DirectShow



------------ Дoбавленo в 01.04:
nesco писал(а):
У меня, между прочим, твой пример не запустился ни под каким соусом,

А может у тебя гранаты не той системы??! В смысле сам компонент DirectShowPlayer не такой как у меня?

исходный код моего компонента DirectShowPlayer:

unit hiDirectShowPlayer;

interface

uses Windows,Kol,Share,Debug,dshow;

type
THIDirectShowPlayer = class(TDebug)
private
MyGraphBuilder : IGraphBuilder;
VideoWindow : IVideoWindow;
MyMediaControl : IMediaControl;
MyMediaPosition : IMediaPosition;
BasicVideo: IBasicVideo;
MediaEvent: IMediaEvent;
ho: HWND;
th:PThread;

function Execute(Sender:PThread): Integer;
public
_prop_Filename:string;

_data_Handle:THI_Event;
_data_FileName:THI_Event;
_event_onEndPlay:THI_Event;

procedure _work_doPlay(var _Data:TData; Index:word);
procedure _work_doPosition(var _Data:TData; Index:word);
procedure _work_doClose(var _Data:TData; Index:word);
procedure _work_doFullScreen(var _Data:TData; Index:word);
procedure _var_Position(var _Data:TData; Index:word);
procedure _var_Length(var _Data:TData; Index:word);
end;

implementation

uses ActiveX;

function THIDirectShowPlayer.Execute(Sender:PThread): Integer;
var
evCode:LongInt;
begin
repeat
MediaEvent.WaitForCompletion(1000, evCode);
if evCode = EC_COMPLETE then
_hi_onEvent(_event_onEndPlay);
until Sender.Terminated or (MyGraphBuilder = nil);
Result := 0;
end;

procedure THIDirectShowPlayer._work_doPlay;
var fn:string;
h:cardinal;
begin
_work_doClose(_data, 0);
fn := Share.ReadString(_Data, _data_FileName, _prop_Filename);
ho := Share.ReadInteger(_Data, _data_Handle);

CoInitialize(nil);

CoCreateInstance(CLSID_FilterGraph,nil,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,MyGraphBuilder);

MyGraphBuilder.RenderFile(PWideChar(WideString(fn)),nil);

MyGraphBuilder.QueryInterface(IID_IVideoWindow,VideoWindow);

VideoWindow.put_Owner(ho);
VideoWindow.put_WindowStyle(WS_CHILD OR WS_CLIPSIBLINGS);

MyGraphBuilder.QueryInterface(IID_IMediaControl,MyMediaControl);
MyGraphBuilder.QueryInterface(IID_IMediaPosition,MyMediaPosition);

MyGraphBuilder.QueryInterface(IID_IBasicVideo,BasicVideo);
MyGraphBuilder.QueryInterface(IID_IMediaEvent,MediaEvent);

MyMediaControl.Run;
//MediaEvent.WaitForCompletion(INFINITE, evCode);

if Assigned(th) then
th.Free;

th := {$ifdef F_P}NewThreadforFPC{$else}NewThread{$endif};
th.OnExecute := Execute;
th.Resume;
end;

procedure THIDirectShowPlayer._work_doPosition;
begin
MyMediaPosition.put_CurrentPosition(ToReal(_Data));
end;

procedure THIDirectShowPlayer._work_doClose;
begin
if not assigned(MyGraphBuilder) then exit;

MyMediaControl.Stop;
// MyMediaControl.Release;
// MyMediaPosition.Release;
// BasicVideo.Release;
// MediaEvent.Release;
// MyGraphBuilder.Release;
MyGraphBuilder := nil;

th.Free;
th := nil;
end;

procedure THIDirectShowPlayer._work_doFullScreen;
var r:TRect;
w,h:longint;
VideoAspect,ParentAspect:real;
NewHeight, NewWidth, NewPosLeft, NewPosTop:integer;
begin
GetClientRect(ho, r);
BasicVideo.GetVideoSize(w, h);

VideoAspect := h / w;
ParentAspect := r.bottom / r.right;

NewPosTop := 0;
NewPosLeft := 0;
if (VideoAspect > ParentAspect) then
begin
NewHeight := r.bottom;
NewWidth := round(NewHeight / VideoAspect);
NewPosLeft := round((r.right - NewWidth) / 2);
end
else if (VideoAspect < ParentAspect) then
begin
NewWidth := r.right;
NewHeight := Round(NewWidth * VideoAspect);
NewPosTop := round(abs(r.bottom - NewHeight) / 2);
end
else
begin
NewWidth := r.right;
NewHeight := r.bottom;
end;

VideoWindow.SetWindowPosition(NewPosLeft, NewPosTop, NewWidth, NewHeight);
MyMediaControl.Run;
end;

procedure THIDirectShowPlayer._var_Position;
var d:double;
begin
MyMediaPosition.get_CurrentPosition(d);
dtReal(_Data, d);
end;

procedure THIDirectShowPlayer._var_Length;
var d:double;
begin
MyMediaPosition.get_Duration(d);
dtReal(_Data, d);
end;

end.


карма: 1

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#12: 2015-10-01 03:56:05 ЛС | профиль | цитата
ogrif писал(а):
используют LAV filtr в DirectShow

А вот это сразу можно было сказать Я не использую K-Lite, я использую ffdshow, поэтому я не стал ставить K-Lite. А фильтр Lav есть у мелкомягких на сайте, скачал и все заработало. Но спешу разочаровать -- построение компонента не дает вывода корректных кодов событий плейера, на все события он отвечает EC_OK.
------------ Дoбавленo в 01.38:
Кстати, это не только у нас такой прикол, народ вот тоже пытался отловить ошибки, но толком не получилось -- http://stackoverflow.com/questions/8537606/directshow-mediaevent-getevent-errorabort-issue
------------ Дoбавленo в 03.56:
Все, чем я могу помочь, так это заставить выдавать все полученные коды от медиаплеера. Разбираться будете сами, что это за коды. У меня нет возможности останавливать поток извне, да и все случаи не предусмотришь.

PS Млин целый вечер угробил на эту фигню, оно мне надо было, пустая информация, никакой пользы
карма: 22

0
Ответов: 5227
Рейтинг: 588
#13: 2015-10-01 09:44:08 ЛС | профиль | цитата
Подозреваю что нужен источник IMediaEventSink там полный лог построения графов идёт
------------ Дoбавленo в 09.44:
но времени нет попробовать проверить.
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 4621
Рейтинг: 746
#14: 2015-10-01 10:37:54 ЛС | профиль | цитата
Скорее всего нужен IMediaEvent
IMediaEventSink - это если пишешь свой фильтр и хочешь сам вызывать события.
карма: 26

0
Разработчик
Ответов: 26066
Рейтинг: 2120
#15: 2015-10-01 12:49:37 ЛС | профиль | цитата
Netspirit писал(а):
Скорее всего нужен IMediaEvent

Этот интерфейс и использовали в этом компоненте, но коряво.
карма: 22

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)