请问MPEG_1媒体帧大小是不是固定的?如果我能得到它的一帧,我如何解开播放?是不是要解压,不过我不知解压算法。

KiteJohn 2001-11-17 09:06:38
那兄长助我!!!给我提供一个方向也可???
...全文
221 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifu 2001-11-28
  • 打赏
  • 举报
回复
如果方便的话,你把代码发过来,我看看,这样我也不知道。
lifu@citiz.net
这种程序同步可重要了。
接收和播放之间的尤其是!
你的那个黑屏出来了吗?
就是初始化的那个?
最好发过来给我,不然说不清呀
KiteJohn 2001-11-27
  • 打赏
  • 举报
回复
lifu救 我。。。。。!!!
我的接收程是一个新生成线程,我在线程中不断调用以下对象播放接收的数据,但不到一会就出错了,Unhanded exception in my.exe (quartz.dll) 0xc00000005 :acess volation
跟踪定位在以下几个位:
1、 hr = m_pFG->AddFilter(m_rdr, NULL);
2。 stop() ....的 SAFE_RELEASE(m_pFG);

在主线程昊是这样处理的:(主要控制结构):
while(pView->m_bThreadRun){
if(recv(pView->m_SockClient, BufHeader, 2327, 0) != SOCKET_ERROR){
memcpy(&ServerHeader, BufHeader, 3);
if(ServerHeader.cMagic[0] == 'T' &&
ServerHeader.cMagic[1] == 'R' && ServerHeader.byClass == 2){
nCount=nCount +1;
memcpy(&DataStream[nCount], BufHeader + 3, 2324);
if (nCount>=31){
nCount=0;
if (pView->m_MediaPlay)
{
pView->m_MediaPlay->Stop();

//delete pView->m_MediaPlay;
//pView->m_MediaPlay=new CMediaPlay(pView->m_hWnd);
pView->m_MediaPlay->PlayVideo((LPBYTE)DataStream,32*2324);
}
}
}else{
//::Me



以下是CMediaPlay的代码。。。。。。
// MediaPlay.cpp: implementation of the CMediaPlay class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include <dshow.h>
#include <streams.h>
#include "asyncio.h"
#include "asyncrdr.h"
#include "memfile.h"
#include "AsyncTest.h"
#include "MediaPlay.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMediaPlay::CMediaPlay(HWND hwnd)
{
m_pbMem = new BYTE[2324 * 32];
m_pVW=NULL;
m_pMC=NULL;
m_pME=NULL;
m_pFG=NULL;
m_hWnd=hwnd;
m_Run=false;
m_pBuilder=NULL;
m_mt.majortype = MEDIATYPE_Stream;
m_mt.subtype = MEDIASUBTYPE_MPEG1System;
m_uliSize.HighPart=0;
m_uliSize.LowPart=0;
init();

}

HRESULT CMediaPlay:: PlayVideo(LPBYTE pbData, LONG llLength)
{
//拷贝内存
if (!m_pFG)
init();

if(!m_pbMem) return FALSE;

memcpy(m_pbMem,pbData,llLength);

m_uliSize.LowPart=(DWORD)llLength;

HRESULT hr = S_OK;
CMemStream Stream(m_pbMem,(LONGLONG)m_uliSize.QuadPart, 28/*INFINITE*/);
CMemReader *m_rdr = new CMemReader(&Stream, &m_mt, &hr);
if(m_rdr==NULL){
delete m_rdr;
return S_FALSE;
}
m_rdr->AddRef();
hr = m_pFG->AddFilter(m_rdr, NULL);

//SAFE_RELEASE(m_pBuilder);
hr = m_pFG->QueryInterface(IID_IGraphBuilder, (void **)&m_pBuilder);
if (m_pBuilder)
hr = m_pBuilder->Render(m_rdr->GetPin(0));
hr=m_pFG->QueryInterface(IID_IMediaControl, (void **)&m_pMC);

hr=m_pFG->QueryInterface(IID_IMediaEvent, (void **)&m_pME);

hr=m_pFG->QueryInterface(IID_IVideoWindow,(void **)&m_pVW);

if (m_hWnd){
m_pVW->put_Owner((OAHWND)m_hWnd);
RECT rect;
::GetClientRect(m_hWnd,&rect);
m_pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
m_pVW->SetWindowPosition(rect.left,rect.top,rect.right,rect.bottom);
m_pVW->put_MessageDrain(NULL);
}

OAEVENT oEvent;
hr = m_pME->GetEventHandle(&oEvent);
if (SUCCEEDED(hr)) {
hr = m_pMC->Run();
}
if (SUCCEEDED(hr)) {
m_Run=true;
LONG levCode;
hr = m_pME->WaitForCompletion(INFINITE, &levCode);
}
//m_pFG->RemoveFilter(m_rdr);
m_rdr->Release();
delete m_rdr;
return hr;
}

CMediaPlay ::~CMediaPlay()
{
if(m_pbMem) delete m_pbMem;
SAFE_RELEASE(m_pMC);
/*
if(m_Run && m_pMC)
m_pMC->Stop();*/

SAFE_RELEASE(m_pME);
SAFE_RELEASE(m_pVW);
SAFE_RELEASE(m_pBuilder);
SAFE_RELEASE(m_pFG);
// SAFE_RELEASE(m_pFG);

}

BOOL CMediaPlay::ChangeWindow()
{
if ((!m_hWnd) || (!m_pMC) || (!m_pVW))
return false;
RECT rect;
::GetClientRect(m_hWnd,&rect);
HRESULT hr=m_pVW->SetWindowPosition(rect.left,rect.right,rect.right,rect.bottom);
if (FAILED(hr))
return false;
return true;
}

HRESULT CMediaPlay::Stop()
{
if(m_pVW)
{
m_pVW->put_Visible(OAFALSE);
m_pVW->put_Owner(NULL);
}
FILTER_STATE xxx;
/* if (m_pMC){
m_pMC->GetState(1000,(OAFilterState*)&xxx);
m_pMC->Stop();
while(1){
m_pMC->GetState(1000,(OAFilterState*)&xxx);
if(xxx==State_Stopped) break;
}
}*/


m_Run=false;

SAFE_RELEASE(m_pME);
SAFE_RELEASE(m_pVW);
SAFE_RELEASE(m_pMC);
SAFE_RELEASE(m_pBuilder);
//SAFE_RELEASE(m_pFG);






return S_OK;
}

BOOL CMediaPlay::init()
{
HRESULT hr=CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC,
IID_IFilterGraph,
(void**)&m_pFG);
if(FAILED(hr)){
return false;
}
return true;
}
KiteJohn 2001-11-27
  • 打赏
  • 举报
回复
How to add score to you all ????
lifu 2001-11-21
  • 打赏
  • 举报
回复
memfile以指定的速率将文件读入内存并播放这个文件。为了做到这点,它创建一个过滤器实例,把文件加入过滤器图,并渲染过滤器的输出pin。你 修改CAsyncStream,把READ改一下,让他
读你的缓存就可以了,他就自己去放了

lifu 2001-11-21
  • 打赏
  • 举报
回复
mpeg1的的头要32k,一般我们的报都很小的,不划算。你受到后在缓存里直接方就行了。
lifu 2001-11-21
  • 打赏
  • 举报
回复
呵呵,这样肯定会成功的呀!
第一次需要文件头的,你如果没有就找一个mpeg1文件读32k作为文件头,以后就不要了。缓存里的数据无特殊要求。
KiteJohn 2001-11-21
  • 打赏
  • 举报
回复
to:lifu:
我细读了CAsyncStream及相关的信息,好象并不要文件头,将流缓冲给它,并说明媒体的类型就行了。CAsyncStream是READ是virtual=0型,因此我重载就行了。缓冲里的数据不知有没有要求,比如送入的是帧系列(整帧系列)。多谢指点,完成后我发code给你。现在我只要75%的信心,你相信这样会成功吗?
lifu 2001-11-20
  • 打赏
  • 举报
回复
修改CAsyncStream呀,把READ改一下就行了
KiteJohn 2001-11-20
  • 打赏
  • 举报
回复
to:lifu:我想将收来的每个数据包与文件头接合,然后送入播放,实际就是一个一个的小文件播放。这样播放效果可能差。这样可取不可呢?
KiteJohn 2001-11-19
  • 打赏
  • 举报
回复
To:hongyucn: 我只处理video.
KiteJohn 2001-11-19
  • 打赏
  • 举报
回复
To :hongyucn,lifu:
分包分发再组包,目前是按这个思路做。问题是我在客户端组包后是生成文件播放或是可能将包解码播放。因为是实时监视系统,不能有太大的延迟。我亲自解码可能难做到了。lifu提的“dshow的memfile”,是用共享文件,一边收写文件,一边放?还是IMemAllocator?lifu可否给我补充一下?我用dshow难以处理底层,可能是认识不够。我只知道以文件作为入口,或是用设备作为入口。不知道什么地方可以让我将数据包往里塞就行了。看了半天IPin还是找不出什么名堂来。
非常感激两位的协助!!!!
lifu 2001-11-19
  • 打赏
  • 举报
回复
mpeg1 分i帧,p帧,B帧,D帧.不会一样大的。帧的起始码是0000100,你可一用这个来分帧。
其实你不用分的,按包发就行了,客户端用dshow的memfile改一下就可以接收了,他自己会解码的。
hongyucn 2001-11-18
  • 打赏
  • 举报
回复
再说一点,超级解霸的VOD系统就是用广播来实现的,我建议你用多波(主播),来实现最好在服务器端把广播关掉,这设计到底层的好多东西,至于原因,非常复杂,反正可以提高传输质量,但是这样一来的话,别人就ping不通你了!如果还要做网管的话,建议用SNMP,你也许会问,把广播关了,不就不能通讯了吗?其实你可以自己做ARP地址解析的!
hongyucn 2001-11-18
  • 打赏
  • 举报
回复
其实有一个非常非常简单的方法,如果能在服务器端将数据分包,在客户机端再组包,用DirectShow就能很流畅的解决解码的问题,我就是用这种方式实现网络监控的,但是因为我不用音频,所以用的是DirectDraw
KiteJohn 2001-11-18
  • 打赏
  • 举报
回复
To yinx:我到mpeg.telecomitalialab.com去了,可是我想得到他们的标准,链过去要我给钱才能取得。我要解码可能是做不到罗,实现网上播放MPEG,老兄可提供其它方法参考或建议吗?好感激你有关注。
我这样想:当我从服务器得到数据后组成文件(小的)播放,但这样速度可能不可预料,采用传图片可能更不现实。如果有第三方的工具来解压,比如一个开发包也可。好郁闷!!!!!!!
yinx 2001-11-18
  • 打赏
  • 举报
回复
建议到www.mpeg.org 看看

http://mpeg.telecomitalialab.com/ mpeg的官方网站
KiteJohn 2001-11-18
  • 打赏
  • 举报
回复
up,.......

256

社区成员

发帖
与我相关
我的任务
社区描述
其他产品/厂家
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