ts,ps,mpeg2 decoder and analysis

mepg 2, iptv, stream parse,mov,mxf,gxf,ac3,aac

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  21 随笔 :: 0 文章 :: 54 评论 :: 0 Trackbacks

 用的elecard的ax文件,自己写source filter,播放mpeg2还可以,h264就不行了,关键请问题如下:

source仿照系统的asyncflt。cpp。.h :

 问题出在elecard的demux上面,
 首先,elecard公司写demux filter的时候,肯定只是基于文件的--->  to h264来说,

to, mpeg2来说,都是可以的,
 原因如下: 如果是mpeg2, demux filter 先读取一段数据去parse,找psi,如果找到了,就可以connect了,

因为是读文件的,读了一些数据为了connect, 所以connect 以后,必需调用 SetFilePointer(*g_pHFile,0,NULL,FILE_BEGIN);
 要不然,开头的那一段就无法播放了

但是: 如果是h264, 他先读取一段数据去parse,找psi,就算找到了,也不connect: 如果找到了,而且也是文件末尾了,那就connect

成功, 奶奶的,可是我的这个是网络数据流,那有文件末尾,

他有个 set position的函数,connect 后,就 set 0 了

 建立完整个 graph 之后继续播放,不在乎之前的那点数据的---你知道, 前面的那个数据是多大呢16M

 DVB 标清的话,用不了多少就可以搜完台,用不了 16MB

关键是我怎么知道它到底读多少数据就 parse完了呢,难道让我一直等么?,

最早,标清我只要3M的数据,就必需建立graph了,现在h264,高清的,4M,根本不够了,

