Текущее время: 01 май 2025, 19:25 • Часовой пояс: UTC + 3 часа |
По тюнеру DVB T2
Автор | Сообщение |
Tolyan249
|
|
Зарегистрирован: 17 авг 2012, 07:26 Сообщения: 62
|
Вопрос решил по сигналу что бы работало без запуска программы beholder TV добавил фильтр к MPEG 2 demultiplexer ещё один фильтр это
KSCATEGORY_BDA_TRANSPORT_INFORMATION,
hr := LoadFilter ( KSCATEGORY_BDA_TRANSPORT_INFORMATION, FTIF, FDemux, TRUE, '' ); if (FAILED (hr)) then begin WriteLog('Cannot load TIF'); Result := hr; Exit; end;
Все вопросы решил почти,Осталось переключение PLP и получить уровень сигнала SNR, поток программ 1 мультиплекса я получил 8 программ видео 2 радио ,это все в одном TS потоке, все программы разом. что хотел то получил, осталось дело за малым, PLP и получить уровень сигнала SNR
Подскажите как получить уровень сигнала SNR?
Как правильно получить сигналы уровня в DVB ,а то в WINDOWS7 оба индикатора показывают 100% ,в ХР работает нормально, Как получить сигнал SNR
Спасибо.
|
|
|
Tolyan249
|
|
Зарегистрирован: 17 авг 2012, 07:26 Сообщения: 62
|
Подскажите пожалуйста: 1: Как использовать KSPROPERTY_BDA_PLP_NUMBER, не могу понять и найти. 2. Получить сигнал уровня SNR.
Кому интересно нашел на си модуль Header_DirectShow.h
Нашел исходник на си (DVB T2) Кому нужно скачивайте.
Спасибо.
|
|
|
Tolyan249
|
|
Зарегистрирован: 17 авг 2012, 07:26 Сообщения: 62
|
Продолжение к библиотеки для исходника.
|
|
|
Tolyan249
|
|
Зарегистрирован: 17 авг 2012, 07:26 Сообщения: 62
|
В этих исходниках на СИ нашел что можно получить(задать) сигнал и PLP , но как мне их использовать пока не могу понять может кто что подскажет?
using System; using DirectShowLib; using DirectShowLib.BDA; using DVBT2Viewer.BDA.Helpers; using DVBT2Viewer.BDA.Helpers.HelperTypes; using DVBT2Viewer.BDA.Interfaces;
namespace DVBT2Viewer.BDA { internal abstract class DVBT2BaseGraphCommands { /// <summary> /// Build DVB-T/T2 tune request /// </summary> /// <param name="aFrequency">Tune frequency</param> /// <param name="aBandwidth">Tune bandwidth</param> /// <returns>ITuneRequest implementation</returns> protected ITuneRequest GetTuneRequest(int aFrequency, int aBandwidth) { if (aFrequency == -1 || aBandwidth == -1) throw new Exception("Invalid tune");
ITuneRequest baseTuneRequest; GetGraph().TuningSpace.CreateTuneRequest(out baseTuneRequest); var tuneRequest = (IDVBTuneRequest)baseTuneRequest; var locator = (IDVBTLocator)new DVBTLocator(); var hr = locator.put_CarrierFrequency(aFrequency); DsError.ThrowExceptionForHR(hr); hr = locator.put_Bandwidth(aBandwidth); DsError.ThrowExceptionForHR(hr); hr = tuneRequest.put_Locator(locator); DsError.ThrowExceptionForHR(hr);
return tuneRequest; }
/// <summary> /// Set active PLP ID /// </summary> /// <param name="plp">PLP ID</param> protected void SetPlp(int plp) { var plpSupported = KsPropertyHelper.KSSupported(GetGraph().TunerPin, KSPropSets.KSPROPSETID_BdaDigitalDemodulator, (int)KSPROPERTY_BDA_DIGITAL_DEMODULATOR.KSPROPERTY_BDA_PLP_NUMBER); if (plpSupported.HasFlag(KSPropertySupport.Set)) KsPropertyHelper.KSSetNode(GetGraph().TunerPin, KSPropSets.KSPROPSETID_BdaDigitalDemodulator, (int)KSPROPERTY_BDA_DIGITAL_DEMODULATOR.KSPROPERTY_BDA_PLP_NUMBER, plp); } protected abstract IDVBT2BaseGraphProps GetGraph(); }
}
//-------------------------------------------------------------------------------
там же нашел
namespace DVBT2Viewer.BDA.Graph { class TunerKspNodeManager { private readonly IKsPropertySet ksProperty;
internal TunerKspNodeManager(IKsPropertySet tunerKsProperty) { ksProperty = tunerKsProperty; }
public void SetPlpId(int plp) { KsPropertyHelper.KSSetNode(ksProperty, KSPropSets.KSPROPSETID_BdaDigitalDemodulator, (int)KSPROPERTY_BDA_DIGITAL_DEMODULATOR.KSPROPERTY_BDA_PLP_NUMBER, plp); }
public int GetPlpCount() { return (int)KsPropertyHelper.KSGetNode(ksProperty, KSPropSets.KSPROPSETID_BdaDigitalDemodulator, (int)KSPROPERTY_BDA_DIGITAL_DEMODULATOR.KSPROPERTY_BDA_PLP_NUMBER, typeof(int)); }
|
|
|
BTVSoft
|
|
Beholder |  |
Зарегистрирован: 19 авг 2004, 11:47 Сообщения: 190
|
Tolyan249Для работы с DVB устройствами общий принцип такой: - Через ICreateDevEnum::CreateClassEnumerator находится нужное устройство типа KSCATEGORY_BDA_NETWORK_TUNER и создается его инстанс. - Инстанс BDA тюнера сканируется на наличие узлов Tuner Node и Demodulator Node Код: // // Node Type 0 Node Type 1 // | | // v v // --------------- -------------------- // Antenna | | | | Transport // In Pin --------| Tuner Node |--X--| Demodulator Node |------------ Out Pin // ^ ^ | | ^ | | ^ ^ // | | --------------- | -------------------- | | // | | | | | // | -- Connection 0 -- Connection 1 -- Connection 2 | // | Topology Joint | // ---- Pin Type 0 Pin Type 1 ---- // //
- В узле Demodulator Node используется KsProperty KSPROPSETID_BdaDigitalDemodulator для доступа в частности к свойству KSPROPERTY_BDA_PLP_NUMBER - В узле Tuner Node используется KsProperty KSPROPSETID_BdaSignalStats для доступа к свойствам KSPROPERTY_BDA_SIGNAL_STRENGTH, KSPROPERTY_BDA_SIGNAL_QUALITY, KSPROPERTY_BDA_SIGNAL_PRESENT, KSPROPERTY_BDA_SIGNAL_LOCKED. В разных интерпретациях KSPROPSETID_BdaSignalStats может быть реализовано как в узле Tuner Node, так и в узле Demodulator Node, поэтому нужно просканировать оба узла на предмет получения доступа к KSPROPSETID_BdaSignalStats. В наших драйверах KSPROPSETID_BdaSignalStats находится всегда в узле Tuner Node.
|
|
|
Tolyan249
|
|
Зарегистрирован: 17 авг 2012, 07:26 Сообщения: 62
|
Ясно, спасибо,за ответ , вся проблема что я граф собрал все работает каналы сканирует, видео и звук есть,ну естественно только 8 каналов тв и 2-радио ,ну видать которые идут в PLP 0 ,придется наверно граф переcтраиваать? У меня граф собран как на картинке в месте с Samle Grabberom до MPEG 2 demultiplexer. задаю pid video and pid audio, все работает.
соеденил все пины как на картинках которые в посте выше. Пытаюсь взять то что исходник выложил на си , но в си я не селен. Если бы кто смог на pascal перевести, тогда может что то и сдвинулось бы с места, застрял на одном месте.
Ну буду пробовать искать, спасибо еще раз за помощь советы и ответы. Будут вопросы напишу.
|
|
|
Tolyan249
|
|
Зарегистрирован: 17 авг 2012, 07:26 Сообщения: 62
|
исходника на си получение сигнала и ну и так далее Спасибо за помощь.
Последний раз редактировалось Tolyan249 22 окт 2015, 10:12, всего редактировалось 1 раз.
|
|
|
Tolyan249
|
|
Зарегистрирован: 17 авг 2012, 07:26 Сообщения: 62
|
Вот у меня написано:
// Load tuner device and connect to network provider hr := LoadFilter(KSCATEGORY_BDA_NETWORK_TUNER, FTunerDevice,FNetworkProvider, True, TunerPath); if FAILED( hr) then begin WriteLog('Could not load tuner.' + SysErrorMessage(hr)); Result := hr; Exit; end;
как я понял нужно у FTunerDevice-найти Инстанс BDA тюнера сканируется на наличие узлов Tuner Node и Demodulator Node .
KSPROPSETID_BdaDigitalDemodulator -это есть в directshow KSPROPSETID_BdaSignalStats - это есть в directshow;
Tuner Node такого нет в directshow, как правильно написать Tuner Node ?
hr:= (FTunerDevice.QueryInterface(IID_IBDA_Topology, topology) ); if FAILED( hr) then begin Exit; end;
Так ошибки нет но что дальше делать я не знаю как найти Инстанс BDA тюнера ,и там найти KSPROPSETID_BdaSignalStats ?
вот в directshow нашел:
//=========================================================================== // // BDA Node Categories // //===========================================================================
KSNODE_BDA_RF_TUNER : TGUID = '{71985F4C-1CA1-11d3-9CC8-00C04F7971E0}'; {$EXTERNALSYM KSNODE_BDA_RF_TUNER} KSNODE_BDA_QAM_DEMODULATOR : TGUID = '{71985F4D-1CA1-11d3-9CC8-00C04F7971E0}'; {$EXTERNALSYM KSNODE_BDA_QAM_DEMODULATOR} KSNODE_BDA_QPSK_DEMODULATOR : TGUID = '{6390C905-27C1-4d67-BDB7-77C50D079300}'; {$EXTERNALSYM KSNODE_BDA_QPSK_DEMODULATOR} KSNODE_BDA_8VSB_DEMODULATOR : TGUID = '{71985F4F-1CA1-11d3-9CC8-00C04F7971E0}'; {$EXTERNALSYM KSNODE_BDA_8VSB_DEMODULATOR} KSNODE_BDA_OPENCABLE_POD : TGUID = '{D83EF8FC-F3B8-45ab-8B71-ECF7C339DEB4}'; {$EXTERNALSYM KSNODE_BDA_OPENCABLE_POD} KSNODE_BDA_PID_FILTER : TGUID = '{F5412789-B0A0-44e1-AE4F-EE999B1B7FBE}'; {$EXTERNALSYM KSNODE_BDA_PID_FILTER} KSNODE_BDA_IP_SINK : TGUID = '{71985F4E-1CA1-11d3-9CC8-00C04F7971E0}'; {$EXTERNALSYM KSNODE_BDA_IP_SINK}
KSNODE_BDA_COFDM_DEMODULATOR: TGUID = '{2DAC6E05-EDBE-4b9c-B387-1B6FAD7D6495}'; {$EXTERNALSYM KSNODE_BDA_COFDM_DEMODULATOR} KSNODE_BDA_COMMON_CA_POD : TGUID = '{D83EF8FC-F3B8-45ab-8B71-ECF7C339DEB4}'; {$EXTERNALSYM KSNODE_BDA_COMMON_CA_POD}
//===========================================================================
Но как это всё использовать пока не знаю может кто что объяснит?
что обозначает на си вот это object ostats;
Спасибо.
|
|
|
Tolyan249
|
|
Зарегистрирован: 17 авг 2012, 07:26 Сообщения: 62
|
нашел интерфейс KSPROPSETID_BdaSignalStats : TGUID = '{1347D106-CF3A-428a-A5CB-AC0D9A2A4338}';
function TBDAFilterGraph.GetTopologySIGN:Hresult; var enum: IEnumFilters; topology: IBDA_Topology; nodetypeslist: array[0..63] of Cardinal; nodetypes: Cardinal; nodeinterfaceslist: array[0..63] of TGuid; nodeinterfaces: Cardinal; i, c: Integer; unk: IUnknown; bda: IUnknown; filter_info: TFilterInfo; list:TstringList; hr:hresult;
begin list:=TstringList.Create; for i:=0 to 63 do nodetypeslist[i]:=0;
try if (FTunerDevice.QueryInterface(IID_IBDA_Topology, topology) = S_OK) then if topology.GetNodeTypes(nodetypes, 10, nodetypeslist[0])=S_OK then if nodetypes > 0 then for i := 0 to nodetypes -1 do if topology.GetNodeInterfaces(nodetypeslist[i], nodeinterfaces, 10, @nodeinterfaceslist) = S_OK then if nodeinterfaces > 0 then for c := 0 to nodeinterfaces -1 do if IsEqualGUID(nodeinterfaceslist[c], KSPROPSETID_BdaSignalStats) then begin hr:=topology.GetControlNode(0, 1, nodetypeslist[i], unk); if Failed(hr) then begin Exit; end;
не выполняется действие выделенное цветовом , дает ошибку, хотя KSPROPSETID_BdaSignalStats найден , но
hr:=topology.GetControlNode(0, 1, nodetypeslist[i], unk)-ошибка,не могу понят почему,может поможете найти ошибку ?
Спасибо.
|
|
|
BTVSoft
|
|
Beholder |  |
Зарегистрирован: 19 авг 2004, 11:47 Сообщения: 190
|
Tolyan249 Уважайте других участников форума, не нужно постить столько кода, да еще не обрамленного тегами. Вот вам гарантированно рабочий пример парсинга топологии фильтра DVB тюнера на ObjectPascal. Проверено лично. Код: function ParseBdaTopology(const pDvbtTuner : IBaseFilter) : HRESULT; var pTopology: IBDA_Topology; pUnk : IUnknown; pBda : IBDA_SignalStatistics; node_types: DWORD; node_types_list: array[0..9] of DWORD; node_interfaces: DWORD; node_interfaces_list: array[0..9] of TGUID; i, j : DWORD; hr : HRESULT; lQuality : Longint; begin node_types := 0; ZeroMemory(@node_types_list, sizeof(node_types_list));
hr := pDvbtTuner.QueryInterface(IID_IBDA_Topology, pTopology); if (hr = S_OK) then begin hr := pTopology.GetNodeTypes(node_types, 10, node_types_list); if (hr = S_OK) and (node_types > 0) then begin for i := 0 to node_types - 1 do begin node_interfaces := 0; ZeroMemory(@node_interfaces_list, sizeof(node_interfaces_list)); hr := pTopology.GetNodeInterfaces(node_types_list[i], node_interfaces, 10, node_interfaces_list); if (hr = S_OK) and (node_interfaces > 0) then begin for j := 0 to node_interfaces - 1 do begin if IsEqualGUID(node_interfaces_list[j], KSPROPSETID_BdaSignalStats) then begin hr := pTopology.GetControlNode(0, 1, node_types_list[i], pUnk); if (hr = S_OK) then begin hr := pUnk.QueryInterface(IID_IBDA_SignalStatistics, pBda); if (hr = S_OK) then begin lQuality := 0; hr := pBda.get_SignalQuality(lQuality); pBda := Nil; end; pUnk := Nil; end; end; end; end; end; end; pTopology := Nil; end;
Result := hr; end;
|
|
|
Tolyan249
|
|
Зарегистрирован: 17 авг 2012, 07:26 Сообщения: 62
|
Понял ,исправлюсь. Спасибо огромное за помощь,за ответы, а то застрял на одном месте и в нете не могу найти, хотя сравниваю с си то что нашел, вроде должно работать но не работало. Еще раз Спасибо огромное.
Странно вот тут также дает ошибку как у меня в этом же предложении:
hr := pTopology.GetControlNode(0, 1, node_types_list[i], pUnk); hr=-2147467261;
Вот это предложение переделал ,Delphi давала ошибку на hr := pTopology.GetNodeTypes(node_types, 10,node_types_list);
так как node_types_list это массив пришлось сделать так node_types_list[0]
в node_types_list -массив содержит цифры (0,1,0,0,0,0,0,0,0,0),т.е. одна 1 в массиве.
Не понятно почему дает ошибку что не так?
|
|
|
BTVSoft
|
|
Beholder |  |
Зарегистрирован: 19 авг 2004, 11:47 Сообщения: 190
|
1) В ParseBdaTopology передается указатель на DS фильтр "Behold TV XXX: DVB-T Frontend" 2) Этот DS фильтр должен быть добавлен в граф 3) В граф должен быть добавлен DS фильтр "Behold TV XXX: DVB-T Capture" 4) В граф должен быть добавлен DS фильтр "Microsoft DVB-T Network Provider" 5) Все 3 DS фильтра должны быть соединены.
GetControlNode должен вернуть указатель и hr без ошибки. node_types = 2, в node_types_list два значения, 0 и 1. Это индексы двух нодов.
|
|
|
Tolyan249
|
|
Зарегистрирован: 17 авг 2012, 07:26 Сообщения: 62
|
Да это все соединено я писал раньше, что каналы показывают .
у меня сделано так как на 1 странице моей темы на рисунке 2.PNG.
хотя возвращает данные правильно,те же что вы описали.
Граф фильтров не запущен.
да node_types = 2 это так и node_types_list два значения (0,1,0,0,0,0,0,0,0,0), 1-значение это 0 2-значение это 1 возвращает вроде все правильно.
просто доходит до этого предложения и всё ошибка,остальное он до этого отрабатывает , находит интерфейс KSPROPSETID_BdaSignalStats, а когда нужно сделать hr := pTopology.GetControlNode(0, 1, node_types_list[i], pUnk), по чему то возвращает ошибку.
в node_types_list[i] он должен передать 2 нода или 1 нод,?
если node_types_list[0] то передает только ноль, так как в массиве 1 значение это 0 если node_types_list[1] то передает только единицу, так как в массиве 2 значение это 1
Так же и KSPROPSETID_BdaDigitalDemodulator ставил, тоже находит все вроде хорошо, интерфейсы есть,ноды есть ,доходит до этой строчки hr := pTopology.GetControlNode(0, 1, node_types_list[i], pUnk);
и все тоже самое.
Проверял и на запущенном графе,и не на запущенном графе ,все вроде нормально видео есть звук тоже каналы находит ,каналы переключаются, что граф построен правильно.
где искать ошибку не пойму ,не выполняется pTopology.GetControlNode, что делать не знаю посоветуйте где копать , что посмотреть?
Находит 3 интерфейса в вашей функции function ParseBdaTopology(const pDvbtTuner : IBaseFilter) : HRESULT;
KSPROPSETID_BdaFrequencyFilter : TGUID = '{71985F47-1CA1-11d3-9CC8-00C04F7971E0}'; KSPROPSETID_BdaSignalStats : TGUID = '{1347D106-CF3A-428a-A5CB-AC0D9A2A4338}'; KSPROPSETID_BdaDigitalDemodulator : TGUID = '{EF30F379-985B-4d10-B640-A79D5E04E1E0}';
все вроде нормально но не работает hr := pTopology.GetControlNode(0, 1, node_types_list[i], pUnk); уже весь нет просмотрел веэде код почти одинаковый в основном на си, сути не меняет,вроде как должно работать. Почему у меня не работает GetControlNode не понятно?
Что где искать причину не могу понять ,помогите пожалуйста.
В интернете нашел еще 2 функции на pas ,так же в этом месте дает ошибку, Topology.GetControlNode
Просто переменная массива node_types_list вызывается у вас hr := pTopology.GetNodeTypes(node_types, 10, node_types_list); у меня hr := pTopology.GetNodeTypes(node_types, 10, node_types_list[0]); скачанные с нета hr := pTopology.GetNodeTypes(node_types, 10, PULONG(@node_types_list));
работает только как у меня,иначе delphi дает ошибку что переменная node_types_list ,это массив.
может ошибка тут закралась?
Пробовал и так hr:=pTopology.GetControlNode(0, 1,0,pUnk); и так hr:=pTopology.GetControlNode(0, 1,1,pUnk);
без разницы,что то не хватает, чего понять не могу.
Спасибо за ответы и помощь.
|
|
|
BTVSoft
|
|
Beholder |  |
Зарегистрирован: 19 авг 2004, 11:47 Сообщения: 190
|
Есть ощущение, что у вас C++ заголовки с интерфейсами портированы в pas модули некорректно. Либо в системе что-то с неисправно с COM объектами.
Для проверки, возьмите приложение AltDVB 2.2, оно точно работает через DirectShow и использует энумерацию IBDA_Topology. Оно у вас должно увидеть ваш DVB-T тюнер, при этом оно будет сканировать каналы и корректно показывать Level/Quality. Хоть и приложение старое и не умеет PLP, этого будет достаточно понять, что работает или нет. Я проверял, оно в Windows 10 прекрасно видит тюнер и работает.
Если работать не будет, значит проблема в вашей Windows системе.
|
|
|
Tolyan249
|
|
Зарегистрирован: 17 авг 2012, 07:26 Сообщения: 62
|
Спасибо за ответ. Скачал ALTDVB проверил работает показывает сигнал.
Но программа ваша BEHOLDER работает в WINDOWS XP SP3 , каналы все сканирует, видит PLP и сигнал показывает все 3.
Значит проблема у меня, могу отправить проект (2мгб) на DElphi но куда не знаю,что бы посмотрели, может где ошибку допустил.
Даёт ошибку,не правильный указатель.
Вложил файл pas который работает у меня. 1.Создается граф 2.Подключаем NetworkProvider 3.Подключаем //Интерфейс Тюнера hr := FNetworkProvider.QueryInterface(IID_ITuner, FTuner);
4. // Установка частоты тюнера DVB-T2 hr := CreateDVBTTuneRequest(ch,bn,DVBTuneRequest);
5. hr := FTuner.put_TuneRequest(DVBTuneRequest);
6. hr := LoadFilter(KSCATEGORY_BDA_NETWORK_TUNER, FTunerDevice, FNetworkProvider, True, TunerPath);
7.Подключаем CAPTURE фильтр hr := LoadFilter (KSCATEGORY_BDA_RECEIVER_COMPONENT, FCaptureDevice, FTunerDevice, TRUE, CapturePath);
8. Вызываю функцию вашу Topology ParseBdaTopology(FTunerDevice);
8. Регистрация фильтра hr := AddGraphToRot(FGraphBuilder, FGraphRegister);
Граф не запущен. Фильтры соединены,можно запустить. Сигнал показывает который идет с FTuner.get_SignalStrength(strength);
А в функции ParseBdaTopology(FTunerDevice) выдает Даёт ошибку,не правильный указатель в hr := pTopology.GetControlNode(0, 1, node_types_list[i], pUnk);
Какой указатель на что указатель, почему не работает, хотя все остальное работает.
Что дальше делать не знаю и в интернете не могу найти в чем проблема.
Может кто поможет на основе моего кода который выложен , что то исправить ,если надо могу исходник дать. пишите мыло отправлю. Просто застрял на одном месте, и ни куда не двигаюсь, пото му что не знаю что где искать.
Спасибо за помощь.
Вложения:

Topology.JPG [ 86.66 КБ | Просмотров: 31852 ]
Последний раз редактировалось Tolyan249 09 янв 2016, 13:54, всего редактировалось 1 раз.
|
|
|
Кто сейчас на конференции |
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0 |
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения
|
|