gpt4 book ai didi

c++ - 如何解析 KLV 数据?

转载 作者:太空宇宙 更新时间:2023-11-04 12:35:09 25 4
gpt4 key购买 nike

如何解析 KLV 数据?下面有一些代码。我想使用 klv 元数据制作 map 。但是如何呢?

我知道经纬度在klv的第13和14键。但是我如何使用它们并制作 map 。

ILMMpgDmx *CMainFrame::GetMPEG2DemuxInterface()
{
IUnknown *pSplitter;
HRESULT hr = m_player->GetSubObject(ltmmPlay_Object_Splitter, &pSplitter);
if (SUCCEEDED(hr))
{
ILMMpgDmx *pMpgDmx;
hr = pSplitter->QueryInterface(IID_ILMMpgDmx, (void **)&pMpgDmx);
if (SUCCEEDED(hr))
{
pSplitter->Release();
return pMpgDmx;
}
pSplitter->Release();
}
return NULL;
}

void CMainFrame::EnableMPEG2DemuxCallback()
{
HRESULT hr;
ILMMpgDmx *pMpgDmx = GetMPEG2DemuxInterface();
if (pMpgDmx)
{
// make sure the demux is not using the callback I am about to destroy
pMpgDmx->put_CallbackObj(NULL);

DeleteCallbackClass();

m_pCallback = new CMPEG2DemuxCallback(pMpgDmx);

// Force the callback to be called in the main thread. C++ applications in general can handle data in another thread, but our app is using MFC
// Our callback will display data in a window and MFC doesn't work well when you use windows from threads other than the main thread
// So, for simplicity, we will ask the demux to send the data to the main thread
hr = pMpgDmx->put_CallInSameThread(VARIANT_TRUE);
hr = pMpgDmx->put_CallbackObj(m_pCallback);

pMpgDmx->Release();
}
}


被调用的 DataAvailable() 函数如下所示:


HRESULT STDMETHODCALLTYPE CMPEG2DemuxCallback::DataAvailable
(
/* [in] */ VARIANT *pData,
/* [in] */ long lDataSize,
/* [in] */ FileTypeConstants fileType,
/* [in] */ long streamPID,
/* [in] */ long streamType,
/* [in] */ PTSTypeConstants PTSType,
/* [in] */ double PTS,
/* [in] */ long flags
)
{
// skip small (most likely invalid) data chunks
if(lDataSize <= 1)
return S_OK;

//refresh control
{
static const DWORD MIN_REFRESH_TIME = 1000 ;//1 second
static DWORD dwLastTime = 0 ;//allow first data to be displayed

DWORD dwCurTime = GetTickCount ( ) ;

if ( dwCurTime - dwLastTime < MIN_REFRESH_TIME )
{
return S_OK ;
}
else
{
dwLastTime = dwCurTime ;
}
}

CPrivateDataView* pDataView = CPrivateDataViewManager::GetPrivateDataListView ( ) ;

if(!pDataView)
return S_OK;//skip

pDataView->SetRedraw ( FALSE ) ;
pDataView->GetListCtrl ( ).DeleteAllItems ( ) ;

{
HRESULT hr;

if(flags & DataFlag_IsKLV)
{
ILMKlvParser* pParser;

hr = m_pMpgDmx->GetKlvParser(streamPID, &pParser);
if(FAILED(hr))
return hr;

hr = EnumKlvKeys(pParser, pDataView, NULL, pData, lDataSize, flags);
if(FAILED(hr))
{
pParser->Release() ;

return hr;
}

pParser->Release();
}
else if(flags & DataFlag_IsAscii)
{
CString str;

hr = DumpVariantAsAscii(str, pData, lDataSize);
if(FAILED(hr))
return hr;

pDataView->AddValue (str) ;
}
else if(flags & DataFlag_IsBinary)
{
CString str;

hr = DumpVariantAsBinary(str, pData, lDataSize);
if(FAILED(hr))
return hr;

pDataView->AddValue (str) ;
}
else
{
ASSERT ( FALSE ) ;
return E_UNEXPECTED;
}
}

pDataView->SetRedraw ( TRUE ) ;
pDataView->RedrawWindow ( ) ;

return S_OK ;
}

这些都是我找到的代码。我还找到了这个 klv 库。我需要一条咨询途径。

https://github.com/Hunter522/libklv

最佳答案

我终于找到了如何从 MPEG2 TS 解析 KLV。我做了以下1.使用知道解析元数据KLV的PID的MPEG2-demux directshow过滤器。2. 我建立了自己的 directshow 过滤器(基于转储过滤器)这个过滤器接受接收 KLV 的整个 PID,而不是从这里使用 libklv https://github.com/Hunter522/libklv我添加到过滤器中,这给了我键、长度和值。

但这里是诀窍:KLV 元数据可以是协议(protocol)的一部分,所以在我的例子中协议(protocol)是 MISB 601.8这里:https://upload.wikimedia.org/wikipedia/commons/1/19/MISB_Standard_0601.pdf

每个标签都有自己的公式、单位和名称有 70 多个标签。这意味着如果一个标签有 2 个字节,请转到其在 MISB 中的标签索引,公式就在那里。

关于c++ - 如何解析 KLV 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56735658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com