于是,我的code这样写了,呵呵:HRESULT SetPointer(LONGLONG llPos)
 {
  
   if (g_bIsConnect == 0)
   {
    if (llPos >= (1024 * 1024 * 14))
    {
     //DbgLog((LOG_TRACE, 1, TEXT("\n--Set File Pointer = ld"),llPos));
     return S_FALSE;
    }
 如果connect成功: SetPointer就 永远返回ok
 这样就可以播放了,
 不过,浪费了我14M的数据,唉,
code如后:

if (SUCCEEDED(hr)) 
  hr = CoCreateInstance(CLSID_CEleCardMpegMultiplexer, NULL, CLSCTX_INPROC,
  IID_IBaseFilter, (LPVOID *)&pMPG2Splitter) ;

 if (SUCCEEDED(hr)) 
  hr = m_pGraph->AddFilter(pMPG2Splitter,L"EleCard Mpeg2 DeMultiplexer");

 pPinInTSSplitter = xMyFindPin(pMPG2Splitter,L"Input",0,CLSID_NULL_USER1);

 if (SUCCEEDED(hr)) 
  hr = m_pGraph->Connect(pPinOutSTWrapper,pPinInTSSplitter);


 if (strcmp(m_strFileFormat,"H264") == 0)
 {
  pPinOutTSSplitter_V= xMyFindPin(pMPG2Splitter,L"264",1,MEDIATYPE_Video);
 }
 else
 {  
  pPinOutTSSplitter_V= xMyFindPin(pMPG2Splitter,L"Video",1,MEDIATYPE_Video);
 }

if (strcmp(m_strFileFormat,"H264") == 0)
 {
  if (SUCCEEDED(hr))
   hr = CoCreateInstance(CLSID_CH264VideoDecoder, NULL, CLSCTX_INPROC,    

IID_IBaseFilter, (LPVOID *)&pFIDVDVideoDecorder) ;
  if (SUCCEEDED(hr)) 
   hr = m_pGraph->AddFilter(pFIDVDVideoDecorder,L"EleCard MPEG2 Video Decoder");

  if (SUCCEEDED(hr)) 
   pIDVDVideoDecorderInpin = xMyFindPin(pFIDVDVideoDecorder,L"In",0,MEDIATYPE_Video);

  if(pIDVDVideoDecorderInpin)
   hr = m_pGraph->Connect(pPinOutTSSplitter_V,pIDVDVideoDecorderInpin);

  if (SUCCEEDED(hr)) 
   pIDVDVideoDecorderOutpin = xMyFindPin(pFIDVDVideoDecorder,L"Out",1,MEDIATYPE_Video);
 }
 else
 {
  if (SUCCEEDED(hr))  
   hr = CoCreateInstance(CLSID_CEleCardVideoDec, NULL, CLSCTX_INPROC,
   IID_IBaseFilter, (LPVOID *)&pFIDVDVideoDecorder) ;
  if (SUCCEEDED(hr)) 
   hr = m_pGraph->AddFilter(pFIDVDVideoDecorder,L"EleCard MPEG2 Video Decoder");

  if (SUCCEEDED(hr)) 
   pIDVDVideoDecorderInpin = xMyFindPin(pFIDVDVideoDecorder,L"MPEG In",0,MEDIATYPE_Video);

  if(pIDVDVideoDecorderInpin)
   hr = m_pGraph->Connect(pPinOutTSSplitter_V,pIDVDVideoDecorderInpin);


  if (SUCCEEDED(hr)) 
   pIDVDVideoDecorderOutpin = xMyFindPin(pFIDVDVideoDecorder,L"Video Out",1,MEDIATYPE_Video);

 }

 


static const GUID CLSID_CEleCardMpegMultiplexer =
{0x136DCBF5,0x3874,0x4B70,0xAE,0x3E,0x15,0x99,0x7d,0x63,0x34,0xf7};
 //  136DCBF5-  3874 - 4B70 - AE   3E - 15   99   7D   63   34   F7

static const GUID CLSID_CEleCardVideoDec=
{0xf50b3f13,0x19c4,0x11cf,0xaa,0x9a,0x02,0x60,0x8c,0x9b,0xab,0xa2};
//{F50B3F13-19C4-11CF-  AA9A-         02   60   8C   9B   AB   A2}

static const GUID CLSID_CMoonlightAudioDec=
{0xe32c3b01,0xc81b,0x4d01,0x8a,0xd4,0x2b,0x93,0xf7,0xfa,0x54,0x4c};

static const GUID CLSID_CH264VideoDecoder=
{0x6A270473,0x9994,0x4aeb,0x80,0x1f,0xbb,0x2c,0x4e,0x56,0xee,0x38};
// 6A270473-  9994-  4AEB-  80   1F-  BB   2C   4E   56   EE   38}

posted on 2009-10-23 16:37 TS,MPEG2,dvbc专家 阅读(4517) 评论(16)  编辑 收藏 引用

评论

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc,[未登录] 2009-10-26 09:11 jans2002
帮你顶一下  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc, 2009-10-26 13:00 TS,MPEG2,dvbc专家
谢了,看来,做这个的人,少了,  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc, 2009-10-26 14:51 萌萌
我也来顶下
你比我做的上层多了。我最近还在苦恼 JRTP发送数据包的问题呢  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc, 2009-10-26 14:51 欣萌
.。  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc, 2009-10-26 16:13 TS,MPEG2,dvbc专家
JRTP发送数据包 -- 这个我没有做过,不过我们是仿照live 555, 做rtsp ,server, client, rtp包推流的,这个倒是成功了,现在就剩下播放了。  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc, 2009-10-28 13:15 coloriy
收藏了  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc, 2009-11-03 11:38 天龙私服
不错呀。并不是仅仅多3个字节,我已经更新blog内容了  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc, 2009-12-28 10:55 myideaer
你好,请问你的使用elecard mpeg multiplexer吧?这个filter应该是拉模式下使用的。但是网络穿过过来的数据不是应该采用推模式下的吗?是不是应该采用elecard mpeg push multiplexer?不过我连接之后,输出Pin 无法输出。。。  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc, 2010-01-06 14:46 TS,MPEG2,dvbc专家
你好: 我还没有用过push的 multiplexer, 目前虽然用的是elecard mpeg multiplexer,但是source filter是自己写的,自己建立buffer pool,结果还可以的播放的,不过 出现的问题, 每天下班的时候,开始运行,第二天来的时候,就出现问题了. 说buffer pool满了, 真奇怪的.  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc,[未登录] 2010-02-23 17:15 路人甲
@TS,MPEG2,dvbc专家
最近也在研究這內容
不知道前輩有研究出來嗎 想向你討教一下
我目前要做一個 h264 decoder filter
目前是用 ffmpeg 包成filter
只是 render rate 卻是很慢很慢
想問說前輩有沒有經驗可以分享
謝謝
tocute520@gmail.com
  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc, 2010-03-03 18:19 TS,MPEG2,dvbc专家
你好,目前做出来了, 目前用的是Ele card push demultipliex filter + mainconcept avc/h264 video decoder,

播放慢的情况,我也遇到过, 有两个经历,一个是用了Ele card pull demux filter, 另一个是用了,SampleGrabber filter,

最后我取消了SampleGrabber ,结果正常了, 不过,如果要做基于网络的,应该还说用push filter

我目前要做一個 h264 decoder filter – 你做的到底是那个 是demux还是video decoder?

也给你回信了.

  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc, 2010-10-31 18:34 张健
@TS,MPEG2,dvbc专家
n
@TS,MPEG2,dvbc专家

你好,请问你是怎么将elecard MPEG push Demultiplexer的output pin搞出来的 ?  回复  更多评论
  

# re: direct show,filter,elecard_demux做网络播放器,主要格式:h264/avc, 2011-12-13 21:55 Andrews24Jana
It is known that cash makes us disembarrass. But what to do if one does not have cash? The one way only is to get the <a href="http://goodfinance-blog.com">loan</a> or just short term loan.   回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


ts,ps,mpeg2 decoder and analysis,ts分析.