Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2017, 08:16   #1
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию Вопрос по Directshow;

Есть потокTS состоящий из 8 программ ТВ (видео и звук),строю граф ,показывает только один так как указаны ( pid video и pid audio ) ,из этого TS потока.

если я делаю 2 графа фильтров одинаковые но указываю другие (пиды видео и звука) то показывает только последний загруженный .
(и всегда показывает только 1).
в одном приложении или процессе не работает копия созданного графа, созданная ранее.


если делаю типа сервера и клиенты подключаются с копией графа фильтров то работают все каналы.

но неохота делать клиента и сервера отдельно.
Работал с DSHOW на базе bass video , или bass video (но не могу найти там куда данные ему пихать типа (buff,len) , в BASS (звук) там есть
типа этого
chan:=BASS_StreamCreate(44100, 2,0, STREAMPROC_PUSH, nil);
BASS_StreamPutData(chan,Buff, len);

если такое для DSHOW я не нашел ,было бы тогда проще.

Может кто что подскажет .Спасибо за помощь.



Суть в чём мне нужно вывести все каналы с TS потока.

Последний раз редактировалось АНАТОЛИЙ249; 05.10.2017 в 09:31.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 07.10.2017, 13:39   #2
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Чтобы не заморачиваться и не терять свое время на построение правильной работы в DSHOW попробуйте использовать PasLibVlc в нем уже все реализовано для работы в DSHOW, он хорошо работает с потоковыми видео любого протокола и формата, работает даже с torrent stream, youtube трансляциями, может работать с видеонаблюдением по onvif и rtp протоколу, еще может сам делать трансляцию видео. Прост в использовании, универсален. С ним можно работать как напрямую с компонентом, так и и без него работая через его функции в DLL.
http://streletzcoder.ru/sozdanie-pro...tov-paslibvlc/
https://wiki.videolan.org/Using_libvlc_with_Delphi
http://www.cyberforum.ru/delphi-mult...ad1622837.html
http://prog.olsztyn.pl/paslibvlc/
Примеры для работы с PasLibVlc в интернете есть да и сам компонент.

Последний раз редактировалось Aliens_wolfs; 07.10.2017 в 14:32.
Aliens_wolfs на форуме Ответить с цитированием
Старый 11.10.2017, 05:57   #3
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

Можно попробовать ,но нужно устанавливать VLC. Без него библиотека не работает.

Спасибо за помощь.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 11.10.2017, 07:55   #4
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

И еще вопрос по samlegrabber , захват кадра , ошибок нет
везде возвращает 0, но не работает. Как я понял проблема в типе видео или в субтипе видео. формат может не такой ,не понятно.

Спасибо.

Код:




//------------------  З А Х В А Т    В И Д Е О-------------------------------------

           





// Создаем объект для грабинга video
Result:=CoCreateInstance(CLSID_SampleGrabber, NIL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, FBaseFilter);
if FAILED(Result) then
begin
showmessage('Не могу создать ГРАФ для грабинга video');
EXIT;
end;



// Получаем интерфейс фильтра перехвата video
Result:=FBaseFilter.QueryInterface(IID_ISampleGrabber, FSampleGrabbervideo);
if FAILED(Result) then
begin
showmessage('Не могу получить интерфейс фильтра перехвата video');
EXIT;
end;



// Добавляем фильтр в граф video
Result:=AddFilter(FBaseFilter,'Sample Grabber' {'GRABBER'});
if FAILED(Result) then
begin
showmessage('Не могу добавить фильтр в граф video');
EXIT;
end;






  if FSampleGrabbervideo <> NIL then
  begin
    // Устанавливаем формат данных для фильтра перехвата
    ZeroMemory(@MediaType, sizeof(AM_MEDIA_TYPE));
     //FillMemory(@FMediaType, SizeOf(FMediaType), 0);



    with MediaType do
    begin
      majortype  := MEDIATYPE_Video;
      subtype    := MEDIASUBTYPE_RGB24;// менял тут не помогает
      formattype := FORMAT_VideoInfo;
    end;





    Result:=FSampleGrabbervideo.SetMediaType(MediaType);

    // Данные будут записаны в буфер в том виде, в котором они
    // проходят через фильтр
    Result:=FSampleGrabbervideo.SetBufferSamples(TRUE);

    // Граф не будет остановлен для получения кадра
    Result:=FSampleGrabbervideo.SetOneShot(FALSE);
   Result:=FSampleGrabbervideo.SetCallback(FSampleVIDEOGrabberCB, 1);









  end;





//**

Последний раз редактировалось Arigato; 17.10.2017 в 19:54.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 11.10.2017, 12:11   #5
dummy_user
Форумчанин
 
Аватар для dummy_user
 
Регистрация: 02.03.2013
Сообщений: 109
По умолчанию

Чем BASS не устраивает?
dummy_user вне форума Ответить с цитированием
Старый 11.10.2017, 12:38   #6
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

BASS устраивает , но там захват кадра идет в файл и с остановкой воспроизведения,мне нужно получить в bitmap и работать с ним ,сравнивать нужно 2 изображения через определенное время. как это сделать в bassvideo я не нашел даже
тут https://www.un4seen.com/ ,именно получить в bitmap , а не в файл.

Да еще заметил , что не на всех файлах видео делаются скриншоты , толи формат разный что выдает не RGB24 а другое типа UYYU , как узнать что за формат как у меня описано выше ,что ошибок нет а не захватывает кадр в directshow;

Последний раз редактировалось АНАТОЛИЙ249; 11.10.2017 в 14:41.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 12.10.2017, 15:58   #7
dummy_user
Форумчанин
 
Аватар для dummy_user
 
Регистрация: 02.03.2013
Сообщений: 109
По умолчанию

А видео в каком формате? Не в .avi?
dummy_user вне форума Ответить с цитированием
Старый 12.10.2017, 17:22   #8
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

А можно ли получить картинку в bitmap а не в файл в TPasLibVlcPlayer,там тоже в файл сохраняться ? нашел это http://www.cyberforum.ru/delphi-wina...ad1512508.html но в библиотеке нет
функций
PasLibVlcPlayer.OnFrame:= PlayerOnFrame;
PasLibVlcPlayer.bFrameFromMem := true;

Как это применить не знаю.

Спасибо.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 12.10.2017, 19:47   #9
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Вот кое что нашел как в bitmap изображение вывести в DSHOW
http://www.programmersforum.ru/showp...7&postcount=17
http://www.programmersforum.ru/showthread.php?t=307328

Код:
но в библиотеке нет
Установите проигрыватель VLC либо вот нужные dll https://yadi.sk/d/vnlNItNZ3NhhPB и пропишите такую функцию с указанием пути к каталогу с dll
Код:
function Initiale_libvlc(): boolean;
begin
Result:= false;
   //libvlc_dynamic_dll_init_with_path(ExtractFilePath(Application.ExeName) + 'DLL\');
    libvlc_dynamic_dll_init_with_path('C:\Program Files\VideoLAN\VLC');
 // libvlc_dynamic_dll_init();

  if (libvlc_dynamic_dll_error <> '') then
  begin
    MessageDlg(libvlc_dynamic_dll_error, mtError, [mbOK], 0);
    exit;
  end;
Result:= true;
end;
и вызовите ее в загрузке формы например

Выкладываю свой проект работы по PasLibVlc в моем модуле UVideolibvlcList реализовано вывод изображения через DIB в Функции
VideoLibvlcCreateDibBitmap рисует на канву и Bitmap, также я там вывожу нужную инфу, например канал остановлен, нет сигнала и т.д. также в этом модуле реализован ping потерянного интернет канала, при появлении канала делает загрузку автоматически, также одной функцией можно выводить много разных каналов.
Изображения
Тип файла: jpg PasLibVLC.jpg (90.6 Кб, 248 просмотров)
Вложения
Тип файла: rar Пример PasLibVLC.rar (268.2 Кб, 42 просмотров)

Последний раз редактировалось Aliens_wolfs; 12.10.2017 в 20:54.
Aliens_wolfs на форуме Ответить с цитированием
Старый 13.10.2017, 05:06   #10
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

Спасибо огромное за помощь , Да установил VLC скачал TPasLibVlcPlayer ,и начал писать , работает, даже нагружает систему меньше чем Bassvideo , впринципе устраивает , и еще вопрос как можно вывести индикаторы звука ? У меня TPasLibVlcPlayer версии 2.2.7 и VLC 2.4 скачивал тут
http://decoding.dax.ru/download/component/mm/mm.html

Последний раз редактировалось АНАТОЛИЙ249; 13.10.2017 в 05:31.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DirectShow ? wendstor Мультимедиа в Delphi 1 04.06.2012 21:21
c# directshow world12_tk Помощь студентам 2 26.05.2011 07:27
DirectShow @lexender Мультимедиа в Delphi 0 14.04.2009 18:06
DirectShow Windows Мультимедиа в Delphi 4 22.10.2008 18:30