无码人妻久久一区二区三区免费丨,一本色道久久88加勒比—综合,亚洲精品国精品久久99热一http://www.shnenglu.com/dvb-dvb/mepg 2, iptv, stream parse,mov,mxf,gxf,ac3,aac zh-cnThu, 08 May 2025 03:55:03 GMTThu, 08 May 2025 03:55:03 GMT60Videowindow: directshow 播放畫面刷新問題http://www.shnenglu.com/dvb-dvb/archive/2010/03/12/Videowindow.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Fri, 12 Mar 2010 01:20:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2010/03/12/Videowindow.htmlhttp://www.shnenglu.com/dvb-dvb/comments/109479.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2010/03/12/Videowindow.html#Feedback2http://www.shnenglu.com/dvb-dvb/comments/commentRss/109479.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/109479.html

Videowindow: directshow播放畫面刷新問題,

開始播放后畫面會出來,一切正?!,F(xiàn)在的問題是

當(dāng)別的未最大化的窗口半遮或全遮住視頻窗口,畫面都能正常刷新, 只有拖動一下dialog畫面才會出來

但是:當(dāng)此dialog最小化,再恢復(fù)時, 能正常刷新

我出現(xiàn)的問題,和下列問題都不相同,導(dǎo)致處理方法也不相同.

大多數(shù)刷新問題,都可以從下面這個帖子,去解決.

http://blog.csdn.net/arthurlee/archive/2008/10/09/3043977.aspx

http://www.qqgb.com/Program/VC/VCJQ/Program_176331.html

 

pVidWin-> put_Owner((OAHWND)GetDlgItem(IDC_VW_FRAME)-> GetSafeHwnd());  
2
、GetDlgItem(IDC_VW_FRAME)-> ModifyStyle(0,       WS_CLIPCHILDREN);  
3
、OnPaint       不用動  
4
OnEraseBkgnd       加如下代碼  
           
            RECT       rect;  
            GetDlgItem(IDC_VW_FRAME)-> GetWindowRect(&rect);  
            ScreenToClient(&rect);  
            pDC->   ExcludeClipRect(&rect);  
            return       CDialog::OnEraseBkgnd(pDC);  

 

可是我的窗口不要上面這四條,只要把窗口屬性設(shè)置成

DWORD m_dwExStyle=WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR| WS_EX_WINDOWEDGE;

     m_pPlayWnd->CreateEx(m_dwExStyle,

         oClassName,_T("Play"),

         WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN| WS_CLIPSIBLINGS|WS_POPUP,

我的程序是這樣的:一個dialog里面 new CPlaybackwnd

class CPlaybackwnd : public CWnd

CPlaybackwnd這個里面, 增加,m_pVW->put_WindowStyle ,,

m_pVW->put_Owner((OAHWND)(GetSafeHwnd()));

但是,當(dāng)把playbackwnd的屬性,設(shè)置成dialogWS_POPUP, WS_CHILD,窗口移動時位置就不對了,

我在dialog里面增加了,

void CDialog::OnWindowPosChanged(WINDOWPOS* lpwndpos)

{

     __super::OnWindowPosChanged(lpwndpos);

 

     if (m_pPlayWnd)

     {

         int x = m_nWnd_x + lpwndpos->x;

         int y = m_nWnd_y + lpwndpos->y;

         int cx = m_nWnd_cx;

         int cy = m_nWnd_cy;

         m_pPlayWnd->MoveWindow(x,y,cx,cy);

     }

}

但是,這個程序在win2000下會出現(xiàn)問題,其它操作系統(tǒng)是好的.

win2000,窗口坐標(biāo)是亂了, dialogplaybackwnd的相對位置錯誤了,目前還沒有解決.

 



TS,MPEG2,dvbc專家 2010-03-12 09:20 發(fā)表評論
]]>
MXF HeadMediaData,MXF Preface MXF文件格式, MXF文件解析,MXF Parsehttp://www.shnenglu.com/dvb-dvb/archive/2009/12/09/MXFHeadMediaData.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Wed, 09 Dec 2009 00:59:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/12/09/MXFHeadMediaData.htmlhttp://www.shnenglu.com/dvb-dvb/comments/102830.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/12/09/MXFHeadMediaData.html#Feedback9http://www.shnenglu.com/dvb-dvb/comments/commentRss/102830.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/102830.html

MXF class列舉:


class CMXFDataStruct
{
public:
 CMXFDataStruct(void);
 ~CMXFDataStruct(void);

 BYTE *pGeneraltion_UID;
 BYTE *pInstance_ID;

 CMarkup _ElementXML;
 CString _strElementName;
 CString _strTypeBase;
};
typedef std::list< CMXFDataStruct *> MXFDATASTRUCTLIST;

typedef struct MPCDeviceTag
{
 char  szDeviceName[16];  /*device host name for load balance.*/
 int  nType;      /*device type for reserved.*/
 char szVersion[16];  /*reserved for device version. 4.2.35.6*/
 BYTE    bPDVersion;                 /* PD Version*/
 BYTE    bVixVersion;                /* Vix Version*/
 DWORD  nIndex;
}MPCDEVICE;
#define MPC_DEVICE_TOTAL_COUNT 4
typedef std::list< MPCDEVICE > MPCDEVICELIST;


//mxf packet header(16 BYTES)
typedef struct MXF_PACKETHEADTAG_
{
 unsigned char sync1;
 unsigned char sync2;
 unsigned char sync3;
 unsigned char sync4;

 unsigned char content[9];
 unsigned char PackKind;
 unsigned char State;
 unsigned char reserver;
 unsigned char BER_size;//the length
 unsigned char len[3];//the length = packet length(16) + payload length
}MXF_PACKETHEAD, *PMXF_PACKETHEAD;


//mxf Partition packet (16 BYTES)
typedef struct MXF_PARTITIONTAG_
{
 unsigned char Major_ver[2];
 unsigned char Min_ver[2];
 unsigned char KAG_size[4];
 unsigned char This_Partition[8];

 unsigned char Pre_Partition[8];
 unsigned char Foot_Partition[8];
 unsigned char HeadByteCount[8];
 BYTE IndexByteCount[8];
 BYTE indexSID[4];
 BYTE BodyOffset[8];
 BYTE BodySID[4];
 BYTE Operational[16];

}MXF_PARTITION, *PMXF_PARTITION;

//mxf Partition packet (16 BYTES)
typedef struct MXF_Local_TAG_

 BYTE LocalNumber[4];
 BYTE LocalSize[4];
 BYTE Guid[16];
}MXF_Local_TAG, *PMXF_Local_TAG;

//mxf Partition packet (16 BYTES)
typedef struct MXF_Local_TAG2_

 BYTE Local_tag[2];
 BYTE Guid[16];
}MXF_Local_TAG2, *PMXF_Local_TAG2;


enum Find_condition_mxf
{
 g_nFind_Identification = 1,
 g_nFind_pack,
 g_nFind_track,
 g_nFind_sequence,
 g_nFind_SourceClip,
 g_nFind_multipl_desc,
 g_nFind_sub_descriptor,
 g_nFind_Essence_container_data
};

typedef struct MXF_RP224_TAG_ // for Sequence

 BYTE CheckPart;
 BYTE Smpte_Index;
 LPTSTR lpContent;// Content[51];
 LPTSTR lpDescribe;// Describe[51]; // 16 * 3 + 1
}MXF_RP224_TAG, *PMXF_RP224_TAG;

 

class CMXF_SourceClip :public CMXFDataStruct // for SourceClip
{
public: 
 CMXF_SourceClip();
 ~CMXF_SourceClip();

 BYTE *pSourcePackageID;
 BYTE ElementType;
 DWORD Source_trackID;
};

typedef std::list< CMXF_SourceClip *> MXF_SOURCECLIP_LIST;

class CMXF_Sequence:public CMXFDataStruct // for Sequence
{
public: 
 CMXF_Sequence();
 ~CMXF_Sequence();  
 BYTE Seq_Type;
 MXF_SOURCECLIP_LIST ListSourceClip;
};

typedef std::list< CMXF_Sequence *> MXF_SEQUENCE_LIST;

class CMXF_Track :public CMXFDataStruct // for track
{
public: 
 CMXF_Track();
 ~CMXF_Track();
 CMXF_Sequence *pSequence; 
 DWORD Track_Number;
 BYTE  Track_Type; // 0=UNKNOWN, 3= timecode trick , 4= picture, 5= sound, 6= data,
   DWORD Track_ID;
};

typedef std::list< CMXF_Track *> MXF_TRACK_LIST;

class CMXF_Base_Descriptor :public CMXFDataStruct // Base_Descriptor

public:
 CMXF_Base_Descriptor();
 ~CMXF_Base_Descriptor();
 BYTE *pEsssence_Container;
 BYTE Smpte_Index;
};
class CMXF_Sub_descriptor:public CMXF_Base_Descriptor //Material_pack or source pack
{
public: 
 CMXF_Sub_descriptor();
 ~CMXF_Sub_descriptor();
 DWORD Link_Track_ID;
};

typedef std::list< CMXF_Sub_descriptor *> MXF_SUB_DESCRIPTOR_LIST;

class CMXF_Multiple_desc :public CMXF_Base_Descriptor //Multiple descriptor

public:
 CMXF_Multiple_desc();
 ~CMXF_Multiple_desc();
 MXF_SUB_DESCRIPTOR_LIST ListSubDesc;
 };

class CMXF_Package :public CMXFDataStruct //Material_pack or source pack

public:
 CMXF_Package();
 ~CMXF_Package();

 CMXF_Multiple_desc *pMultiple_desc;
 BYTE *pPackageUID;

 MXF_TRACK_LIST Listtrack;
 BYTE IsMaterial_pack; //0_unknow ,1_Material package, 2_ source package.
}; 
class CMXF_SourcePackage_ :public CMXF_Package // source pack

public:
 CMXF_SourcePackage_();
 ~CMXF_SourcePackage_();
};

class CMXF_Material_Package_ :public CMXF_Package //Material_pack

public:
 CMXF_Material_Package_();
 ~CMXF_Material_Package_(); 
};

typedef std::list< CMXF_Package *> MXF_PACK_LIST;

 

class CMXF_EssenceContainerData :public CMXFDataStruct//EssenceContainerData
{
public:
 CMXF_EssenceContainerData();
 ~CMXF_EssenceContainerData();     

 DWORD BodySID;
 DWORD IndexSID;
 BYTE *pLinkedPackageUID;

};
             
typedef std::list< CMXF_EssenceContainerData *> MXF_ESSENCECONTAINERDATA_LIST;

class CMXF_Content_storage :public CMXFDataStruct //Content_storage

public:
 CMXF_Content_storage();
 ~CMXF_Content_storage();

 MXF_PACK_LIST listPackage;                            
 MXF_ESSENCECONTAINERDATA_LIST listEssenceContainerData;
};

class CMXF_Identification :public CMXFDataStruct//Identification
{
public:
 CMXF_Identification();
 ~CMXF_Identification();     
};

typedef std::list< CMXF_Identification *> MXF_IDENTIFICATION_LIST;

class CMXF_Preface :public CMXFDataStruct//Material_pack or source pack
{
public:
 CMXF_Preface();
 ~CMXF_Preface();

 MXF_IDENTIFICATION_LIST listIdentification;
 CMXF_Content_storage Content_storage;
};

class CMXF_Production_Framework :public CMXFDataStruct//CMXF_Production_Framework
{
public:
 CMXF_Production_Framework();
 ~CMXF_Production_Framework();

};


class CMXFBaseTable :
    public CMXFBaseFun
{
public:
    CMXFBaseTable(void);
    ~CMXFBaseTable(void);
    BOOL Init();

    int Prase_Identification(BYTE *pBuf,DWORD PayloadLen);
    int Prase_Preface(BYTE *pBuf,DWORD PayloadLen);
    int Prase_sequence(BYTE *pBuf,DWORD PayloadLen);
    int Prase_RealData(BYTE *pBuf,DWORD PayloadLen);
    int Prase_SourceClip(BYTE *pBuf,DWORD PayloadLen);
    int Prase_TimeCode_Component(BYTE *pBuf,DWORD PayloadLen);
    int Prase_Content_storage(BYTE *pBuf,DWORD PayloadLen);
    int Prase_Material_pack(BYTE *pBuf,DWORD PayloadLen);
    int Prase_Track(BYTE *pBuf,DWORD PayloadLen,CString strPackageName);
    int PraseEssence_Container_data(BYTE *pBuf,DWORD PayloadLen);
    int PraseMetadata_CDCI_Essence_Desc(BYTE *pBuf,DWORD PayloadLen,BYTE nMpeg_desc = 0);
    int Prase_SourcePack(BYTE *pBuf,DWORD PayloadLen);
    int PraseSound_Essence_desc(BYTE *pBuf,DWORD PayloadLen,BYTE nIsPbuf47 = 0);
    int Prase_Multiple_desc(BYTE *pBuf,DWORD PayloadLen);
    int Prase_Generic_pack(BYTE *pBuf,DWORD PayloadLen,CString strPackageName,DWORD &CurOffset,BOOL ISMaterial_pack);
    int Prase_File_Descriptor(BYTE *pBuf,DWORD PayloadLen,CString strPackageName,DWORD &CurOffset,CMXF_Base_Descriptor *pMulti_desc,BOOL bDefaultIsError = TRUE);
    int Prase_Generic_Picture(BYTE *pBuf,DWORD PayloadLen,CString strPackageName,DWORD &CurOffset,BOOL bDefaultIsError = TRUE);
    int CDCIEssenceDescriptorType(BYTE *pBuf,DWORD PayloadLen,CString strPackageName,DWORD &CurOffset,BOOL bDefaultIsError = TRUE);
    int Prase_Generic_Sound(BYTE *pBuf,DWORD PayloadLen,CString strPackageName,DWORD &CurOffset,BOOL bDefaultIsError = TRUE);

    int Prase_Unknow_Sound(BYTE *pBuf,DWORD PayloadLen,CString strPackageName,DWORD &CurOffset,BOOL bDefaultIsError = TRUE);
    int Mpeg_Video_Descriptor(BYTE *pBuf,DWORD PayloadLen,CString strPackageName,DWORD &CurOffset,BOOL bDefaultIsErro = TRUE);

    int Prase_DM_Segment(BYTE *pBuf,DWORD PayloadLen);
    int Prase_DM_SourceClip(BYTE *pBuf,DWORD PayloadLen);

    void Release_all_list();
public:
    
    TracksMap *m_pTracksMap;
protected:
    CMXF_Preface *m_pPreface;

    //For previous package,It is not parsed.
    MXF_SEQUENCE_LIST m_Unknow_seqList;

    //For previous package,Its ID not found.
    MXF_SOURCECLIP_LIST m_Unknow_SourClipList;

    MXF_SUB_DESCRIPTOR_LIST m_Unknow_SubDescList;

private:
    int    CheckGeneration_UID(CString strLogName,BYTE *pBuf,DWORD PayloadLen);



TS,MPEG2,dvbc專家 2009-12-09 08:59 發(fā)表評論
]]>
MXF文件格式,MXF KLV,MXF文件基本知識,MXF文件 術(shù)語 概念http://www.shnenglu.com/dvb-dvb/archive/2009/12/04/MXF.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Fri, 04 Dec 2009 08:25:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/12/04/MXF.htmlhttp://www.shnenglu.com/dvb-dvb/comments/102541.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/12/04/MXF.html#Feedback4http://www.shnenglu.com/dvb-dvb/comments/commentRss/102541.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/102541.html
  MXF格式已經(jīng)被推出幾年了, 從當(dāng)初一個陌生的不為人們 重視的格式 逐漸獲得了業(yè)內(nèi)人士的認(rèn)知和認(rèn)可, 現(xiàn)如今正被廣泛應(yīng)用于廣播電視與后期制作領(lǐng)域, 且有不斷擴(kuò)大之勢, 松下公司推出的基于PII卡的 無磁帶式標(biāo)清攝像機(jī), 它所采用的媒體格式, 正是MXF。
  什么是MXF? MXF如何為我們提供便利? MXF與IMX格式的關(guān)系? 所有的多媒體文件格式 都會向MXF靠攏嗎? 所有的MXF文件都是兼容的嗎? 我們需要一步步來解釋這些問題。

問題1:什么是 MXF?
MXF 是英文 Material Exchange Format(文件交換格式)的詞頭縮寫, 這個名字本身就道出了它的作用是為數(shù)據(jù)的發(fā)送者和接收者 建立不同數(shù)據(jù)格式轉(zhuǎn)換的通用標(biāo)準(zhǔn)。 它可在專業(yè)廣播電視環(huán)境下 轉(zhuǎn)換媒體文件, 本質(zhì)上是一種外殼格式。 為什么這樣說呢?象PC平臺的AVI多媒體格式, 它是一種對音視頻 進(jìn)行中等壓縮和打包, 介乎于壓縮和無壓縮之間的 文件格式。 但MXF超出了一般AVI的范疇。例如: MXF被設(shè)計可用于 包裝MPEG2數(shù)據(jù)流、 DV數(shù)據(jù)流、 YUV數(shù)據(jù)流、 PCM音頻文件 以及幾種格式的數(shù)據(jù)庫文件(同步或非同步模式)。 MXF可以同時處理打包多條軌道的 音視頻和數(shù)據(jù)庫文件, 它被設(shè)計為既支持流媒體傳輸 又支持文件的傳輸。所以它可以改善網(wǎng)絡(luò)環(huán)境 因缺乏標(biāo)準(zhǔn)的文件格式 而受阻礙的局面。 實際上, 在MXF出現(xiàn)之前, 有過類似的格式, 例如OMF(Open Media Frame) 開放媒體框架格式, 它就是一個包含多軌媒體信息的 文件格式, 但OMF更象是AVI是為了編輯而設(shè)計,缺少MXF的網(wǎng)絡(luò)流動性。

問題2: MXF 對我們有什么幫助?
  目前沒有任何一種文 件外殼格式 可以滿足廣播制作的所有需求。 而MXF被設(shè)計為可以滿足絕大數(shù)當(dāng)前 和未來的媒體交換的需求。我們期望看到媒體在 不同的載體上交換, 包括:音視頻服務(wù)器、 離線和近線存儲系統(tǒng)、 編輯工作站、 錄像設(shè)備 (帶有以太網(wǎng)文件傳出能力)、流媒文件格式等。 最重要的是MXF允許不同的公司 (應(yīng)用程序) 間不需依賴特定的文件格式 就能交換資源。 當(dāng)然,這只是一個美好的愿望, 但是,著名的公司的行動 已經(jīng)使我們看到了希望, 品尼高公司(Pinnacle) 最早在Liquid后期編輯系列產(chǎn)品中 就支持了這個格式,因為它需要用OMF在它的非編系統(tǒng)和 播出系統(tǒng) (例如Palladium) 間建立無縫的橋梁, 愛維德(Avid)在最新的Xpress編輯系統(tǒng)中 也表明支持MXF (要知道, 它一直是OMF最強(qiáng)的支持者), 而蘋果公司著名的非編軟件 Final Cut Pro最新推出的5.0版本中, 已經(jīng)可以直接導(dǎo)入MXF了。

問題3: MXF 會取代現(xiàn)在已廣泛使用的 文件格式嗎?
也許需要等一段時間, 就象物理學(xué)家牛頓提出的慣性定律: 除非受到外力, 物體不會改變他們的狀態(tài)。 現(xiàn)如今, MPEG、AVI、GXF、QuikeTime和DIF 廣泛應(yīng)用于硬盤和磁帶存儲。 如果將所有的格式在短時間內(nèi) 都轉(zhuǎn)換為MXF,那需要巨大的外界力量。 MXF將首先被新設(shè)備使用, 包括對音視頻設(shè)備 和非線性設(shè)備的升級 (例如PII攝像機(jī))。 MXF也可能被做為存儲格式使用, 但需要與其他文件格式共存, 直到那些格式都轉(zhuǎn)化為MXF, 所以MXF的普及需要一定的時間。

問題4: 所有的MXF文件都相互兼容嗎?
不, 因為MXF是一個外殼格式 而不是壓縮格式, 所以并不能保證每一款MXF文件 都能被任何一種解碼器識別。例如,將D10格式的MPEG-2文件轉(zhuǎn)換為 MXF文件, 而接收端的設(shè)備只裝配了 DV25 格式的解碼器, 此時,MXF是不兼容的(就象我們家中的Media Player播放器 也經(jīng)常不能觀看一些特殊編碼的 AVI文件一樣)。 要做到真正的兼容,發(fā)送端和接受端設(shè)備必須支持相同的 音視頻壓縮或無壓縮格式 以及數(shù)據(jù)格式。 MXF的操作規(guī)范定義了各種 MXF 的特性, 壓縮類型, 數(shù)據(jù)結(jié)構(gòu),例如: 一個規(guī)范允許支持 D10 MPEG-2 和多軌音頻格式, 另一種規(guī)范則支持DV格式 (SMTPE 314M)。當(dāng)然,SMPTE將不斷增加新的 MXF 支持的格式以滿足行業(yè)的需求。 問題的重點是: MXF雖然不能保證100%的兼容,當(dāng)從長遠(yuǎn)講它正在向這方面努力。

問題5: MXF與IMX的關(guān)系
  IMX是索尼公司為一種 帶寬的 磁帶格式起的名字, 這種磁帶被用于索尼公司那些支持MPEG D10格式 或D10數(shù)據(jù)流的產(chǎn)品 (SMPTE 365M和SMPTE 356M), 它們以50M/秒的速率傳輸數(shù)據(jù) (在有些產(chǎn)品上達(dá)到 30M或40M的速率)。例如:索尼MSW-2000系列就是支持MPEG D10格式的 IMX錄像機(jī)。 D10數(shù)據(jù)流是一種只包含一系列MPEG-2 I幀的格式,這些I幀具備相同的數(shù)據(jù)量, 這種格式非常適合錄像設(shè)備。 這種MPEG格式同樣也是SDTI-CP傳輸協(xié)議 (SMPTE 331M)中一種標(biāo)準(zhǔn)的壓縮格式。 IMX本身不是指文件格式或壓縮格式, 它僅僅是一個帶寬的類型, 這一點和MXF很相象。 所以,如果有一天推出MXF的錄像帶, 也沒有什么新鮮。

問題6: 在MXF中KLV是如何 做為一個尺度的?
  KLV代表關(guān)鍵幀(key), 長度(length) 和取值(value)。 它起源于最初的程式化概念。 KLV做為一種連續(xù)的、 關(guān)聯(lián)的包含分段信息的數(shù)據(jù)包 被使用多年了。
所以, KLV打包方式提供了一種 分割用戶數(shù)據(jù)和確認(rèn)用戶數(shù)據(jù)類型 (key)的方式。 長度信息表明了 實際數(shù)據(jù)的字節(jié)長度。 SMPTE 336M定義了 KLV被應(yīng)用的規(guī)范。 關(guān)鍵幀是SMPTE一個普遍的標(biāo)準(zhǔn) (SMPTE 298M)。 所以, 關(guān)鍵幀定義了特定音頻的參數(shù)值類型。 MXF是不同類型的連續(xù)的 KLV序列的組合, 包括: 音頻、 視頻、 索引標(biāo)志、 文件頭和所有的索引數(shù)據(jù)。

問題7: MXF的主要應(yīng)用方向 是文件存儲嗎?
不, MXF主要是一種交換格式, 雖然它確實做為 一種磁盤格式被使用, 但這個文件標(biāo)準(zhǔn)主要是 為了在流轉(zhuǎn)中兼容。 下面的事例表明為什么以 MXF本格式儲存不具備優(yōu)勢。 設(shè)想傳輸一個混合音頻 和視頻的MXF文件, 一臺非線性編輯設(shè)備 為接受上面的MXF文件,必須確定MXF文件中的音視頻數(shù)據(jù), 并將它們做為 分割的文件重新寫在硬盤中 (例如:分割為音頻的 WAV文件和 MPEG-2的MXF文件)。選擇數(shù)據(jù)指針時也需要從 MXF文件中將數(shù)據(jù)指針 移出到本地的數(shù)據(jù)庫中, 這樣反復(fù)地重復(fù)多步操作, 將原來簡單的媒體格式讀取 復(fù)雜化了,所以基于這種原因, 純粹的硬盤上的 MXF文件不具有太大的使用價值。

  但另一方面 MXF文件分區(qū)的實際字段大小 又使它在磁盤存儲中 具備一定的優(yōu)勢。 在一些系統(tǒng)中需要4K的字段空間 (或其他數(shù)量)去讀寫文件, MXF不必把分區(qū)按4K分割, 所以一些版本的 MXF文件在儲存時 可以減少硬盤的讀寫次數(shù)。
  這就是說, 當(dāng)把大量的媒體文件和 數(shù)據(jù)結(jié)構(gòu)按MXF存取時, MXF還是有優(yōu)勢的, 所以它適合大量的網(wǎng)絡(luò)轉(zhuǎn)移。 實際工作中為確保兼容性, 需要將MXF做為文件 或數(shù)據(jù)流來交換, 并允許操作規(guī)范間的轉(zhuǎn)換。

問題8: MXF同時支持文件 和數(shù)據(jù)流傳輸嗎?
  是的。 數(shù)據(jù)流和文件傳輸 意味著同時支持在一個源頭 向一個或不同的終端發(fā)送信息。 它們有各自的應(yīng)用領(lǐng)域, 并可以共存。 文件和數(shù)據(jù)流又不同的用途:
文件:
 ?。?) 通過不同步式網(wǎng)絡(luò)發(fā)送 (例如以太網(wǎng)和局域網(wǎng))
 ?。?) 100%的兼容通訊協(xié)議,如FTP
 ?。?) 同步數(shù)據(jù)傳輸, 包括低于或高于實時的速率
 ?。?) 點到點或一點到多點的傳輸
數(shù)據(jù)流:
 ?。?) 素材被做為數(shù)據(jù)流 通過線纜以特定的速率 發(fā)送給一個或多個終端工作站, 通常是通過專門的、 不兼容的協(xié)議 (如UDP)來實現(xiàn)。 雖然數(shù)據(jù)流可以通過 兼容性很好的TCP方式傳輸, 但對許多處理數(shù)據(jù)流的 應(yīng)用程序來說, 那是不實用的。
  (2) 數(shù)據(jù)流通常帶著 時鐘基準(zhǔn)信號被發(fā)送, 以便可以立即在 終端工作站上被解碼。
 ?。?) 任何在通道內(nèi)的錯誤 可以使用附加的ECC 或其他類型的校錯方式被校正。

> 對大多數(shù)應(yīng)用程序來說, 文件傳輸有它的優(yōu)勢, 因為它可保證傳輸100%的兼容。
> 流傳輸方式則在 需要實時傳輸?shù)念I(lǐng)域 被廣泛使用。

問題9: MXF與AAF的關(guān)系?
AAF是高級編著格式, 它是被AAF協(xié)會的會員設(shè)計制定的。 AAF文件是通過MXF的規(guī)范被創(chuàng)建的, 可以被支持AAF的程序打開。 此外, MXF文件可嵌入到AAF中, AAF擴(kuò)展了MXF的用途, 但它沒有實質(zhì)的進(jìn)步。 AAF主要用于承載那些 復(fù)雜的媒體片斷的合成信息。

問題10: 我們研究MXF的意圖是什么?
  我們支持MXF, 是為了獲得它的便利:
 ?。?) 使用FTP或其他方式 在前端設(shè)備上導(dǎo)入導(dǎo)出MXF文件。
  (2) 通過轉(zhuǎn)碼工作站 將現(xiàn)有的媒體文件加一個外殼, 使它獲得最大的兼容性, 通過局域網(wǎng)或萬維網(wǎng) 以不同的格式接受他們, 包括MXF本身。 大多數(shù)轉(zhuǎn)換工作比實時還快, 如果轉(zhuǎn)換過程中 沒有重新編碼的過程, 文件質(zhì)量就不會有任何損失。
  (3) 向近線或離線存儲設(shè)備存取文件

  當(dāng)然, 會不斷有更多的廠商將 MXF的特性加入到他們的產(chǎn)品中, 但同時也應(yīng)看到, MXF并非一個包治百病得萬能格式, 用其所能, 才能體現(xiàn)其真正價值。
本文為轉(zhuǎn)載: 原出處為: http://www.kmplayer.com/forums/archive/index.php/t-11293.html


TS,MPEG2,dvbc專家 2009-12-04 16:25 發(fā)表評論
]]>
MXF分析工具,MXF文件解析工具,MXF Parse tool,MXF loghttp://www.shnenglu.com/dvb-dvb/archive/2009/12/01/MXFParse.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Tue, 01 Dec 2009 00:36:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/12/01/MXFParse.htmlhttp://www.shnenglu.com/dvb-dvb/comments/102309.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/12/01/MXFParse.html#Feedback1http://www.shnenglu.com/dvb-dvb/comments/commentRss/102309.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/102309.html 請下載MXF分析工具, 如有問題,請看"About"的聯(lián)系地址.

/Files/dvb-dvb/Demuxer.rar



分析log如下:
Found MXF SYNC ,offset=0
 Find stream media info in InputPin
 Head_Partition: Packet_len=00000088 maj=0x1 Min=0x2 KAG_size=0x200 This_p=0x0 Pre_P=0x0 Foot_P=0x1aa200 Head Byte count =0x1c00 Index Byte count=0x0 ISID=0x0 BOffset=0x0 BID=0x1 Operation Par .06.0e.2b.34.04.01.01.01.0d.01.02.01.01.01.09.00 FileOffset 0x0
  Number=0x3 size=0x10
  essenceContainer: .06.0e.2b.34.04.01.01.02.0d.01.03.01.02.04.60.01: My error,no parse in RP224
  essenceContainer: .06.0e.2b.34.04.01.01.01.0d.01.03.01.02.06.01.00: My error,no parse in RP224
  essenceContainer: .06.0e.2b.34.04.01.01.03.0d.01.03.01.02.7f.01.00: My error,no parse in RP224
 Fill_items:len=00000150,FileOffset 0x9c
  Prase_Primer_pack: Packet_len=00000974 Number=86
 :000,Tag 0x01.02:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.08.00.00.00
 :001,Tag 0x02.01:UID .06.0e.2b.34.01.01.01.02.04.07.01.00.00.00.00.00
 :002,Tag 0x02.02:UID .06.0e.2b.34.01.01.01.02.07.02.02.01.01.03.00.00
 :003,Tag 0x06.01:UID .06.0e.2b.34.01.01.01.02.07.02.01.03.03.03.00.00
 :004,Tag 0x06.02:UID .06.0e.2b.34.01.01.01.02.05.30.04.04.01.00.00.00
 :005,Tag 0x10.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.06.09.00.00
 :006,Tag 0x11.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.03.01.00.00.00
 :007,Tag 0x11.02:UID .06.0e.2b.34.01.01.01.02.06.01.01.03.02.00.00.00
 :008,Tag 0x12.01:UID .06.0e.2b.34.01.01.01.02.07.02.01.03.01.04.00.00
 :009,Tag 0x15.01:UID .06.0e.2b.34.01.01.01.02.07.02.01.03.01.05.00.00
 :010,Tag 0x15.02:UID .06.0e.2b.34.01.01.01.02.04.04.01.01.02.06.00.00
 :011,Tag 0x15.03:UID .06.0e.2b.34.01.01.01.01.04.04.01.01.05.00.00.00
 :012,Tag 0x19.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.05.01.00.00
 :013,Tag 0x19.02:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.05.02.00.00
 :014,Tag 0x27.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.06.01.00.00.00
 :015,Tag 0x2f.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.06.03.00.00
 :016,Tag 0x30.01:UID .06.0e.2b.34.01.01.01.01.04.06.01.01.00.00.00.00
 :017,Tag 0x30.02:UID .06.0e.2b.34.01.01.01.01.04.06.01.02.00.00.00.00
 :018,Tag 0x30.04:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.01.02.00.00
 :019,Tag 0x30.05:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.01.03.00.00
 :020,Tag 0x30.06:UID .06.0e.2b.34.01.01.01.05.06.01.01.03.05.00.00.00
 :021,Tag 0x32.01:UID .06.0e.2b.34.01.01.01.02.04.01.06.01.00.00.00.00
 :022,Tag 0x32.02:UID .06.0e.2b.34.01.01.01.01.04.01.05.02.01.00.00.00
 :023,Tag 0x32.03:UID .06.0e.2b.34.01.01.01.01.04.01.05.02.02.00.00.00
 :024,Tag 0x32.04:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.07.00.00.00
 :025,Tag 0x32.05:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.08.00.00.00
 :026,Tag 0x32.06:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.09.00.00.00
 :027,Tag 0x32.07:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.0a.00.00.00
 :028,Tag 0x32.08:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.0b.00.00.00
 :029,Tag 0x32.09:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.0c.00.00.00
 :030,Tag 0x32.0a:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.0d.00.00.00
 :031,Tag 0x32.0b:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.0e.00.00.00
 :032,Tag 0x32.0c:UID .06.0e.2b.34.01.01.01.01.04.01.03.01.04.00.00.00
 :033,Tag 0x32.0d:UID .06.0e.2b.34.01.01.01.02.04.01.03.02.05.00.00.00
 :034,Tag 0x32.0e:UID .06.0e.2b.34.01.01.01.01.04.01.01.01.01.00.00.00
 :035,Tag 0x32.0f:UID .06.0e.2b.34.01.01.01.02.05.20.01.02.00.00.00.00
 :036,Tag 0x32.10:UID .06.0e.2b.34.01.01.01.02.04.01.02.01.01.01.02.00
 :037,Tag 0x32.11:UID .06.0e.2b.34.01.01.01.02.04.18.01.01.00.00.00.00
 :038,Tag 0x32.12:UID .06.0e.2b.34.01.01.01.02.04.01.03.01.06.00.00.00
 :039,Tag 0x32.13:UID .06.0e.2b.34.01.01.01.02.04.18.01.02.00.00.00.00
 :040,Tag 0x32.14:UID .06.0e.2b.34.01.01.01.02.04.18.01.03.00.00.00.00
 :041,Tag 0x32.15:UID .06.0e.2b.34.01.01.01.05.04.05.01.13.00.00.00.00
 :042,Tag 0x32.16:UID .06.0e.2b.34.01.01.01.05.04.01.03.02.08.00.00.00
 :043,Tag 0x32.17:UID .06.0e.2b.34.01.01.01.05.04.01.03.02.07.00.00.00
 :044,Tag 0x32.18:UID .06.0e.2b.34.01.01.01.05.04.01.03.02.09.00.00.00
 :045,Tag 0x33.01:UID .06.0e.2b.34.01.01.01.02.04.01.05.03.0a.00.00.00
 :046,Tag 0x33.02:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.05.00.00.00
 :047,Tag 0x33.03:UID .06.0e.2b.34.01.01.01.01.04.01.05.01.06.00.00.00
 :048,Tag 0x33.04:UID .06.0e.2b.34.01.01.01.01.04.01.05.03.03.00.00.00
 :049,Tag 0x33.05:UID .06.0e.2b.34.01.01.01.01.04.01.05.03.04.00.00.00
 :050,Tag 0x33.06:UID .06.0e.2b.34.01.01.01.02.04.01.05.03.05.00.00.00
 :051,Tag 0x33.07:UID .06.0e.2b.34.01.01.01.02.04.18.01.04.00.00.00.00
 :052,Tag 0x33.08:UID .06.0e.2b.34.01.01.01.02.04.01.05.01.10.00.00.00
 :053,Tag 0x33.09:UID .06.0e.2b.34.01.01.01.02.04.01.05.03.07.00.00.00
 :054,Tag 0x33.0b:UID .06.0e.2b.34.01.01.01.05.03.01.02.01.0a.00.00.00
 :055,Tag 0x3b.02:UID .06.0e.2b.34.01.01.01.02.07.02.01.10.02.04.00.00
 :056,Tag 0x3b.03:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.02.01.00.00
 :057,Tag 0x3b.05:UID .06.0e.2b.34.01.01.01.02.03.01.02.01.05.00.00.00
 :058,Tag 0x3b.06:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.06.04.00.00
 :059,Tag 0x3b.07:UID .06.0e.2b.34.01.01.01.02.03.01.02.01.04.00.00.00
 :060,Tag 0x3b.08:UID .06.0e.2b.34.01.01.01.04.06.01.01.04.01.08.00.00
 :061,Tag 0x3b.09:UID .06.0e.2b.34.01.01.01.05.01.02.02.03.00.00.00.00
 :062,Tag 0x3b.0a:UID .06.0e.2b.34.01.01.01.05.01.02.02.10.02.01.00.00
 :063,Tag 0x3b.0b:UID .06.0e.2b.34.01.01.01.05.01.02.02.10.02.02.00.00
 :064,Tag 0x3c.01:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.02.01.00.00
 :065,Tag 0x3c.02:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.03.01.00.00
 :066,Tag 0x3c.03:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.04.00.00.00
 :067,Tag 0x3c.04:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.05.01.00.00
 :068,Tag 0x3c.05:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.07.00.00.00
 :069,Tag 0x3c.06:UID .06.0e.2b.34.01.01.01.02.07.02.01.10.02.03.00.00
 :070,Tag 0x3c.07:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.0a.00.00.00
 :071,Tag 0x3c.08:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.06.01.00.00
 :072,Tag 0x3c.09:UID .06.0e.2b.34.01.01.01.02.05.20.07.01.01.00.00.00
 :073,Tag 0x3c.0a:UID .06.0e.2b.34.01.01.01.01.01.01.15.02.00.00.00.00
 :074,Tag 0x3d.01:UID .06.0e.2b.34.01.01.01.04.04.02.03.03.04.00.00.00
 :075,Tag 0x3d.02:UID .06.0e.2b.34.01.01.01.04.04.02.03.01.04.00.00.00
 :076,Tag 0x3d.03:UID .06.0e.2b.34.01.01.01.05.04.02.03.01.01.01.00.00
 :077,Tag 0x3d.04:UID .06.0e.2b.34.01.01.01.01.04.02.01.01.03.00.00.00
 :078,Tag 0x3d.05:UID .06.0e.2b.34.01.01.01.01.04.02.01.01.01.00.00.00
 :079,Tag 0x3d.06:UID .06.0e.2b.34.01.01.01.02.04.02.04.02.00.00.00.00
 :080,Tag 0x3d.07:UID .06.0e.2b.34.01.01.01.05.04.02.01.01.04.00.00.00
 :081,Tag 0x3d.08:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.01.00.00.00
 :082,Tag 0x3d.09:UID .06.0e.2b.34.01.01.01.05.04.02.03.03.05.00.00.00
 :083,Tag 0x3d.0a:UID .06.0e.2b.34.01.01.01.05.04.02.03.02.01.00.00.00
 :084,Tag 0x3d.0b:UID .06.0e.2b.34.01.01.01.05.04.02.03.02.02.00.00.00
 :085,Tag 0x3d.0c:UID .06.0e.2b.34.01.01.01.05.04.02.07.01.00.00.00.00
 :086,Tag 0x3d.0d:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.06.00.00.00
 :087,Tag 0x3d.0e:UID .06.0e.2b.34.01.01.01.05.04.02.03.01.05.00.00.00
 :088,Tag 0x3d.0f:UID .06.0e.2b.34.01.01.01.05.04.02.03.02.03.00.00.00
 :089,Tag 0x3d.10:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.02.00.00.00
 :090,Tag 0x3d.11:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.03.00.00.00
 :091,Tag 0x3d.12:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.04.00.00.00
 :092,Tag 0x3d.13:UID .06.0e.2b.34.01.01.01.05.04.02.05.01.05.00.00.00
 :093,Tag 0x3e.01:UID .06.0e.2b.34.01.01.01.03.04.03.03.02.00.00.00.00
 :094,Tag 0x3f.01:UID .06.0e.2b.34.01.01.01.04.06.01.01.04.06.0b.00.00
 :095,Tag 0x3f.05:UID .06.0e.2b.34.01.01.01.04.04.06.02.01.00.00.00.00
 :096,Tag 0x3f.06:UID .06.0e.2b.34.01.01.01.04.01.03.04.05.00.00.00.00
 :097,Tag 0x3f.07:UID .06.0e.2b.34.01.01.01.04.01.03.04.04.00.00.00.00
 :098,Tag 0x3f.08:UID .06.0e.2b.34.01.01.01.04.04.04.04.01.01.00.00.00
 :099,Tag 0x3f.09:UID .06.0e.2b.34.01.01.01.05.04.04.04.01.06.00.00.00
 :100,Tag 0x3f.0a:UID .06.0e.2b.34.01.01.01.05.04.04.04.02.05.00.00.00
 :101,Tag 0x3f.0b:UID .06.0e.2b.34.01.01.01.05.05.30.04.06.00.00.00.00
 :102,Tag 0x3f.0c:UID .06.0e.2b.34.01.01.01.05.07.02.01.03.01.0a.00.00
 :103,Tag 0x3f.0d:UID .06.0e.2b.34.01.01.01.05.07.02.02.01.01.02.00.00
 :104,Tag 0x3f.0e:UID .06.0e.2b.34.01.01.01.05.04.04.04.01.07.00.00.00
 :105,Tag 0x40.01:UID .06.0e.2b.34.01.01.01.01.01.02.01.01.01.00.00.00
 :106,Tag 0x41.01:UID .06.0e.2b.34.01.01.01.02.01.04.01.02.01.00.00.00
 :107,Tag 0x44.01:UID .06.0e.2b.34.01.01.01.01.01.01.15.10.00.00.00.00
 :108,Tag 0x44.02:UID .06.0e.2b.34.01.01.01.01.01.03.03.02.01.00.00.00
 :109,Tag 0x44.03:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.06.05.00.00
 :110,Tag 0x44.04:UID .06.0e.2b.34.01.01.01.02.07.02.01.10.02.05.00.00
 :111,Tag 0x44.05:UID .06.0e.2b.34.01.01.01.02.07.02.01.10.01.03.00.00
 :112,Tag 0x47.01:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.02.03.00.00
 :113,Tag 0x48.01:UID .06.0e.2b.34.01.01.01.02.01.07.01.01.00.00.00.00
 :114,Tag 0x48.02:UID .06.0e.2b.34.01.01.01.02.01.07.01.02.01.00.00.00
 :115,Tag 0x48.03:UID .06.0e.2b.34.01.01.01.02.06.01.01.04.02.04.00.00
 :116,Tag 0x48.04:UID .06.0e.2b.34.01.01.01.02.01.04.01.03.00.00.00.00
 :117,Tag 0x49.01:UID .06.0e.2b.34.01.01.01.02.05.30.04.02.00.00.00.00
 :118,Tag 0x49.02:UID .06.0e.2b.34.01.01.01.05.07.02.01.03.01.0b.00.00
 :119,Tag 0x4b.01:UID .06.0e.2b.34.01.01.01.02.05.30.04.05.00.00.00.00
 :120,Tag 0x4b.02:UID .06.0e.2b.34.01.01.01.02.07.02.01.03.01.03.00.00
 :121,Tag 0x61.01:UID .06.0e.2b.34.01.01.01.05.06.01.01.04.02.0c.00.00
 :122,Tag 0x61.02:UID .06.0e.2b.34.01.01.01.04.01.07.01.05.00.00.00.00
 :123,Tag 0x61.03:UID .06.0e.2b.34.01.01.01.05.01.07.01.06.00.00.00.00
 :124,Tag 0x80.00:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.02.00.00
 :125,Tag 0x80.01:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.03.00.00
 :126,Tag 0x80.04:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.06.00.00
 :127,Tag 0x80.05:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.07.00.00
 :128,Tag 0x80.06:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.08.00.00
 :129,Tag 0x80.07:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.09.00.00
 :130,Tag 0x80.08:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.0b.00.00
 :131,Tag 0xff.fd:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.0a.00.00
 :132,Tag 0xff.fe:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.05.00.00
 :133,Tag 0xff.ff:UID .06.0e.2b.34.01.01.01.05.04.01.06.02.01.04.00.00
 Prase Primer pack OK !
 Preface: Packet_len=0xd6,
  Instance_ID is: .77.fc.f7.df.5f.51.3a.41.88.70.82.22.52.ac.16.1a
 Last_modified_data : 2007_04_27 10:08:22 164
 Version :1.2
  Primary_Package :Get Material UID .bd.29.2f.3f.81.e1.b3.47.b1.24.59.a3.83.29.1f.f5
 Identification_Number :0x2, nItemSize:0x10
 Identification[0] .36.09.8a.da.89.9c.56.46.9e.aa.46.8d.42.82.bb.2c
 Identification[1] .4b.1a.0e.95.e9.f5.7f.4d.87.af.46.3a.81.6b.11.95
 Content_Storage Instance_ID is: .f0.a2.28.27.99.23.96.47.9a.05.42.54.62.d6.ee.5d
 Operational_Pattern :.06.0e.2b.34.04.01.01.01.0d.01.02.01.01.01.09.00
 EssenceContain_Number :0x3, nItemSize:0x10
 EssenceContain[0] : is the same!
 EssenceContain[1] : is the same!
 EssenceContain[2] : is the same!
 DM Schemes_Number :0x0, nItemSize:0x0
 Parse Preface end!
 Identification: Packet_len=0x100,
  Instance ID : .36.09.8a.da.89.9c.56.46.9e.aa.46.8d.42.82.bb.2c
 Identification, This: Generaltion_UID is: .a6.b8.92.dd.37.f0.c3.4b.b8.ea.4b.6e.41.9e.26.b1
  Company name : Snell & Wilcox
  Product name : MXF Desktop - MXF Wrap Wizard
  Product version: 1.2.0.233.1
  Version string: 1.2
  Product UID: .f4.9f.fc.e9.46.5d.49.b4.be.8b.fc.fd.37.35.8f.0f
  modified data : 2007_04_27 10:08:22 145
  Toolkit version: 1.2.1.314.1
  Platform :MXF Express (Windows XP)
 Prase_Identification end!
 Identification: Packet_len=0x100,
  Instance ID : .4b.1a.0e.95.e9.f5.7f.4d.87.af.46.3a.81.6b.11.95
 Identification, This:Generaltion_UID is different,error!,new is .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b
  Company name : Snell & Wilcox
  Product name : MXF Desktop - MXF Wrap Wizard
  Product version: 1.2.0.233.1
  Version string: 1.2
  Product UID: .f4.9f.fc.e9.46.5d.49.b4.be.8b.fc.fd.37.35.8f.0f
  modified data : 2007_04_27 10:08:22 164
  Toolkit version: 1.2.1.314.1
  Platform :MXF Express (Windows XP)
 Prase_Identification end!
 Content_storage: Packet_len=0x5c,
  Instance_ID Is Same
 Packages:nItemNumber:0x2, nItemSize:0x10
 Packages[0]  Package ID is the same !
 Packages[1]  Package ID is :.93.50.b4.e0.09.5c.ac.42.84.dc.97.c7.01.2c.68.13
 EssenceContainer data:nItemNumber:0x1, nItemSize:0x10
 data[0]  Essence_container_data ID is :.14.87.bb.d8.7c.a7.bd.4b.b8.21.33.f6.aa.7a.c9.7b
 Prase_Content_storage end
 Material_pack: Packet_len=0x8c,
 Instance ID:.bd.29.2f.3f.81.e1.b3.47.b1.24.59.a3.83.29.1f.f5
  Package ID: .06.0a.2b.34.01.01.01.01.01.01.0d.11.13.00.00.00.38.11.5e.3c.16.42.05.80.a9.53.00.50.8d.74.d6.01
  Package create date : 2007_04_27 10:08:22 145
  Package Modified date: 2007_04_27 10:08:22 164
 Track_Number :0x3, nItemSize:0x10
 Track[0] id:.7f.0a.6c.89.67.ff.63.40.8d.65.e5.cc.cb.f6.f8.9e
 Track[1] id:.de.88.58.f3.3c.fb.3e.41.a0.8b.1d.b4.36.d5.3a.aa
 Track[2] id:.a1.f6.05.58.07.49.c5.4e.bd.67.20.c6.a6.be.00.29
 Instance_ID is same
 Parse Material_pack end
 Parse_Track_timeLine: Packet_len=0x64,
 Instance_ID: .7f.0a.6c.89.67.ff.63.40.8d.65.e5.cc.cb.f6.f8.9e
  Track ID :1
  Track Number:0x0
  Track name : Timecode
 Edit rate_ 25:1
  Origin:
  Sequence:.89.02.37.37.ea.3c.ea.4e.b0.72.f9.ff.6c.11.16.9d
 Instance_ID is same
 Parse_Track_timeLine end
 Sequence: Packet_len=0x64,
 Instance_ID .89.02.37.37.ea.3c.ea.4e.b0.72.f9.ff.6c.11.16.9d
 Sequence:Generaltion_UID is different,error!,new is .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b
   Data Definition:12M Timecode Track (inactive user bits)_ _ _Identifies a SMPTE 12M Timecode track with inactive user bits
  Duration: .00.00.00.00.00.00.01.13
 sequence:Component:0x1, nItemSize:0x10
 SourceClip[0] id:.2b.1c.6c.bd.c3.a2.3e.48.ad.6c.0f.d0.55.54.48.19
 Instance_ID is same
 Prase_sequence end
 TimeCode: Packet_len=0x5f,
  Instance ID: .2b.1c.6c.bd.c3.a2.3e.48.ad.6c.0f.d0.55.54.48.19
 TimeCode:Generaltion_UID is different,error!,new is .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b
   Data Definition:12M Timecode Track (inactive user bits)_ _ _Identifies a SMPTE 12M Timecode track with inactive user bits
  Duration: .00.00.00.00.00.00.01.13
  Rounded Timecode base:25
  Start TimeCode:
  Drop frame:0
 Parse TimeCode end
 Parse_Track_timeLine: Packet_len=0x62,
 Instance_ID: .de.88.58.f3.3c.fb.3e.41.a0.8b.1d.b4.36.d5.3a.aa
  Track ID :2
  Track Number:0x0
  Track name : Picture
 Edit rate_ 25:1
  Origin:
  Sequence:.8b.ec.da.d9.a5.70.7d.40.b4.97.40.20.34.c8.04.92
 Instance_ID is same
 Parse_Track_timeLine end
 Sequence: Packet_len=0x64,
 Instance_ID .8b.ec.da.d9.a5.70.7d.40.b4.97.40.20.34.c8.04.92
 Sequence:Generaltion_UID is different,error!,new is .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b
   Data Definition:Picture Essence Track_ _ _Identifies a picture essence track
  Duration: .00.00.00.00.00.00.01.13
 sequence:Component:0x1, nItemSize:0x10
 SourceClip[0] id:.00.e7.14.51.43.28.01.4c.b5.b6.e6.f4.bc.b7.b7.b0
 Instance_ID is same
 Prase_sequence end
 SourceClip: Packet_len=0x80,
 Instance_ID .00.e7.14.51.43.28.01.4c.b5.b6.e6.f4.bc.b7.b7.b0
  Generation ID: .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b
   Data Definition:Picture Essence Track_ _ _Identifies a picture essence track
  Start Position:
  Duration: .00.00.00.00.00.00.01.13
  Source PackageID:.06.0a.2b.34.01.01.01.01.01.01.0d.11.13.00.00.00.34.11.5e.3c.16.42.05.80.96.17.00.50.8d.74.d6.01
  Source TrackID:2
 Instance_ID is same
  Current track number is zero,warning!
 Parse SourceClip end
 Parse_Track_timeLine: Packet_len=0x5e,
 Instance_ID: .a1.f6.05.58.07.49.c5.4e.bd.67.20.c6.a6.be.00.29
  Track ID :3
  Track Number:0x0
  Track name : Sound
 Edit rate_ 25:1
  Origin:
  Sequence:.8d.9d.2a.fd.2f.2b.aa.4a.8b.78.99.30.11.cb.7d.01
 Instance_ID is same
 Parse_Track_timeLine end
 Sequence: Packet_len=0x64,
 Instance_ID .8d.9d.2a.fd.2f.2b.aa.4a.8b.78.99.30.11.cb.7d.01
 Sequence:Generaltion_UID is different,error!,new is .36.58.a8.0b.ce.50.ee.43.99.4b.48.c0.d3.bd.a0.7b
   Data Definition:Sound Essence Track_ _ _Identifies a sound essence track
  Duration: .00.00.00.00.00.00.01.13
 sequence:Component:0x1, nItemSize:0x10
 SourceClip[0] id:.6c.29.6b.a2.12.49.6e.4c.8b.1e.ac.ec.6f.64.da.85
 Instance_ID is same

TS,MPEG2,dvbc專家 2009-12-01 08:36 發(fā)表評論
]]>
網(wǎng)絡(luò)流量監(jiān)測,網(wǎng)卡信息,Unit cast receive,Socket Sniffehttp://www.shnenglu.com/dvb-dvb/archive/2009/11/23/netcard.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Mon, 23 Nov 2009 07:17:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/11/23/netcard.htmlhttp://www.shnenglu.com/dvb-dvb/comments/101696.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/11/23/netcard.html#Feedback9http://www.shnenglu.com/dvb-dvb/comments/commentRss/101696.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/101696.html枚舉用戶有幾個網(wǎng)卡,名稱,IP值,

http://www.shnenglu.com/Files/dvb-dvb/Receive.rar



如有問題,請迅速與本人聯(lián)系!

TS,MPEG2,dvbc專家 2009-11-23 15:17 發(fā)表評論
]]>
Huffman code下載, Huffman算法下載, Huffman源碼下載http://www.shnenglu.com/dvb-dvb/archive/2009/11/14/Huffman.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Sat, 14 Nov 2009 04:24:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/11/14/Huffman.htmlhttp://www.shnenglu.com/dvb-dvb/comments/100909.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/11/14/Huffman.html#Feedback0http://www.shnenglu.com/dvb-dvb/comments/commentRss/100909.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/100909.html/Files/dvb-dvb/HuffmanCode.rar

這個是最新的huffman code (encoder and decoder) , 但是效率有待提升.
 一直占cpu 50% , 掃描兩遍文件,一遍建立huffman code,另一遍,用二進(jìn)制替換,
        1,有兩個問題沒有解決
  1,動態(tài)建立huffman tree node value.僅僅掃描一遍,
  2,根據(jù)node的值去排序得到frequence時,這個值到底取1個byte,還是2個byte.

Huffman算法簡介

Huffman算法是一種基于統(tǒng)計的壓縮方法。它的本質(zhì)就是對文本文件中的字符進(jìn)行重新編碼,對于使用頻率越高的字符,其編碼也越短。但是任何2個字符的編碼,是不能出現(xiàn)向前包含的。也就是說字符A的編碼的前段,不可能為字符B的編碼。經(jīng)過編碼后的文本文件,主要包含2個部分:Huffman碼表部分和壓縮內(nèi)容部分。解壓縮的時候,先把Huffman碼表取出來,然后對壓縮內(nèi)容部分各個字符進(jìn)行逐一解碼,形成源文件。

由此可見,使用Huffman算法的關(guān)鍵是形成Huffman碼表。怎樣才能生成一個“使用頻率越高的字符,其編碼也越短”的碼表呢?這里就要用到 Huffman樹的數(shù)據(jù)結(jié)構(gòu)。當(dāng)把一棵Huffman樹生成后,碼表也就生成了。以下舉例說明,假定我們的原始文本為"abcbbcccc"

Huffman樹生成步驟:

1.掃描源文件,對字符頻率進(jìn)行統(tǒng)計。

對于我們的樣例,統(tǒng)計結(jié)果是:a:1  b:3 c:5 (按頻率升序排列)

 

2.從上述隊列中取出頻率最低的2個節(jié)點,合并成一個頻率為2節(jié)點頻率之和的樹枝節(jié)點X,加入到原隊列中,加入后,繼續(xù)保持隊列按頻率升序排列.

3.重復(fù)步驟2,直到隊列中只有一個節(jié)點。

4.這樣,我們就形成了一棵Huffman樹。葉子節(jié)點為字符,從樹根節(jié)點到葉子節(jié)點的路徑即為該字符的Huffman編碼。從一個節(jié)點導(dǎo)航到其左孩子,該段路徑為0,導(dǎo)航到右孩子,該段路徑為1.所以,a字符的編碼就是00,b字符的編碼為01,c字符的編碼為1,符合"使用頻率越高的字符,編碼越短"的要求。理論論證過程見<算法導(dǎo)論>P233

5.Huffman碼表生成后,原文本"abcbbcccc"就變成了0001101011111的位串,按每個字符占用2個byte計算,大小由原來的18個字節(jié)(9*2),共144個bit,變成了13個bit,2個字節(jié)。達(dá)到了壓縮的目的。

解壓縮過程:

解壓縮也分成2部分進(jìn)行,首先是根據(jù)壓縮文件中的Huffman碼表,在內(nèi)存中生成一棵Huffman樹,然后,根據(jù)Huffman樹,對壓縮內(nèi)容進(jìn)行解壓縮。比如如果壓縮內(nèi)容為位串0001101011111,那么從樹根節(jié)點起,因為第一個bit為0,先轉(zhuǎn)向左子樹,第二個bit為0,再轉(zhuǎn)向左子樹,到達(dá)葉子a,所以解碼出來的第一個字符就是a,每次解壓一個字符,都從根節(jié)點起,根據(jù)bit流,向左或向右轉(zhuǎn),直到到達(dá)葉子節(jié)點,也就是解壓出來的字符。一直重復(fù)此過程,直到所有的字符都被解壓縮。 

壓縮文件格式

使用Huffman壓縮算法對文本文件壓縮后,就形成了一個壓縮文件,該壓縮文件包含2部分,一部分為Huffman碼表,也就是Huffman 樹,第二部分為根據(jù)碼表生成的內(nèi)容位串。如何設(shè)計Huffman樹的存儲格式呢?本文采用從上到下,從左到右分層遍歷節(jié)點,順序存儲的方式。如下圖:

也就是說,對于前述的Huffman樹,其持久化形式為:0xfffe 0xfffe 0x0063  0x0061  0x0062,其中0xfffe代表樹枝節(jié)點,而0x0061,0x0062,0x0063分別為a,b,c的Unicode碼。因為所有的樹枝節(jié)點的值都是0xfffe,所有樹枝節(jié)點都有2個孩子,節(jié)點排列方式是按從上到下,從左到右分層排列,所以能根據(jù)此持久化字節(jié)數(shù)組,把Huffman樹在內(nèi)存中重新生成。

另外為了升級版本,嵌入了magic number和version。

完整工程下載

本文涉及到的完整的eclipse工程,可以從這里下載。注:內(nèi)含測試樣例《平凡的世界》文本文件,體積較大,請使用下載工具下載。另外,本程序中采用了泛型,請在至少在JDK1.5版本上編譯運(yùn)行。

代碼簡要說明

1.HuffmanTextEncoder類完成壓縮功能,可直接運(yùn)行,壓縮測試用文本文件。

2.HuffmanTextDecoder類完成解壓縮功能,可直接運(yùn)行,解壓縮 壓縮后的文本文件。

3.BitReader,工具類,實現(xiàn)對BufferedInputStream的按位讀取。

4.BitWriter,工具類,實現(xiàn)按位寫入的功能。該類來自網(wǎng)絡(luò)。

5.MinHeap<T> ,模板工具類,實現(xiàn)了一個最小堆。生成Huffman樹時使用。

壓縮效果

使用本程序?qū)Α镀椒驳氖澜纭纷鰤嚎s測試,壓縮前為文本文件,大小為1.7M,壓縮后為二進(jìn)制文件,大小接近1M(988,817byte),而 zip壓縮后體積為920,997byte,比zip差,壓縮文件存儲格式待改善。另外,因為從Huffman壓縮算法的原理可知,該算法對字符重復(fù)率高的文本最有效,比如長篇小說或者英文小說。

以上內(nèi)容為轉(zhuǎn)載:   http://chencwf.googlepages.com/huffman
 
以下為自己的內(nèi)容:

 DETAIL:  35:v:2f,p: 42.
    INFO:   Sort After.size = 0
    DETAIL:   0:v:fffe,p:228,xx=    0,yy=    0.
    DETAIL:   1:v:fffe,p: 92,xx=    1,yy=    0.0
    DETAIL:   2:v:fffe,p: 42,xx=    2,yy=    0.00
    DETAIL:   3:v:fffe,p: 19,xx=    3,yy=    0.000
    DETAIL:   4:v:fffe,p:  9,xx=    4,yy=    0.0000
    DETAIL:   5:v:fffe,p:  4,xx=    5,yy=    0.00000
    DETAIL:   6:v:fffe,p:  2,xx=    6,yy=    0.000000
    DETAIL:   7:v:  53,p:  1,xx=    7,yy=    0.0000000
    DETAIL:   8:v:  47,p:  1,xx=    7,yy=    1.0000001
    DETAIL:   9:v:fffe,p:  2,xx=    6,yy=    1.000001
    DETAIL:  10:v:  3d,p:  1,xx=    7,yy=    2.0000010
    DETAIL:  11:v:  3b,p:  1,xx=    7,yy=    3.0000011
    DETAIL:  12:v:  6c,p:  5,xx=    5,yy=    1.00001
    DETAIL:  13:v:  65,p: 10,xx=    4,yy=    1.0001
    DETAIL:  14:v:fffe,p: 23,xx=    3,yy=    1.001
    DETAIL:  15:v:  74,p: 11,xx=    4,yy=    2.0010
    DETAIL:  16:v:   d,p: 12,xx=    4,yy=    3.0011
    DETAIL:  17:v:fffe,p: 50,xx=    2,yy=    1.01
    DETAIL:  18:v:fffe,p: 24,xx=    3,yy=    2.010
    DETAIL:  19:v:fffe,p: 12,xx=    4,yy=    4.0100
    DETAIL:  20:v:fffe,p:  6,xx=    5,yy=    4.01000
    DETAIL:  21:v:  66,p:  3,xx=    6,yy=    4.010000
    DETAIL:  22:v:  67,p:  3,xx=    6,yy=    5.010001
    DETAIL:  23:v:  63,p:  6,xx=    5,yy=    5.01001
    DETAIL:  24:v:   a,p: 12,xx=    4,yy=    5.0101
    DETAIL:  25:v:  20,p: 26,xx=    3,yy=    3.011
    DETAIL:  26:v:fffe,p:136,xx=    1,yy=    1.1
    DETAIL:  27:v:fffe,p: 58,xx=    2,yy=    2.10
    DETAIL:  28:v:fffe,p: 26,xx=    3,yy=    4.100
    DETAIL:  29:v:fffe,p: 12,xx=    4,yy=    6.1000
    DETAIL:  30:v:fffe,p:  6,xx=    5,yy=    6.10000
    DETAIL:  31:v:fffe,p:  3,xx=    6,yy=    6.100000
    DETAIL:  32:v:  7b,p:  1,xx=    7,yy=    6.1000000
    DETAIL:  33:v:  70,p:  2,xx=    7,yy=    7.1000001
    DETAIL:  34:v:  78,p:  3,xx=    6,yy=    7.100001
    DETAIL:  35:v:fffe,p:  6,xx=    5,yy=    7.10001
    DETAIL:  36:v:  61,p:  3,xx=    6,yy=    8.100010
    DETAIL:  37:v:  4c,p:  3,xx=    6,yy=    9.100011
    DETAIL:  38:v:fffe,p: 14,xx=    4,yy=    7.1001
    DETAIL:  39:v:  64,p:  7,xx=    5,yy=    8.10010
    DETAIL:  40:v:   9,p:  7,xx=    5,yy=    9.10011
    DETAIL:  41:v:fffe,p: 32,xx=    3,yy=    5.101
    DETAIL:  42:v:fffe,p: 16,xx=    4,yy=    8.1010
    DETAIL:  43:v:fffe,p:  8,xx=    5,yy=   10.10100
    DETAIL:  44:v:fffe,p:  4,xx=    6,yy=   10.101000
    DETAIL:  45:v:fffe,p:  2,xx=    7,yy=   10.1010000
    DETAIL:  46:v:  6d,p:  1,xx=    8,yy=   10.10100000
    DETAIL:  47:v:  7d,p:  1,xx=    8,yy=   11.10100001
    DETAIL:  48:v:  77,p:  2,xx=    7,yy=   11.1010001
    DETAIL:  49:v:fffe,p:  4,xx=    6,yy=   11.101001
    DETAIL:  50:v:  41,p:  2,xx=    7,yy=   12.1010010
    DETAIL:  51:v:  29,p:  2,xx=    7,yy=   13.1010011
    DETAIL:  52:v:fffe,p:  8,xx=    5,yy=   11.10101
    DETAIL:  53:v:fffe,p:  4,xx=    6,yy=   12.101010
    DETAIL:  54:v:  28,p:  2,xx=    7,yy=   14.1010100
    DETAIL:  55:v:  6f,p:  2,xx=    7,yy=   15.1010101
    DETAIL:  56:v:  73,p:  4,xx=    6,yy=   13.101011
    DETAIL:  57:v:fffe,p: 16,xx=    4,yy=    9.1011
    DETAIL:  58:v:fffe,p:  8,xx=    5,yy=   12.10110
    DETAIL:  59:v:  75,p:  4,xx=    6,yy=   14.101100
    DETAIL:  60:v:  23,p:  4,xx=    6,yy=   15.101101
    DETAIL:  61:v:  22,p:  8,xx=    5,yy=   13.10111


asdfasdfasdf

TS,MPEG2,dvbc專家 2009-11-14 12:24 發(fā)表評論
]]>
TS 流文件 字節(jié)對齊 切割工具 (二)http://www.shnenglu.com/dvb-dvb/archive/2009/11/09/100479.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Mon, 09 Nov 2009 09:34:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/11/09/100479.htmlhttp://www.shnenglu.com/dvb-dvb/comments/100479.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/11/09/100479.html#Feedback3http://www.shnenglu.com/dvb-dvb/comments/commentRss/100479.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/100479.html本來還能切割成188 或者 204的整數(shù)倍的,增加校驗的.呵呵.

1,增加了輸入文件的拖動,
2,增加了輸出文件的名稱的跟隨

/Files/dvb-dvb/FileDivider.rar




TS,MPEG2,dvbc專家 2009-11-09 17:34 發(fā)表評論
]]>
Mpeg2解壓縮的詳細(xì)過程 介紹。http://www.shnenglu.com/dvb-dvb/archive/2009/11/03/Mpeg2.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Tue, 03 Nov 2009 00:58:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/11/03/Mpeg2.htmlhttp://www.shnenglu.com/dvb-dvb/comments/100034.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/11/03/Mpeg2.html#Feedback1http://www.shnenglu.com/dvb-dvb/comments/commentRss/100034.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/100034.html
 

MPEG-1流比特層次結(jié)構(gòu)分析總結(jié)
1.簡要介紹Mpeg
Mpeg 是Motion Picture Expert Group的縮寫。活動圖像專家組是在1988年由ISO和IEC聯(lián)合成立的專家組,負(fù)責(zé)開發(fā)電視圖像數(shù)據(jù)和聲音數(shù)據(jù)的編碼,解碼和它們的同步等標(biāo)準(zhǔn)。到目前為止已經(jīng)開發(fā)和正在開發(fā)的MPEG標(biāo)準(zhǔn)有很多,主要包括Mpeg-1,Mpeg-2,Mpeg-4,和Mpeg-7.

其中的Mpeg-1處理的是標(biāo)準(zhǔn)圖像交換格式(standard interchange format,SIF)或者稱為源輸入格式(Source Input Format,SIF)的電視,將模擬的圖像信息,通過編碼成為數(shù)字圖像信息,原始輸入可以是NTSC制式352pixels * 240lines * 30frames/second, PAL制352pixels * 288lines*25frames/second,壓縮后的數(shù)字圖像信息的速率為1.5Mb/s.這個標(biāo)注是1992年正是的發(fā)布的,是針對當(dāng)時具有這種數(shù)據(jù)傳輸速率的CD-ROM和網(wǎng)絡(luò)而開發(fā)的,用于在CD-ROM上存儲數(shù)字影視和在網(wǎng)絡(luò)上傳輸數(shù)字影視。
MPEG-1的標(biāo)準(zhǔn)號為ISO/IEC 11172,標(biāo)準(zhǔn)名:“信息技術(shù)——用于數(shù)據(jù)速率大約高達(dá)1.5Mb/s的數(shù)字存儲替的電視圖像和伴音編碼”
本文主要是對Mpeg-1Video數(shù)據(jù)流的結(jié)構(gòu)進(jìn)行分析,并將怎樣得到Mpeg-1流中的數(shù)據(jù)部分進(jìn)行的闡述。ISO/IEC 11172-2

2.Mpeg-1數(shù)據(jù)流分析
編碼后的視頻序列是一個如同計算機(jī)網(wǎng)絡(luò)的OSI模型下的數(shù)據(jù)序列一樣,數(shù)據(jù)被分成很多層的概念。

視頻序列層-畫面組層-畫面層-片層-宏塊層-塊層
層次的關(guān)系很明顯,越往后越是底層,越接近實際的數(shù)據(jù)。

2.1視頻序列層(VideoStream)
視頻序列是以一個序列標(biāo)題開始,之后可以跟著一個或者多個畫面組。最后以Sequence_end_code結(jié)束。緊挨著每一個畫面組之前可以有一個序列標(biāo)題。也就是說每個畫面組,都可以有一個自己的序列標(biāo)題。
序列標(biāo)題是一個以sequence_header_code開始,后跟著一系列數(shù)據(jù)元素的結(jié)構(gòu)。是視頻流中用來解碼的重要的參數(shù)之一。其中定義了量化矩陣(load_intra_quantizer_matrix和 load_non_intra_quantizer_matrix以及可選的intra_quantizer_matrix和 non_intra_quantizer_ matrix)以及其它的一些重要的數(shù)據(jù)元素,其中量化矩陣是可以在視頻流中重復(fù)的量化矩陣中變化的,并且在每次變化后,量化矩陣重新定義。其它的元素必須與第一個序列標(biāo)題中的值相同。
整個視頻序列的結(jié)構(gòu)可以用下面的代碼表示:
Video_Stream{
unsigned int h_size;                         /* Horiz. size in pixels.     */
  unsigned int v_size;                         /* Vert. size in pixels.      */
  unsigned int mb_height;                      /* Vert. size in mblocks.     */
  unsigned int mb_width;                       /* Horiz. size in mblocks.    */
  unsigned char aspect_ratio;                  /* Code for aspect ratio.     */
  unsigned char picture_rate;                  /* Code for picture rate.     */
  unsigned int bit_rate;                       /* Bit rate.                  */
  unsigned int vbv_buffer_size;                /* Minimum buffer size.       */
  BOOLEAN const_param_flag;                    /* Contrained parameter flag. */
  unsigned char intra_quant_matrix[8][8];      /* Quantization matrix for
  intracoded frames.         */
  unsigned char non_intra_quant_matrix[8][8];  /* Quanitization matrix for
  non intracoded frames.     */
  char *ext_data;                              /* Extension data.            */
  char *user_data;                             /* User data.                 */
  GoP group;                                   /* Current group of pict.     */
  Pict picture;                                /* Current picture.           */
  Slice slice;                                 /* Current slice.             */
  Macroblock mblock;                           /* Current macroblock.        */
  Block block;                                 /* Current block.             */
  int state;                                   /* State of decoding.         */
  int bit_offset;                              /* Bit offset in stream.      */
  unsigned int *buffer;                        /* Pointer to next byte in
  buffer.                    */
  int buf_length;                              /* Length of remaining buffer.*/
  unsigned int *buf_start;                     /* Pointer to buffer start.   */
  int max_buf_length;                          /* Max lenght of buffer.      */
  PictImage *past;                             /* Past predictive frame.     */
  PictImage *future;                           /* Future predictive frame.   */
  PictImage *current;                          /* Current frame.             */
  PictImage *ring[RING_BUF_SIZE];              /* Ring buffer of frames.     */
} Video_Stream;  
具體的序列標(biāo)題的結(jié)構(gòu)的部分是這樣的:
序列
sequence_header{
SEQ_START_CODE 0x000001b3;  /* 常量 ,作用使用來定位視頻序列的序列頭 */  
unsigned int h_size;                         /* Horiz. size in pixels.     */
  unsigned int v_size;                         /* Vert. size in pixels.      */
  unsigned int mb_height;                      /* Vert. size in mblocks.     */
  unsigned int mb_width;                       /* Horiz. size in mblocks.    */
  unsigned char aspect_ratio;                  /* Code for aspect ratio.     */
  unsigned char picture_rate;                  /* Code for picture rate.     */
  unsigned int bit_rate;                       /* Bit rate.                  */
  unsigned int vbv_buffer_size;                /* Minimum buffer size.       */
  BOOLEAN const_param_flag;                    /* Contrained parameter flag. */
  unsigned char load_intra_quantizer_matrix;
unsigned char intra_quant_matrix[8][8];      /* Quantization matrix for intracoded frames.         這個結(jié)構(gòu)是可選的,要看load_intra_quantizer_matrix的值,為真則有這個部分,否則沒有,因為
intra_quant_matrix是量化表的值,而Sequence_header結(jié)構(gòu)在視頻序列中是可重復(fù)的,即在每個畫面組之前都有可能再次給出一個sequence_header,并且可以在新的sequence_header 中重新定義量化表*/
unsigned char load_non_intra_quantizer_matrix;
  unsigned char non_intra_quant_matrix[8][8];  /* Quanitization matrix for non intracoded frames. 也是可選。愿意于intra_quant_matrix可選的原因相同。當(dāng)load_non_intra_quant_matrix的值為真的時候需要定義。    */
  char *ext_data;                              /* Extension data.            */
  char *user_data;                             /* User data.                 */
 
}

由上面的分析,可以看出來的是:
video_sequence(){
next_start_code()
do{
sequence_header();
do{
group_of_pictures() ;畫面組
}while (nextbits()==GROUP_START_CODE)
}while(nextbits()==SEQUENCE_HEADER_CODE)
SEQUENCE_END_CODE
};

正是由于視頻序列中存在很多開始碼,或者稱之為定位碼、同步碼。用來告訴解碼器目前數(shù)據(jù)的區(qū)域信息,所以解碼器才可以正確的處理各個數(shù)據(jù)區(qū)的數(shù)據(jù),下面就是視頻序列中的開始碼的羅列:
#define SEQ_END_CODE 0x000001b7
#define SEQ_START_CODE 0x000001b3
#define GOP_START_CODE 0x000001b8
#define PICTURE_START_CODE 0x00000100
#define SLICE_MIN_START_CODE 0x00000101
#define SLICE_MAX_START_CODE 0x000001af
#define EXT_START_CODE 0x000001b5
#define USER_START_CODE 0x000001b2
這些開始碼都是一些特殊的32bits的比特序列,在視頻碼流中不會出現(xiàn)的。他們的起著標(biāo)志的作用,具體可以從名稱上面看出來。
其中EXT_START_CODE和USER_START_CODE在每個層里面都會出現(xiàn),用來標(biāo)志擴(kuò)展數(shù)據(jù)區(qū)和用戶數(shù)據(jù)區(qū),用來添加任意的數(shù)據(jù),直到下一個開始碼結(jié)束。
2.2畫面組層(GOP)
在軟件xmplay1.1中的定義
typedef struct GoP {
  BOOLEAN drop_flag;                     /* Flag indicating dropped frame. */
  unsigned int tc_hours;                 /* Hour component of time code.   */
  unsigned int tc_minutes;               /* Minute component of time code. */
  unsigned int tc_seconds;               /* Second component of time code. */
  unsigned int tc_pictures;              /* Picture counter of time code.  */
  BOOLEAN closed_gop;                    /* Indicates no pred. vectors to
    previous group of pictures.    */
  BOOLEAN broken_link;                   /* B frame unable to be decoded.  */
  char *ext_data;                        /* Extension data.                */
  char *user_data;                       /* User data.                     */
} GoP;

當(dāng)然每個畫面組層都是開始與標(biāo)志碼:GOP_START_CODE
該層次語法上的定義是
group_of_pictures{
GOP_START_CODE
Time_code; tc_hours,tc_minutes,tc_seconds,tc_pictures
Closed_gop;
Broken_link;
Next_start_code;
If(nextbits==extension_start_code){
Extension_start_code;
While(nextbits()==”0000 0000 0000 0000 0000 0001”){
Group_extension_data;
}
next_start_code()
}
if(nextbits==user_data_start_code){
user_data_start_code
while(nextbits()!=’0000 0000 0000 0000 0000 0001’){
user_data;
}
next_start_code()
}
do{
picture()
}while(nextbits==picture_start_code)
}

Mpeg流最終顯示出來是一系列的畫面,而畫面組是mpeg流中可以獨立編碼的最小的單位,每個畫面組由一個標(biāo)題和一系列畫面組成。GOP標(biāo)題包含了時間和編輯的信息。
Mpeg畫面組中必須至少有一個I幀畫面,可以有數(shù)目可變的B幀和P幀畫面,也可以沒有P和B幀。畫面組的第一幅編碼畫面是I畫面,該畫面之后跟隨著任意數(shù)目的I或P畫面,每對I、P畫面之間可以插入任意數(shù)目的B畫面。
畫面組是畫面的集合,每幅畫面按照顯示的順序相鄰。
畫面組中的畫面有兩種排列順序:
1.按比特流順序 必須以I幀開頭,后面可按任何的次序,跟上任意數(shù)目的I,P或B畫面。
2.按顯示順序必須以I或B畫面打頭,且以I或P畫面結(jié)束,最小的畫面組由一個I畫面組成。

從編碼角度,可以精確的陳述的是,畫面組以一個畫面組標(biāo)題開始,以最先出現(xiàn)的下一個畫面組標(biāo)題或者下一個序列標(biāo)題或者序列結(jié)束碼結(jié)束。

Mepg流中的標(biāo)志碼也就是開始碼,對正確的分割和識別碼流的成分起到了至關(guān)重要的作用。

2.3畫面層(Pictures)
畫面組層中的一幅幅畫面就是畫面層的數(shù)據(jù)了。包含了一幅畫面的所有編碼信息。一幅畫面同樣始于畫面的標(biāo)題。標(biāo)題以畫面開始碼(PICTURE_START_CODE 0x00000100)打頭。
解析畫面單元的語法結(jié)構(gòu):
picture(){
picture_start_code
temprol_reference     /*時序編號,通常一組畫面的編號都在1024以內(nèi),如果超過那么在1025幅畫面出復(fù)位為0,重新計數(shù)。*/                                   
picture_coding_type                        
vbv_delay/*對于固定比特率的視頻流,vbv_delay用與解碼過程開始和隨機(jī)存取之后,以保證在第一幅畫面被顯示之前,解碼器已經(jīng)讀到正確數(shù)目的比特數(shù)。*/
if((picture_coding_type==2) || picture_coding_type==3){
full_pel_foward_vector /*全象素前向矢量,給定前向矢量的精度,在P和B畫面的標(biāo)題中出現(xiàn)*/
forward_f_code
}
if(picture_coding_type==3){
full_pel_backward_vector
back_f_code
}
while(nextbits()==’1’){
extra_bit_picture
extra_information_picture
}
extra_bit_picture
next_start_code

if(nextbits()==extension_start_code){
extension_start_code
while(nextbits()!=’0000 0000 0000 0000 0000 0001’){
picture_extension_data
}
next_start_code()
}
if(nextbits()==user_data_start_code){
user_data_start_code
while(nextbits()!=’0000 0000 0000 0000 0000 0001’){
user_data
}
next_start_code()
}
do {
slice()
}while(nextbits()==slice_start_code)
}


整個畫面單元結(jié)構(gòu)是這樣的:
typedef struct pict {
  unsigned int temp_ref;                 /* Temporal reference.             */
  unsigned int code_type;                /* Frame type: P, B, I             */
  unsigned int vbv_delay;                /* Buffer delay.                   */
  BOOLEAN full_pel_forw_vector;          /* Forw. vectors specified in full
    pixel values flag.              */
  unsigned int forw_r_size;              /* Used for vector decoding.       */
  unsigned int forw_f;                   /* Used for vector decoding.       */
  BOOLEAN full_pel_back_vector;          /* Back vectors specified in full
    pixel values flag.              */
  unsigned int back_r_size;              /* Used in decoding.               */
  unsigned int back_f;                   /* Used in decoding.               */
  char *extra_info;                      /* Extra bit picture info.         */
  char *ext_data;                        /* Extension data.                 */
  char *user_data;                       /* User data.                      */
} Pict;

可以看出整個pictures層的bit流結(jié)構(gòu)中由標(biāo)題和pictures數(shù)據(jù)組成。
標(biāo)題中提供了必要的畫面信息數(shù)據(jù)和運(yùn)動矢量的信息。

2.4片層(Slice)
片是任意數(shù)目宏塊組成的序列,其中宏塊必須從畫面的左上位置開始,按照光柵掃描的方向從左到右,從上到下排列。片中至少包涵一個宏塊,片與片之間沒有重疊,也沒有間隙。

片層的解析語法:
首先給出識別出Slice層數(shù)據(jù)的頭標(biāo)slice_start_code

#define SLICE_MIN_START_CODE 0x00000101
#define SLICE_MAX_START_CODE 0x000001af

slice{
slice_start_code /*從中可以計算出slice_vertical_position  片中第一個宏塊,以宏塊為單位的垂直位置*/
quantizer_scale       /*設(shè)置量化步長尺寸。1-31*/
while(nextbits()==’1’){
extra_bit_slice                       ‘1’
extra_information_slice
}
extra_bit_scale                            ‘0’
do{
macroblock()
}while(nextbits()!=’0000 0000 0000 0000 0000 0000’)
next_start_code()
}

typedef struct slice {
  unsigned int vert_pos;                 /* Vertical position of slice. */
  unsigned int quant_scale;              /* Quantization scale.         */
  char *extra_info;                      /* Extra bit slice info.       */
} Slice;


[此貼子已經(jīng)被作者于2008-7-19 17:51:53編輯過]
--  作者:cdmalcl
--  發(fā)布時間:2008-7-19 17:49:34
-- 
每個片由一個開始碼開始,開始后DC系數(shù)和矢量解碼的預(yù)測值都被復(fù)位,片開始部位的位置的水平位置由片中第一個宏塊的宏塊地址決定。這些措施使得在一幅畫面內(nèi)任何一片都可以單獨編碼而不需要前一片的信息。當(dāng)解碼是出現(xiàn)錯誤,即可以從后繼的片重新開始。
所以,當(dāng)數(shù)據(jù)在無錯的環(huán)境中,可以一幅畫面就作為一片,但是如果是有錯的環(huán)境,則每行宏塊作為一片會更加合理。

表2  256×192畫面內(nèi)的片劃分(每行宏塊作為一個片,每個片的高度都是16pixels)
1開始                                                                                1結(jié)束
2開始                                                                                2結(jié)束
3開始                                                                                3結(jié)束
4開始                                                                                4結(jié)束
5開始                                                                                5結(jié)束
6開始                                                                                6結(jié)束
7開始                                                                                7結(jié)束
8開始                                                                                8結(jié)束
9開始                                                                                9結(jié)束
10開始                                                                              10結(jié)束
11開始                                                                              11結(jié)束
12開始                                                                              12結(jié)束
13開始                                                                              13結(jié)束
實際情況中片不宜太多,因為片標(biāo)題,以及新片所需要盡心重新編碼花費的開銷很大。
片始于片標(biāo)題,片標(biāo)題又始于片開始碼,片開始碼是可以在一個范圍中取得得,這個范圍就是
#define SLICE_MIN_START_CODE 0x00000101
#define SLICE_MAX_START_CODE 0x000001af
片開始碼得最后8為可以給出片得垂直位置,即以宏塊為單位從畫面頂部位置為1開始算起,片中第一個宏塊的垂直位置。宏塊有一個行號可以作為它得定位數(shù)據(jù),這個行號的計算方法是:片垂直位置-1
宏塊的垂直位置最大為175。片中第一個宏塊的水平位置,可以由該宏塊的地址偏移計算出來,所以不需要依賴畫面內(nèi)的任何其他的宏塊的信息。
--  作者:cdmalcl
--  發(fā)布時間:2008-7-19 17:49:59
-- 
2.5宏塊層(Macroblock)
宏塊是包含16pixels*16lines的亮度分量部分,以及在空間位置上對應(yīng)的兩個8pixels*8lines的色度分量部分,一個宏塊有4個亮度塊和2個色度塊。宏塊可以指源圖像或者重構(gòu)圖像的數(shù)據(jù),或者是量化后的DCT系數(shù)。
宏塊中塊的順序如下:
表1  宏塊中塊的排列

01
23


4

5

Y分量Cb分量Cr分量

宏塊的數(shù)據(jù)分析語法描述:

macroblock(){
while(nextbits()==’0000 0001 111’){
macroblock_stuffing /*宏塊填料,為了防止下溢出,由編碼器填入的數(shù)據(jù),有它固定的11位bit格式就是’0000 0001 111’,當(dāng)然解決下溢出的方法還有很多,編碼器可以在標(biāo)題之前就加入填料位,或者可以減小quant_scale獲得更多的編碼系數(shù)等等*/
}
while(nextbits()==’0000 0001 000’){
macroblock_escape  /*固定模式的bit串,當(dāng)macroblock_address與previous_macroblock_address的差大于33時將用到該碼。使得后繼的macroblock_increment所表示的值加33。
}
macroblock_address_increment   /*用于表示macroblock_address和previous_macorblock_ address之間的差值。最大值為33,當(dāng)前兩者差大于33時用macroblock_escape補(bǔ)充。 Macroblock_address表示的是宏塊在畫面中的絕對位置,最左上角的宏塊的macroblock_address為 0,previous_macroblock_address指示片中最后一個非跳空宏塊的位置。
macroblock_type 
if(macroblock_motion_forward){
motion_horizontal_forward_code
if((forward_f!=1) && (motion_horizontal_forward_code!=0))
motion_horizontal_forward_r
motion_vertical_forward_code
if((forward_f!=1) && (motion_vertical_forward_code!=0))
motion_vertical_forward_r
}
if(macroblock_motion_backward){
motion_horizontal_backward_code
if((backward_f!=1) && (motion_horizontal_backward_code!=0))
motion_horizontal_backward_r
motion_vertical_backward_code
if((backward_f!=1) && (motion_vertical_backward_code!=0))
motion_vertical_backward_r
}
if(macroblock_pattern)
coded_block_pattern /*可以得到宏塊宏塊的pattern_code[i](i=0:5),從而確定該宏塊接收到的塊的種類有哪些。*/
for(i=0;i<6;i++)
block(i)
if(picture_coding_type==4)
end_of_marcoblock
}
片被分為16pixels*16lines的象素宏塊。每個宏塊都有它的標(biāo)題。包含了宏塊的地址、類型、量化器標(biāo)尺信息等等。標(biāo)題之后是該宏塊的6個塊的數(shù)據(jù)。

在Xmplay代碼中給出的macrblock的定義:
typedef struct macroblock {
  int mb_address;                        /* Macroblock address.              */
  int past_mb_addr;                      /* Previous mblock address.         */
  int motion_h_forw_code;                /* Forw. horiz. motion vector code. */
  unsigned int motion_h_forw_r;          /* Used in decoding vectors.        */
  int motion_v_forw_code;                /* Forw. vert. motion vector code.  */
  unsigned int motion_v_forw_r;          /* Used in decdoinge vectors.       */
  int motion_h_back_code;                /* Back horiz. motion vector code.  */
  unsigned int motion_h_back_r;          /* Used in decoding vectors.        */
  int motion_v_back_code;                /* Back vert. motion vector code.   */
  unsigned int motion_v_back_r;          /* Used in decoding vectors.        */
  unsigned int cbp;                      /* Coded block pattern.             */
  BOOLEAN mb_intra;                      /* Intracoded mblock flag.          */
  BOOLEAN bpict_past_forw;               /* Past B frame forw. vector flag.  */
  BOOLEAN bpict_past_back;               /* Past B frame back vector flag.   */
  int past_intra_addr;                   /* Addr of last intracoded mblock.  */
  int recon_right_for_prev;              /* Past right forw. vector.         */
  int recon_down_for_prev;               /* Past down forw. vector.          */
  int recon_right_back_prev;             /* Past right back vector.          */
  int recon_down_back_prev;              /* Past down back vector.           */
} Macroblock;
2.6塊層(Block)
塊是一個正交的8pixels*8lines的亮度或者色度分量,塊可以指源畫面數(shù)據(jù)或者相應(yīng)的編碼數(shù)據(jù)元素。
8*8單位象素的源畫面數(shù)據(jù)經(jīng)過DCT變換后的成為了相應(yīng)的DCT系數(shù)塊。
塊的具體結(jié)構(gòu)為(xmplay源碼中的結(jié)構(gòu)定義):
typedef struct block {
  short int dct_recon[8][8];             /* Reconstructed dct coeff matrix. */
  short int dct_dc_y_past;               /* Past lum. dc dct coefficient.   */
  short int dct_dc_cr_past;              /* Past cr dc dct coefficient.     */
  short int dct_dc_cb_past;              /* Past cb dc dct coefficient.     */
} Block;

解析塊的語法結(jié)構(gòu)是:
block(i){
if(pattern_code[i]){
if(macroblock_intra){
if(i<4){
dct_dc_size_luminance
if(dc_size_luminance!=0)
dct_dc_differential
}
else{
dct_dc_size_chrominance
if(dc_size_chrominance!=0)
dct_dc_differential
}
}
else{
dct_coeff_first
}
if(picture_coding_type!=4){
while(nextbits()!=’10’)
dct_coeff_next
end_of_block
}
}
http://www.ds0101.net/bbs/TopicOther.asp?t=5&BoardID=19&id=889 , 引用的原址。

posted on 2009-07-14 14:49 TS,MPEG2,dvbc專家 閱讀(438) 評論(4)  編輯 收藏 引用

評論

# re: Mpeg2解壓縮的詳細(xì)過程 介紹。 2009-07-14 14:57 凡客誠品
來學(xué)習(xí)好東西:)  回復(fù)  更多評論
  

# re: Mpeg2解壓縮的詳細(xì)過程 介紹。 2009-07-14 15:01 戴爾電腦
看看  回復(fù)  更多評論
  

# re: Mpeg2解壓縮的詳細(xì)過程 介紹。 2009-07-14 17:12 TS,MPEG2,dvbc專家
請各位對照著code看看,那更有趣 !  回復(fù)  更多評論
  

# re: Mpeg2解壓縮的詳細(xì)過程 介紹。 2009-09-01 17:24 Guest
好東西。  回復(fù)  更多評論


TS,MPEG2,dvbc專家 2009-11-03 08:58 發(fā)表評論
]]>
BMP文件頭格式 bmp文件二進(jìn)制解析,bmp文件解析,bmp存儲格式 (2)http://www.shnenglu.com/dvb-dvb/archive/2009/10/26/99449.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Mon, 26 Oct 2009 00:54:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/10/26/99449.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99449.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/10/26/99449.html#Feedback3http://www.shnenglu.com/dvb-dvb/comments/commentRss/99449.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99449.html
 

http://blog.csdn.net/LaPizza/archive/2008/11/06/3235318. = 原創(chuàng),

BMP文件頭格式 bmp文件二進(jìn)制解析,bmp文件解析,bmp存儲格式

下面的表格是我整理的BMP文件頭的格式。

方便大家查詢。

 

Bmp的文件頭是 54 , 以下都是24 bit,

如果 圖像大小是 720 * 480 ,那么文件大小是: 54 + 720 * 480 *3 很好理解,

如果 圖像大小是 333 * 333那么文件大小就不是: 54 + 333 * 333 *3 ,奇怪么?,

   總算引出高人了,我就公布答案吧: 
   如果 圖像大小是 1*7  那么文件大小就是: 54 + 1*7*3 + 7*n ,
   如果 圖像大小是 3*5  那么文件大小就是: 54 + 3*5*3 + 5*n ,
   如果 圖像大小是 11*77  那么文件大小就是: 54 + 11*77*3 + 77*n ,
   總之是如果width * high * 3  + high * n ?。?4的倍數(shù), 那么文件大小就是 54 +  width * high * 3 + high*n  了。

   n的取值范圍是 0 ~~3   直到算下來,size是4的倍數(shù)。


 

posted on 2009-07-06 08:55 TS,MPEG2,dvbc專家 閱讀(441) 評論(8)  編輯 收藏 引用

評論

# re: BMP文件頭格式 bmp文件二進(jìn)制解析,bmp文件解析,bmp存儲格式 2009-07-06 10:59 99讀書人
不錯  回復(fù)  更多評論
  

# re: BMP文件頭格式 bmp文件二進(jìn)制解析,bmp文件解析,bmp存儲格式 2009-07-06 11:20 TS,MPEG2,dvbc專家
為什么圖像區(qū)大小,必須是4倍數(shù),還沒有理解. 請瀏覽者提供為什么,謝謝!  回復(fù)  更多評論
  

# re: BMP文件頭格式 bmp文件二進(jìn)制解析,bmp文件解析,bmp存儲格式 2009-07-06 19:45 童裝
寫得好!  回復(fù)  更多評論
  

# re: BMP文件頭格式 bmp文件二進(jìn)制解析,bmp文件解析,bmp存儲格式 2009-07-07 11:34 12530彩鈴
寫的不錯  回復(fù)  更多評論
  

# re: BMP文件頭格式 bmp文件二進(jìn)制解析,bmp文件解析,bmp存儲格式 2009-07-07 11:35 凡客誠品
寫得好!  回復(fù)  更多評論
  

# re: BMP文件頭格式 bmp文件二進(jìn)制解析,bmp文件解析,bmp存儲格式 2009-07-08 08:30 TS,MPEG2,dvbc專家
不錯的話,我將繼續(xù)!!!  回復(fù)  更多評論
  

# re: BMP文件頭格式 bmp文件二進(jìn)制解析,bmp文件解析,bmp存儲格式 2009-07-13 12:35 hongquan
圖像區(qū)數(shù)據(jù)必須是4的倍數(shù)是為了效率而設(shè)置的。在32bit的機(jī)器上,如果讀取數(shù)據(jù)的時候不是32bit alignment的話,那么cpu需要先讀取數(shù)據(jù)然后再做轉(zhuǎn)換,這樣的話會在效率上有所損失,這應(yīng)該就是為什么需要時4字節(jié)對齊的原因。而對于一個bitmap的話4byte對齊帶來的空間損耗是很小的,最多3個字節(jié)而已。  回復(fù)  更多評論
  

# re: BMP文件頭格式 bmp文件二進(jìn)制解析,bmp文件解析,bmp存儲格式 (2) 2009-07-14 13:55 TS,MPEG2,dvbc專家
并不是僅僅多3個字節(jié),我已經(jīng)更新blog內(nèi)容了。請瀏覽。  回復(fù)  更多評論
  


TS,MPEG2,dvbc專家 2009-10-26 08:54 發(fā)表評論
]]>
direct show,filter,elecard_demux做網(wǎng)絡(luò)播放器,主要格式:h264/avc,http://www.shnenglu.com/dvb-dvb/archive/2009/10/23/99306.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Fri, 23 Oct 2009 08:37:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/10/23/99306.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99306.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/10/23/99306.html#Feedback16http://www.shnenglu.com/dvb-dvb/comments/commentRss/99306.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99306.html 用的elecard的ax文件,自己寫source filter,播放mpeg2還可以,h264就不行了,關(guān)鍵請問題如下:

source仿照系統(tǒng)的asyncflt。cpp。.h :

 問題出在elecard的demux上面,
 首先,elecard公司寫demux filter的時候,肯定只是基于文件的--->  to h264來說,

to, mpeg2來說,都是可以的,
 原因如下: 如果是mpeg2, demux filter 先讀取一段數(shù)據(jù)去parse,找psi,如果找到了,就可以connect了,

因為是讀文件的,讀了一些數(shù)據(jù)為了connect, 所以connect 以后,必需調(diào)用 SetFilePointer(*g_pHFile,0,NULL,FILE_BEGIN);
 要不然,開頭的那一段就無法播放了

但是: 如果是h264, 他先讀取一段數(shù)據(jù)去parse,找psi,就算找到了,也不connect: 如果找到了,而且也是文件末尾了,那就connect

成功, 奶奶的,可是我的這個是網(wǎng)絡(luò)數(shù)據(jù)流,那有文件末尾,

他有個 set position的函數(shù),connect 后,就 set 0 了

 建立完整個 graph 之后繼續(xù)播放,不在乎之前的那點數(shù)據(jù)的---你知道, 前面的那個數(shù)據(jù)是多大呢16M

 DVB 標(biāo)清的話,用不了多少就可以搜完臺,用不了 16MB

關(guān)鍵是我怎么知道它到底讀多少數(shù)據(jù)就 parse完了呢,難道讓我一直等么?,

最早,標(biāo)清我只要3M的數(shù)據(jù),就必需建立graph了,現(xiàn)在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就 永遠(yuǎn)返回ok
 這樣就可以播放了,
 不過,浪費了我14M的數(shù)據(jù),唉,
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}



TS,MPEG2,dvbc專家 2009-10-23 16:37 發(fā)表評論
]]>
directshow,filter: 什么時候調(diào)用 m_pGraphBuilder->RemoveFilterhttp://www.shnenglu.com/dvb-dvb/archive/2009/10/21/99262.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Wed, 21 Oct 2009 05:36:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/10/21/99262.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99262.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/10/21/99262.html#Feedback6http://www.shnenglu.com/dvb-dvb/comments/commentRss/99262.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99262.html
directshow,filter: 什么時候調(diào)用 m_pGraphBuilder->RemoveFilter

code如下: 如果用下列函數(shù),調(diào)用系統(tǒng)自帶的File Source,就無需 調(diào)用 m_pGraph->RemoveFilter,只要

調(diào)用 pFIFileSource->release();就可以了。

但是,如果不是系統(tǒng)的,必需用m_pGraphBuilder->RemoveFilter(),否則,filter的析構(gòu)函數(shù)不會被調(diào)

用。


if (SUCCEEDED(hr)) 
  hr = CoCreateInstance(CLSID_AsyncSample, NULL, CLSCTX_INPROC,
        IID_IBaseFilter, (LPVOID *)

&pFIFileSource) ;
 if (SUCCEEDED(hr))
  hr = m_pGraphBuilder->AddFilter(pFIFileSource,L"Sample File Source");

 IFileSourceFilter *pAVIFileSource = NULL;

 if (SUCCEEDED(hr)) 
  hr = pFIFileSource->QueryInterface(IID_IFileSourceFilter,(void **)

&pAVIFileSource);


同樣:
if (SUCCEEDED(hr)) 
  hr = CoCreateInstance(CLSID_MYSocketSource, NULL, CLSCTX_INPROC,
        IID_IBaseFilter, (LPVOID *)

&pFIFileSource) ;
 if (SUCCEEDED(hr))
  hr = m_pGraphBuilder->AddFilter(pFIFileSource,L"MY Socket Source");


...
最后必需用m_pGraphBuilder->RemoveFilter(),否則,filter的析構(gòu)函數(shù)不會被調(diào)用。否則有很大的內(nèi)

存泄露。

不知道是什么原因:

因為  www.directshow.cn: 這個網(wǎng)址不行了,所以貼出下列code,請大家分享。


HRESULT ConnectPins( IGraphBuilder* pGraphBuilder,
     IBaseFilter* pOutput,
     IBaseFilter* pInput,
     int nOutIndex,
     int nInIndex)
{
 HRESULT hr = NOERROR;
 ULONG cFetched = 0;
 IEnumPins* pEnumPins = 0;
 IPin* pPinOutput = 0;
 IPin* pPinInput = 0;

 //enum output filter pins.
 hr = pOutput->EnumPins(&pEnumPins);
 if(FAILED(hr))
 {
  return hr;
 }
 //if the pin to connect is not the first one, we must skip nOutIndex-1 pins.
 if(nOutIndex>1)
 {
  hr = pEnumPins->Skip(nOutIndex-1);
  if(FAILED(hr))
  {
   pEnumPins->Release();
   return hr;
  }
 }
 //now we can get the output pin we wanted.
 hr = pEnumPins->Next(1,&pPinOutput,&cFetched);
 if(FAILED(hr))
 {
  pEnumPins->Release();
  return hr;
 }
 pEnumPins->Release();

 //enum input filter pins.
 hr = pInput->EnumPins(&pEnumPins);
 if(FAILED(hr))
 {
  pPinOutput->Release();
  return hr;
 }
 //if input pin is not the first to connect, we must skip nInIndex-1 pins.
 if(nInIndex>1)
 {
  hr = pEnumPins->Skip(nInIndex-1);
  if( FAILED(hr) )
  {
   pPinOutput->Release();
   pEnumPins->Release();
   return hr;
  }
 }
 //now we can get the input pin we wanted.
 hr = pEnumPins->Next(1,&pPinInput,&cFetched);
 if(FAILED(hr))
 {
  pPinOutput->Release();
  pEnumPins->Release();
  return hr;
 }
 pEnumPins->Release();

 //now connect from output pin to input pin.
 hr = pGraphBuilder->Connect(pPinOutput,pPinInput);
 pPinOutput->Release();
 pPinInput->Release();
 return hr;
}
IPin* xMyFindPin(IBaseFilter *pFilter, const WCHAR achName[])
{
 BOOL       bFound = FALSE;
 IEnumPins  *pEnum;
 IPin       *pPin;
 PIN_INFO pininfo;

 if(pFilter==NULL)
  return NULL;
 pFilter->EnumPins(&pEnum);
 while(pEnum->Next(1, &pPin, 0) == S_OK)
 {
  pPin->QueryPinInfo(&pininfo);
  pininfo.pFilter->Release();
  if (bFound = (0 == wcscmp(pininfo.achName,achName)))
   break;
  pPin->Release();
 }
 pEnum->Release();
 return (bFound ? pPin : 0); 
}
static const GUID  CLSID_NULL_USER1=
{0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

HRESULT GetUnconnectedPin( IBaseFilter *pFilter,
        PIN_DIRECTION PinDir,
        IPin **ppPin,GUID gMajortype,WCHAR *achName)
{
 *ppPin = 0;
 IEnumPins *pEnum = 0;
 IPin *pPin = 0;
 HRESULT hr = pFilter->EnumPins( &pEnum );
 if( FAILED( hr ) )
 {
  return hr;
 }
 while( pEnum->Next( 1, &pPin, NULL ) == S_OK )
 {
  PIN_DIRECTION ThisPinDir;
  pPin->QueryDirection( &ThisPinDir );
  if( ThisPinDir == PinDir )
  {
   IPin *pTmp = 0;
   hr = pPin->ConnectedTo( &pTmp );
   if( SUCCEEDED( hr ) )
   {
    pTmp->Release( );
   }
   else
   {    
    PIN_INFO pininfo;
    pPin->QueryPinInfo(&pininfo);
    pininfo.pFilter->Release();
    if(achName && (wcslen(achName)>= wcslen(pininfo.achName)))
     wcscpy(achName,pininfo.achName);

    if(gMajortype==CLSID_NULL_USER1)
    {
     pEnum->Release( );
     *ppPin = pPin;
     return S_OK;
    }
    else
    {
     IEnumMediaTypes* pTypeEnum;
     hr = pPin->EnumMediaTypes (&pTypeEnum);

     hr =pTypeEnum->Reset();
     AM_MEDIA_TYPE* pMediaType;
     ULONG            ul ;

     do
     {
      hr = pTypeEnum->Next(1, &pMediaType, &ul) ;
      if (FAILED(hr) || 0 == ul)
      {
       pTypeEnum->Release();
       //pEnum->Release( );
       if(pTmp)
        pTmp->Release();
       break ;
      }

      if (pMediaType->majortype == gMajortype)
      // ||       pMediaType->subtype == MEDIASUBTYPE_DVSD)
      { pTypeEnum->Release();
       pEnum->Release( );
       *ppPin = pPin;
       return S_OK;
      }
     }while (1) ;   

    }
   }
   if(pTmp)
    pTmp->Release();
  }
  pPin->Release( );
 }
 pEnum->Release( );

 return E_FAIL;
}



TS,MPEG2,dvbc專家 2009-10-21 13:36 發(fā)表評論

文章來源:http://www.cnitblog.com/dvb-dvb/archive/2009/10/21/directshow.html

TS,MPEG2,dvbc專家 2009-10-21 13:36 發(fā)表評論
]]>
vlc學(xué)習(xí)計劃(6~~9)http://www.shnenglu.com/dvb-dvb/archive/2009/10/16/99263.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Fri, 16 Oct 2009 01:16:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/10/16/99263.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99263.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/10/16/99263.html#Feedback0http://www.shnenglu.com/dvb-dvb/comments/commentRss/99263.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99263.html
 第一部分 變量及宏定義
  1.消息映射宏
   vlc_module_begin();
   …………………..
  vlc_module_end();
  2.結(jié)構(gòu)中包含函數(shù)
   struct input_thread_t
  {
   VLC_COMMON_MEMBERS
   /* Thread properties */
   vlc_bool_t b_eof;
   vlc_bool_t b_out_pace_control;
   /* Access module */
   module_t * p_access;
   ssize_t (* pf_read ) ( input_thread_t *, byte_t *, size_t );
   int (* pf_set_program )( input_thread_t *, pgrm_descriptor_t * );
   int (* pf_set_area )( input_thread_t *, input_area_t * );
   void (* pf_seek ) ( input_thread_t *, off_t );
  }
  3.宏與換行符妙用
  #define VLC_COMMON_MEMBERS /** \name VLC_COMMON_MEMBERS * these members are common for all vlc objects */ /**@{*/ int i_object_id; int

i_object_type; char *psz_object_type; char *psz_object_name; /** Just a reminder so that people don't cast garbage */ int

be_sure_to_add_VLC_COMMON_MEMBERS_to_struct; /**@}*/
  #define VLC_OBJECT( x ) \
  ((vlc_object_t *)(x))+
  0*(x)- be_sure_to_add_VLC_COMMON_MEMBERS_to_struct
  struct vlc_object_t
  {
   VLC_COMMON_MEMBERS
  };//定義一個結(jié)構(gòu)來使用宏定義的公共成員
  4.定義導(dǎo)出函數(shù)
  #ifndef __PLUGIN__
  # define VLC_EXPORT( type, name, args ) type name args
  #else
  # define VLC_EXPORT( type, name, args ) struct _u_n_u_s_e_d_
   extern module_symbols_t* p_symbols;
  #endif
  5.定義回調(diào)函數(shù)
  typedef int ( * vlc_callback_t ) ( vlc_object_t *, /* variable's object */
   char const *, /* variable name */
   vlc_value_t, /* old value */
   vlc_value_t, /* new value */
   void * ); /* callback data */
  6.函數(shù)作為參數(shù)的定義方式
   Int Fun(int n,int (*pf)(int ,int),char *pstr)
  { int j =10;
  pf(n,j);
  }
  7.回調(diào)函數(shù)的聲明
  必須聲明為global,或者static
  Int vlc_callback_t (int ,int)
  {。。。。。。。。。。。}
  
  8.回調(diào)函數(shù)的使用
   Fun(0, vlc_callback_t,”test”);
  9.函數(shù)表達(dá)式
  #define input_BuffersInit(a) __input_BuffersInit(VLC_OBJECT(a))
  void * __input_BuffersInit( vlc_object_t * );
  #define module_Need(a,b,c,d) __module_Need(VLC_OBJECT(a),b,c,d)
  VLC_EXPORT( module_t *, __module_Need, ( vlc_object_t *, const char *, const char *, vlc_bool_t ) );
  10.定義函數(shù)
   /* Dynamic array handling: realloc array, move data, increment position */
  #define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem ) do { if( i_oldsize ) { (p_ar) = realloc( p_ar, ((i_oldsize) + 1) * sizeof( *(p_ar) )

); } else { (p_ar) = malloc( ((i_oldsize) + 1) * sizeof( *(p_ar) ) ); } if( (i_oldsize) - (i_pos) ) { memmove( (p_ar) + (i_pos) + 1, (p_ar) +

(i_pos), ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) ); } (p_ar)[i_pos] = elem; (i_oldsize)++; } while( 0 )
  應(yīng)用為:
   INSERT_ELEM( p_new- p_libvlc- pp_objects,
   p_new- p_libvlc- i_objects,
   p_new- p_libvlc- i_objects,
   p_new );
  11.改變地址的方式傳遞其值
  stream_t *input_StreamNew( input_thread_t *p_input )
  { stream_t *s = vlc_object_create( p_input, sizeof( stream_t ) );
   input_stream_sys_t *p_sys;
   if( s )
   {
   s- p_sys = malloc( sizeof( input_stream_sys_t ) );
   p_sys = (input_stream_sys_t*)s- p_sys;
   p_sys- p_input = p_input;
   }
  return s;//注解:s- p_sys改變了
  }
   第二部分 程序框架實現(xiàn)
  1.播放列表文件src/playlist/playlist.c的線程
  playlist_t * __playlist_Create ( vlc_object_t *p_parent )函數(shù)中創(chuàng)建的線程,線程函數(shù)為
  static void RunThread ( playlist_t *p_playlist )
   線程思路分析:
   在RunThread里面執(zhí)行循環(huán),如果沒有任務(wù)執(zhí)行,則適當(dāng)?shù)难舆t,如果接到p_playlist- i_status != PLAYLIST_STOPPED的條件,則調(diào)用PlayItem(

p_playlist )函數(shù),在PlayItem( p_playlist )函數(shù)中從新創(chuàng)建輸入線程。
  通過void playlist_Command( playlist_t * p_playlist, playlist_command_t i_command,int i_arg )接收來自GUI界面的各種命令,然后設(shè)置p_playlist-

i_status的狀態(tài),由該狀態(tài)改變該播放列表文件主循環(huán)線程的執(zhí)行。
  2.輸入文件SRC/INPUT/INPUT.C的輸入線程
   input_thread_t *__input_CreateThread( vlc_object_t *p_parent,
   input_item_t *p_item )函數(shù)中創(chuàng)建的線程,線程函數(shù)為
  static int RunThread( input_thread_t *p_input )
   線程思路分析:
  由 input_thread_t結(jié)構(gòu)的成員分析是接收文件流還是網(wǎng)絡(luò)流,如果是文件流,則調(diào)用file module 的讀函數(shù)(pf_read)和打開函數(shù)(--).如果是network 則打

開network module 的打開函數(shù)和讀函數(shù)(pf_read)。
   在 RunThread線程函數(shù)中接收數(shù)據(jù)和調(diào)用demux 或者decode etc處理。
  一旦產(chǎn)生新的輸入,則在播放列表線程中會首先結(jié)束該輸入線程,然后從新創(chuàng)建新的輸入線程。
  3.視頻輸出文件src/video_output/ video_output.c的線程
  vout_thread_t * __vout_Create( vlc_object_t *p_parent,
   unsigned int i_width, unsigned int i_height,
   vlc_fourcc_t i_chroma, unsigned int i_aspect )函數(shù)中創(chuàng)建的線程,線程函數(shù)為
  static void RunThread( vout_thread_t *p_vout)
  線程思路分析:
   在RunThread里面執(zhí)行循環(huán),任務(wù)是顯示視頻。
  4.在modules\gui\wxwindows\wxwindows.cpp中的GUI線程
  static void Run( intf_thread_t *p_intf ) 函數(shù)中創(chuàng)建的線程,線程函數(shù)為
   static void Init( intf_thread_t *p_intf )
  線程思路分析:
   在Init( intf_thread_t *p_intf )里面執(zhí)行循環(huán),創(chuàng)建新的GUI實例。Instance-》OnInit()(CreateDialogsProvider)-》DialogsProvider為運(yùn)行的對話

框。
   接收網(wǎng)絡(luò)文件的步驟
  OnOpenNet( wxCommandEvent& event )打開網(wǎng)絡(luò)文件的步驟。打開OpenDialog對話框,點擊Ok后調(diào)用OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event)

)函數(shù),調(diào)用playlist_Command函數(shù)改變播放列表線程的狀態(tài)。
   激活線程分析:
   在wxwindow.cpp中的消息映射中 set_callbacks( OpenDialogs, Close ); 則設(shè)置了module_t- pf_activate= OpenDialogs函數(shù),
   在module.c 的__module_Need( vlc_object_t *p_this, const char *psz_capability,
   const char *psz_name, vlc_bool_t b_strict )
  函數(shù)中用到了pf_activate激活GUI對話框;
   在video_output.c 的static void RunThread( vout_thread_t *p_vout)線程中,也用到了pf_activate激活GUI對話框;
  5.開始所有module 的精髓
   消息映射宏
   vlc_module_begin();
   set_callbacks( NetOpen, NULL );
  vlc_module_end();
  然后設(shè)置模塊結(jié)構(gòu)的成員函數(shù)為:
  #define set_callbacks( activate, deactivate ) p_submodule- pf_activate = activate; p_submodule- pf_deactivate = deactivate
  在__module_Need函數(shù)中啟動pf_activate 激活相應(yīng)的module。


網(wǎng)絡(luò)數(shù)據(jù)流接收處理分析
  1、在input.c(src\input)文件中的主線程循環(huán)
   Thread in charge of processing the network packets and demultiplexing
  RunThread( input_thread_t *p_input )
  {
   InitThread( p_input ) ;
  …………………………………………………….
   input_SelectES( p_input, p_input->stream.p_newly_selected_es );
   …………………………………………………….
   /* Read and demultiplex some data. */
   i_count = p_input->pf_demux( p_input );
  }
  2、在下列函數(shù)中:
  分離出access , demux , name字符串 ;
  根據(jù)分離出的access 字符串通過module_Need函數(shù)找到acess 指針模塊;
  根據(jù)分離出的demux 字符串通過module_Need函數(shù)找到demux 指針模塊;
  static int InitThread( input_thread_t * p_input )
  {
   msg_Dbg( p_input, "access `%s', demux `%s', name `%s'",
   p_input->psz_access, p_input->psz_demux, p_input->psz_name );
   /* Find and open appropriate access module */
   p_input->p_access = module_Need( p_input, "access",
   p_input->psz_access, VLC_TRUE );
  …………………………………………………….
   while( !input_FillBuffer( p_input ) )
   …………………………………………………….
   /* Find and open appropriate demux module */
   p_input->p_demux =
   module_Need( p_input, "demux",
   (p_input->psz_demux && *p_input->psz_demux) ?
   p_input->psz_demux : "$demux",
   (p_input->psz_demux && *p_input->psz_demux) ?
   VLC_TRUE : VLC_FALSE );
  …………………………………………………….
  }
  3、在ps.c (module\demux\mpeg)文件中
  a.通過消息映射宏賦值啟動函數(shù)Activate;
  b.通過函數(shù)Activate賦值p_input->pf_demux = Demux;
  c. 通過函數(shù)module_Need( p_input, "mpeg-system", NULL, 0 ) 激活p_input->p_demux_data->mpeg.pf_read_ps( p_input, &p_data )函數(shù)(pf_read_ps)

;
  d.在InitThread函數(shù)中激活;
   static int Activate( vlc_object_t * p_this )
  {
   /* Set the demux function */
  p_input->pf_demux = Demux;
  p_input->p_private = (void*)&p_demux->mpeg;
   p_demux->p_module = module_Need( p_input, "mpeg-system", NULL, 0 );
  }
  4、在system.c (module\demux\mpeg)文件中
   賦值解碼模塊mpeg_demux_t的成員函數(shù);
   static int Activate ( vlc_object_t *p_this )
  {
   static mpeg_demux_t mpeg_demux =
   { NULL, ReadPS, ParsePS, DemuxPS, ReadTS, DemuxTS };
   mpeg_demux.cur_scr_time = -1;
   memcpy( p_this->p_private, &mpeg_demux, sizeof( mpeg_demux ) );
   return VLC_SUCCESS;
  }
  并且申明函數(shù)static ssize_t ReadPS( input_thread_t * p_input, data_packet_t ** pp_data );
  5、在ps.c (module\demux\mpeg)文件中
  Demux( input_thread_t * p_input )
  {
  i_result = p_input->p_demux_data->mpeg.pf_read_ps( p_input, &p_data );
   p_input->p_demux_data->mpeg.pf_demux_ps( p_input, p_data );
  }
  進(jìn)行讀取數(shù)據(jù)和分離工作;
  6、在system.c (module\demux\mpeg)文件中
  數(shù)據(jù)走向圖如下
  ReadPS-> PEEK-> input_Peek(src\input\input_ext-plugins.c)-> input_FillBuffert 通過 i_ret = p_input->pf_read( p_input,
   (byte_t *)p_buf + sizeof(data_buffer_t)
   + i_remains,
   p_input->i_bufsize );
  input_thread_t結(jié)構(gòu)的pf_read函數(shù)成員如果是為udp.c(modules\access)的RTPChoose函數(shù)
  則在開啟access(UDP 模塊)時通過module_need 激活;
  激活網(wǎng)絡(luò)讀數(shù)據(jù)模塊 RTPChoose(modules\access\ udp.c)->Read->net_Read(src\misc\net.c);
  7、在input_programs.c(src\input)文件中
   運(yùn)行解碼器對ES流解碼
   int input_SelectES( input_thread_t * p_input, es_descriptor_t * p_es )
  {
   p_es->p_dec = input_RunDecoder( p_input, p_es );
  
  }
  input_SelectES(src\input\input_programs.c)->input_RunDecoder(src \input\input_dec.c)->DecoderThread->DecoderDecode -

>vout_DisplayPicture

 


從接收到數(shù)據(jù)流到播放視頻的過程分析

   從網(wǎng)絡(luò)接收到流->對數(shù)據(jù)流進(jìn)行視頻和音頻分離->對視頻用解碼器解碼->顯示解碼后的視頻流

 

    視頻顯示部分走勢線:分離->解碼->新的VOUT緩沖區(qū)->VOUT線程

Demux(modules\demux\mpeg\ps.c)->DemuxPs(modules\demux\mpeg\system.c)-> ParsePS->input_SelectES(src\input\input_programs.c)->input_RunDecoder

(src\input\input_dec.c)->CreateDecoder->

vout_new_buffer->vout_Request(src\video_output\video_output.c)->vout_Create->RunThread->vout_RenderPicture(src\video_output\vout_pictures.c)-

>pf_display

 

注意:p_dec->pf_vout_buffer_new = vout_new_buffer的pf_vout_buffer_new在ffmpeg_NewPictBuf(modules\codec\ffmpeg\video.c)函數(shù)中激活

 

   解碼部分走勢線:

Demux(modules\demux\mpeg\ps.c)->DemuxPs(modules\demux\mpeg\system.c)-> ParsePS->input_SelectES(src\input\input_programs.c)->input_RunDecoder

(src\input\input_dec.c)->CreateDecoder->


DecoderThread

  注意:在解碼線程中對數(shù)據(jù)流(AUDIO 或者VIDEO)進(jìn)行解碼

詳細(xì)資料 http://developers.videolan.org/vlc/    VLC API documentation  或者VLC developer documentation

 
Chapter 5.  The video output layer
Data structures and main loop

Important data structures are defined in include/video.h and include/video_output.h. The main data structure is picture_t, which describes

everything a video decoder thread needs. Please refer to this file for more information. Typically, p_data will be a pointer to YUV planar

picture.

Note also the subpicture_t structure. In fact the VLC SPU decoder only parses the SPU header, and converts the SPU graphical data to an

internal format which can be rendered much faster. So a part of the "real" SPU decoder lies in src/video_output/video_spu.c.

The vout_thread_t structure is much more complex, but you needn't understand everything. Basically the video output thread manages a heap of

pictures and subpictures (5 by default). Every picture has a status (displayed, destroyed, empty...) and eventually a presentation time. The

main job of the video output is an infinite loop to : [this is subject to change in the near future]

   1.

      Find the next picture to display in the heap.
   2.

      Find the current subpicture to display.
   3.

      Render the picture (if the video output plug-in doesn't support YUV overlay). Rendering will call an optimized YUV plug-in, which will

also do the scaling, add subtitles and an optional picture information field.
   4.

      Sleep until the specified date.
   5.

      Display the picture (plug-in function). For outputs which display RGB data, it is often accomplished with a buffer switching. p_vout-

>p_buffer is an array of two buffers where the YUV transform takes place, and p_vout->i_buffer_index indicates the currently displayed buffer.
   6.

      Manage events.

Methods used by video decoders

The video output exports a bunch of functions so that decoders can send their decoded data. The most important function is vout_CreatePicture

which allocates the picture buffer to the size indicated by the video decoder. It then just needs to feed (void *) p_picture->p_data with the

decoded data, and call vout_DisplayPicture and vout_DatePicture upon necessary.

    *

      picture_t * vout_CreatePicture ( vout_thread_t *p_vout, int i_type, int i_width, int i_height ) : Returns an allocated picture buffer.

i_type will be for instance YUV_420_PICTURE, and i_width and i_height are in pixels.
      Warning

      If no picture is available in the heap, vout_CreatePicture will return NULL.
    *

      vout_LinkPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Increases the refcount of the picture, so that it doesn't get accidently

freed while the decoder still needs it. For instance, an I or P picture can still be needed after displaying to decode interleaved B pictures.
    *

      vout_UnlinkPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Decreases the refcount of the picture. An unlink must be done for every

link previously made.
    *

      vout_DatePicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Gives the picture a presentation date. You can start working on a picture

before knowing precisely at what time it will be displayed. For instance to date an I or P picture, you must wait until you have decoded all

previous B pictures (which are indeed placed after - decoding order != presentation order).
    *

      vout_DisplayPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Tells the video output that a picture has been completely decoded and

is ready to be rendered. It can be called before or after vout_DatePicture.
    *

      vout_DestroyPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Marks the picture as empty (useful in case of a stream parsing error).
    *

      subpicture_t * vout_CreateSubPicture ( vout_thread_t *p_vout, int i_channel, int i_type ) : Returns an allocated subpicture buffer.

i_channel is the ID of the subpicture channel, i_type is DVD_SUBPICTURE or TEXT_SUBPICTURE, i_size is the length in bytes of the packet.
    *

      vout_DisplaySubPicture ( vout_thread_t *p_vout, subpicture_t *p_subpic ) : Tells the video output that a subpicture has been completely

decoded. It obsoletes the previous subpicture.
    *

      vout_DestroySubPicture ( vout_thread_t *p_vout, subpicture_t *p_subpic ) : Marks the subpicture as empty.

 


VLC(五) 視頻播放的基本原理

    當(dāng)初Roger看VLC代碼花了不少時間,其中很大的原因是不太了解視頻播放的基本原理?,F(xiàn)在看來,幾乎所有的視頻播放器,如VLC、MPlayer、 Xine,包括

DirectShow,在播放視頻的原理和架構(gòu)上都是非常相似的,理解這個對理解VLC的源碼會有事半功倍的效果。

    大致的來說,播放一個視頻分為4個步驟:

    1.  acess 訪問,或者理解為接收、獲取、得到

    2. demux 解復(fù)用,就是把通常合在一起的音頻和視頻分離(還有可能的字幕)  

    3. decode 解碼,包括音頻和視頻的解碼

    4. output 輸出,也分為音頻和視頻的輸出(aout和vout)

    拿播放一個UDP組播的MPEG TS流來說吧,access部分負(fù)責(zé)從網(wǎng)絡(luò)接收組播流,放到VLC的內(nèi)存緩沖區(qū)中,access模塊關(guān)注IP協(xié)議,如是否IPv6、組播地址、組

播協(xié)議、端口等信息;如果檢測出來是RTP協(xié)議(RTP協(xié)議在UDP頭部簡單得加上了固定12個字節(jié)的信息),還要分析RTP頭部信息。這部分可以參看VLC源碼

/modules/access/udp.c 。在同目錄下還可以看到大量的access模塊,如file、http、dvd、ftp、smb、tcp、dshow、mms、v4l…等等

    而demux部分首先要解析TS流的信息。TS格式是MPEG2協(xié)議的一部分,概括地說,TS通常是固定188字節(jié)的一個packet,一個TS流可以包含多個program(節(jié)目)

,一個program又可以包含多個視頻、音頻、和文字信息的ES流;每個ES流會有不同的PID標(biāo)示。而又為了可以分析這些ES流,TS有一些固定的PID用來間隔發(fā)送

program和es流信息的表格:PAT和PMT表。關(guān)于TS格式的詳細(xì)信息可以去google一下。

    VLC專門做了一個獨立的庫libdvbpsi來解析和編碼TS流,而調(diào)用它的代碼可以參見VLC源碼 /modules/demux/ts.c。

    其實之所以需要demux,是因為音視頻在制作的時候?qū)嶋H上都是獨立編碼的,得到的是分開的數(shù)據(jù),為了傳輸方便必須要用某種方式合起來,這就有了各種封

裝格式也就有了demux。

    demux分解出來的音頻和視頻流分別送往音頻解碼器和視頻解碼器。因為原始的音視頻都是占用大量空間,而且冗余度較高的數(shù)據(jù),通常在制作的時候就會進(jìn)

行某種壓縮。這就是我們熟知的音視頻編碼格式,包括MPEG1(VCD)、MPEG2(DVD)、MPEG4、H.264、rmvb等等。音視頻解碼器的作用就是把這些壓縮了的數(shù)據(jù)還

原成原始的音視頻數(shù)據(jù)。VLC解碼MPEG2使用了一個獨立的庫libmpeg2,調(diào)用它的源文件是 /modules/codec/libmpeg2.c。VLC關(guān)于編解碼的模塊都放

在/modules/codec目錄下,其中包括著名的龐大的 ffmpeg。

    解碼器,例如視頻解碼器輸出的是一張一張的類似位圖格式的圖像,但是要讓人從屏幕看得到,還需要一個視頻輸出的模塊。當(dāng)然可以像一個Win32窗口程序

那樣直接把圖像畫到窗口DC上——VLC的一個輸出模塊WinGDI就是這么干的,但是通常這太慢了,而且消耗大量的CPU。在Windows下比較好的辦法是用DirectX的接

口,會自動調(diào)用顯卡的加速功能。

    這樣的功能分解使得模塊化更容易一點,每個模塊住需要專注于自己的事;從整體來說功能強(qiáng)大而且靈活。

    但是事情總是不會那么簡單。就拿access來說,媒體的訪問是分層的,如RTSP就涉及到IPv4、TCP、UDP、RTCP、RTSP等多個層次的協(xié)議。有些視頻格式包括了

傳輸、封裝格式和編輯碼格式如MPEG系列,有些封裝格式是獨立的容器,但是很多人會誤解它是編解碼格式,如mkv、avi這些。

    音頻和視頻在demux之后就是獨立的,但是需要有一套機(jī)制把它們同步起來。同時我們需要有一套機(jī)制來控制速度、暫停、停止、跳進(jìn),獲取各種媒體信息,

這些都是很復(fù)雜而又很重要的事情。

    另外也許需要在某個地方插入一些修改,來實現(xiàn)某種效果。如音頻的EQ,視頻的亮度調(diào)整之類的,VLC專門設(shè)計了access_filter、audio_filter和

video_filter類型的模塊來做這一類事情。

    VLC比較獨特的地方是集成了原來的VLS的功能,這依賴于VLC中stream_output類型的模塊,它們可以把正在播放的視頻以某種方式重新轉(zhuǎn)碼和發(fā)送出去,如

http、UDP、文件等等。

    MPlayer的結(jié)構(gòu)與此是類似的,如/stream目錄對應(yīng)的是access的功能,/mpdemux對應(yīng)的demux功能,/libmpcodecs是解碼器,/libvo和/libao2分別是視頻和音

頻的輸出。

    DirectShow也是類似的,不過分類更多一些更復(fù)雜一點。DirectShow里面的模塊叫做“filter”,filter之間通過”pin”來連接。access的模塊對應(yīng)于

DirectShow中的Source FIlter,這一類Filter只有輸出pin沒有輸入pin。demux模塊對應(yīng)于splitter filter,這種filter有一個輸入pin,多個輸出pin。解碼模

塊是一類transform filter,有一個輸入pin、一個輸出pin,輸出模塊對應(yīng)于readering filter,有一個輸入pin,沒有輸出pin。當(dāng)然transform filter不一定是

解碼器,也可能是某種其他的處理。

    回到VLC的話題。每一類的模塊數(shù)量都很多,那么在打開某一個視頻時,VLC如何決定采用哪一個呢?哈哈,這個以后再說 ^_^

    另外給出一個VLC的API Document,有點老了不過挺值得一看的,在VLC wiki上找不到了,就貼出來:http://rogerfd.cn/doc/vlcapi.htm

  

————————————————————————

作者: roger

Blog: http://rogerfd.cn

Email:roger99707@163.com

本文歡迎轉(zhuǎn)載和引用,請保留本說明并注明出處



TS,MPEG2,dvbc專家 2009-10-16 09:16 發(fā)表評論

文章來源:http://www.cnitblog.com/dvb-dvb/archive/2009/10/16/61895.html

TS,MPEG2,dvbc專家 2009-10-16 09:16 發(fā)表評論
]]>
vlc學(xué)習(xí)計劃(1~~5)http://www.shnenglu.com/dvb-dvb/archive/2009/10/12/99264.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Mon, 12 Oct 2009 01:07:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/10/12/99264.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99264.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/10/12/99264.html#Feedback11http://www.shnenglu.com/dvb-dvb/comments/commentRss/99264.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99264.html
一 videolan-howto-en-html
  該文檔完全描述了VideoLAN "流"的解決方法.
  VideoLAN 項目包括兩個軟件.
   1) VLC:以前是視頻流接收的客戶端,但是現(xiàn)在也可以作為服務(wù)端工作.
   2) VLS:視頻服務(wù)端,能發(fā)送 MPEG-1, MPEG-2 and MPEG-4 files, DVDs, digital satellite

channels, digital terrestial television channels and live videos on the network in unicast or

multicast.
  1.VLC 在REDHAT 下的安裝
  從下面的鏈接中下載 vlc的包和包所需要的庫,把他們都放在同一個目錄.
  http://www.videolan.org/vlc/download-redhat.html
  
   源代碼安裝:
   源代碼安裝需要的庫如下:
   libdvbpsi (compulsory) ,
   mpeg2dec (compulsory) ,
   libdvdcss if you want to be able to read encrypted DVDs ,
   libdvdplay if you want to have DVD menu navigation ,
   a52dec if you want to be able to decode the AC3 (i.e. A52) sound format often used in

DVDs ,
   ffmpeg, libmad, faad2 if you want to read MPEG 4 / DivX files ,
   libogg & libvorbis if you want to read Ogg Vorbis files .
  2.VLC在命令行下接收流
  Receive an unicast stream
  % vlc -vvv udp:
  Receive a multicast stream
  % vlc -vvv udp:@239.255.12.42
  where 239.255.12.42 is the multicast IP address you want to join.
  Receive an HTTP/FTP/MMS stream
  Use one of the following command lines:
  % vlc -vvv http://example/stream.xyz
  where http://example/stream.xyz is the HTTP address of the stream;
  % vlc -vvv ftp://example/stream.xyz
  where ftp://example/stream.xyz is the FTP address of the stream;
  % vlc -vvv ms://viptvr.yacast.fr/encoderfranceinfo
  where mms://viptvr.yacast.fr/encoderfranceinfo is the MMS address of the stream.
  Receive a RTP stream available through RTSP
  % vlc -vvv rtsp://www.hardradio.com/tonbeme.mov
  where rtsp://www.hardradio.com/tonbeme.mov is the address of the stream.
  Receive a stream described by an SDP file
  % vlc -vvv http://server.example.org/stream.sdp
  3.VLC在命令行下發(fā)送流
  % vlc -vvv video1.xyz --sout udp:192.168.0.42 --ttl 12
  where:
   *video1.xyz is the file you want to stream,
   *192.168.0.42 is either:
   o the IP address of the machine you want to unicast to;
   o or the DNS name the machine you want to unicast to;
   o or a multicast IP address.
   *12 is the value of the TTL (Time To Live) of your IP packets (which means that the

stream will be able to cross 11 routers).
  If you want to stream the file continuously, add the --loop option.
  4.VLC 高級應(yīng)用(VLC's stream output (transcoding, multiple streaming, etc...))
   語法: Please refer to the" command line interface" chapter of the "VLC user guide "to

learn the syntax of VLC's stream output.
   例子:
   ----編碼方面的例子
  Transcode the input stream and send it to a multicast IP address with the associated SAP

announce:
  % vlc -vvv input_stream --sout '#transcode

{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:
  standard{access=udp,mux=ts,url=239.255.12.42,sap,name="TestStream"}'
  Display the input stream, transcode it and send it to a multicast IP address with the

associated SAP announce:
  % vlc -vvv input_stream --sout '#duplicate{dst=display,dst=
  "transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:
  standard{access=udp,mux=ts,url=239.255.12.42,sap,name="TestStream"}"}'
  Transcode the input stream, display the transcoded stream and send it to a multicast IP

address with the associated SAP announce:
  % vlc -vvv input_stream --sout '#transcode

{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:
  duplicate{dst=display,dst=standard

{access=udp,mux=ts,url=239.255.12.42,sap,name="TestStream"}}'
  --多種流的例子
  Send a stream to a multicast IP address and a unicast IP address:
  % vlc -vvv input_stream --sout '#duplicate{dst=
  standard{access=udp,mux=ts,url=239.255.12.42,sap,name="TestStream"},
  dst=standard{access=udp,mux=ts,url=192.168.1.2}}'
  Display the stream and send it to two unicast IP addresses:
  % vlc -vvv input_stream --sout '#duplicate{dst=display,dst=
  standard{access=udp,mux=ts,url=192.168.1.12},
  dst=standard{access=udp,mux=ts,url=192.168.1.42}}'
  Send parts of a multiple program input stream:
  % vlc -vvv multiple_program_input_stream
  --sout '#duplicate{dst=standard

{access=udp,mux=ts,url=239.255.12.42},select="program=12345",
  dst=standard{access=udp,mux=ts,url=239.255.12.43}, select="video,program=1234-2345"}'
  This command sends the program of the input stream which id is 12345 to 239.255.12.42 and

all video programs with id between 1234 and 2345 to 239.255.12.43.
  Transcoding and multiple streaming
  Transcode the input stream, display the transcoded stream and send it to a multicast IP

address with the associated SAP announce and an unicast IP address:
  % vlc -vvv input_stream --sout '#transcode

{vcodec=mp4v,acodec=mpga,vb=800,ab=128,deinterlace}:
  duplicate{dst=display,dst=standard

{access=udp,mux=ts,url=239.255.12.42,sap,name="TestStream"},
  dst=standard{access=udp,mux=ts,url=192.168.1.2}}'
  Display the input stream, transcode it and send it to two unicast IP addresses:
  % vlc -vvv input_stream --sout '#duplicate{dst=display,
  dst="transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128}:
  duplicate{dst=standard{access=udp,mux=ts,url=192.168.1.2},
  dst=standard{access=udp,mux=ts,url=192.168.1.12}"}'
  Send the input stream to a multicast IP address and the transcoded stream to another

multicast IP address with the associated SAP announces:
  % vlc -vvv input_stream --sout '#duplicate{dst=
  standard{access=udp,mux=ts,url=239.255.1.2,sap,name="OriginalStream"},
  dst="transcode{vcodec=mp4v,acodec=mpga,vb=800,ab=128}:
  standard{access=udp,mux=ts,url=239.255.1.3,sap,name="TranscodedStream"}"}'
 
此文章為轉(zhuǎn)載,原文出處為,http://www.wangchao.net.cn/bbsdetail_58052.html

 
.1.在RH9上的安裝需要
   1).RH9的升級包.
   2).FC2的RPM包
   詳細(xì)說明清參見:http://www.videolan.org/vlc/download-redhat.html
   以上VLC 版本為:0.7.2
  2.下載RH9的升級包
   http://download.videolan.org/pub/videolan/vlc/0.7.2/rpm/redhat/rh9/
  3.下載FC2的RPM包
   http://download.videolan.org/pub/videolan/vlc/0.7.2/rpm/fedora/fc2/
   二進(jìn)制包為: vlc-binary.tar.gz
  4.將RH9的升級包和 vlc-binary.tar.gz放在同一個目錄.
   ~#tar -zxvf vlc-binary.tar.gz
   ~#tar -zxvf redhat9-updates.tar.gz
  5.安裝
   ~#rpm -Uv vlc/* --force --nodeps
  6.使用
   1) 在REDHAT->AUDIO AND VIDEO->VLAN MEDIA PLAYER 可以打開
   2)或者在BASH 中打開vlc,使用命令行選項直接啟動,參見videolan-how-to-en.
  7.未測試出的功能
   在局域網(wǎng)內(nèi)的同一網(wǎng)段內(nèi)的兩臺PC上不能用MULTICAST 進(jìn)行VIDEO
   傳輸.


一.rm格式的播放器:
  下載地址:http://www.real.com/linux/?src=020923home_cn_cn
  安裝方式:~#./realplayer.bin
   打開方式:
  命令行:~#realplay
   GUI:redhat->audio and video->other app->realplayer
  二.mp3 播放器:xmms-1.2.8.tar.gz
   安裝方式:./configure & make &make install
  三. 經(jīng)驗:從源碼編譯安裝Mplayer 1.0pre5
  來自:http://yangchengkai.blogchina.com/blog/refer.177855.html
  Mplayer/gmplayer是目前Linux下廣范使用的媒體播放器,一個字--強(qiáng)!但由于它一般以Tarball的格式

發(fā)布,安裝比較BT,許多朋友都在找rpm的版本,但來源不同的rpm版本往往無法自己定制許多特性,比如中文

支持等,而且容易造成rpm包的依賴問題,所以有不少朋友最終對 Mplayer又愛又恨...-_-!!
  其實自己編譯mplayer并不是什么太難的事,只是過程比較麻煩,但基本還是遵循tarball的安裝步驟,有

關(guān)這個的文章Sir里已經(jīng)有了不少,自己這篇就不打算往Sir里貼了,且留在這里和大家分享...:)
  首先是下載最新的mplayer的tarball,即1.0pre5:
  http://www4.mplayerhq.hu/homepage/design7/dload.html
  接下來是下載解碼器包,一般只要下載Essential Codes就足夠了,要放rmvb需要reallib的解碼器,我一

般用xine放rmvb:
  http://www4.mplayerhq.hu/homepage/design7/codecs.html
  還有mplayer的字體文件:
    當(dāng)然,還要下載Skin文件給gmplayer用:
  
http://ftp5.mplayerhq.hu/mplayer/Skin/
  建議用default blue或者neutron,當(dāng)然,你也可以下載其他的Skin.
  我們先把下載的所有文件cp到/opt/目錄下,然后開始具體安裝步驟.
  1.首先安裝解碼器:
  tar -jxvf essential-20040916.tar.bz2
  tar -jxvf rp9codecs-20040626.tar.bz2
  cp -rf rp9codecs-20040626/* essential-20040916/
  mv essential-20040916 /usr/lib/codes
  以上命令把解碼器包安裝到了/usr/lib/codes,其實就是把解壓后的目錄ren&mv了過去.
  2.編譯安裝mplayer:
  tar -jxvf MPlayer-1.0pre5.tar.bz2
  cd MPlayer-1.0pre5
  ./configure --enable-gui --with-codecsdir=/usr/lib/codecs --with-

win32libdir=/usr/lib/codecs --with-reallibdir=/usr/lib/codecs --language=zh_CN
  以上幾個參數(shù)解釋一下:
  --enable-gui:打開圖形界面支持,就是gmplayer
  --with-codecsdir=/usr/lib/codecs:指明解碼器的目錄
  --with-win32libdir=/usr/lib/codecs:指明windows的媒體文件解碼器目錄位置
  --with-reallibdir=/usr/lib/codecs:指明real媒體文件的解碼器目錄位置,要用gmplayer放rmvb必須

指定這條.
  --language=zh_CN:設(shè)定系統(tǒng)界面語言為中文
  在configure之前可以運(yùn)行./configure --help查看支持的特性設(shè)定,可以根據(jù)自己需求選擇,以上只是

最基本的啦.
  make
  make install
  3.安裝字體文件:
  tar -jxvf font-arial-iso-8859-1.tar.bz2
  mv font-arial-iso-8859-1/ /usr/local/share/mplayer/font/
  cd /usr/local/share/mplayer/font/
  如果你的系統(tǒng)用simsun美化過,則直接
  ln -s ***/simsun.ttf subfont.ttf
  注意,這里的***是指simsun的具體位置,為了保險起見,建議在~/.mplayer/里也做同樣的鏈接.
  要是系統(tǒng)沒有美化過,試試
  ln -s /usr/share/fonts/zh_CN/TrueType/gbsn001p.ttf subfont.ttf
  這樣中文字幕就搞定了.
  4.安裝Skin:
  超級簡單,把skin包解壓后mv到/usr/local/share/mplayer/Skin就可以了,注意一定要有一個skin叫做

default,不然gmplayer無法運(yùn)行.
  OK,目前為止所有工作結(jié)束,運(yùn)行g(shù)mplayer/mplayer看看,Enjoy it!:)
  PS:要是你用xine,在setup里可以把codes的目錄指定同mplayer一樣,這樣可以節(jié)省點空間^_^
  5.nvidia driver 驅(qū)動安裝:


 



TS,MPEG2,dvbc專家 2009-10-12 09:07 發(fā)表評論

文章來源:http://www.cnitblog.com/dvb-dvb/archive/2009/10/12/61768.html

TS,MPEG2,dvbc專家 2009-10-12 09:07 發(fā)表評論
]]>
綁定網(wǎng)卡ip的進(jìn)程_無法關(guān)閉http://www.shnenglu.com/dvb-dvb/archive/2009/09/27/99265.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Sun, 27 Sep 2009 06:34:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/09/27/99265.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99265.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/09/27/99265.html#Feedback0http://www.shnenglu.com/dvb-dvb/comments/commentRss/99265.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99265.html這個是一個用UDP socket 發(fā)生數(shù)據(jù)的軟件,結(jié)果網(wǎng)線松了,肯定ip地址就不存在了,結(jié)果程序就無法退出了,

結(jié)果在windows任務(wù)管理器里面,直接殺進(jìn)程都?xì)⒉凰溃?/span>

這個程序大致運(yùn)作如下: 因為一臺機(jī)器上有多個網(wǎng)卡, 比如一快網(wǎng)卡聯(lián)內(nèi)網(wǎng),另一快網(wǎng)卡聯(lián)外網(wǎng),所有,輸出數(shù)據(jù)的時候必需綁定某個網(wǎng)卡的ip,網(wǎng)線松了,ip沒有了,程序就死機(jī)了, 請大家?guī)臀遥?/span>

結(jié)果我用下列的例子,也沒有成功。

http://www.cnitblog.com/wufajiaru/archive/2009/09/24/61548.html


tskill和taskkill,其中我遇到一個進(jìn)程無法用tskill結(jié)束,最后用taskkill 帶/F參數(shù)強(qiáng)制結(jié)束成功。

TASKKILL /PID 1230 /PID 1241 /PID 1253 /T



TS,MPEG2,dvbc專家 2009-09-27 14:34 發(fā)表評論

文章來源:http://www.cnitblog.com/dvb-dvb/archive/2009/09/27/61597.html

TS,MPEG2,dvbc專家 2009-09-27 14:34 發(fā)表評論
]]>
vlc 播放視頻的過程分析 {7} pcr,ptshttp://www.shnenglu.com/dvb-dvb/archive/2009/09/23/99266.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Wed, 23 Sep 2009 00:48:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/09/23/99266.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99266.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/09/23/99266.html#Feedback0http://www.shnenglu.com/dvb-dvb/comments/commentRss/99266.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99266.html最近用vlc的0.9.9播放一段視頻,出現(xiàn)了下列警告:

decoder is leaking pictures, resetting the heap


/*****************************************************************************
 * RunThread: video output thread
 *****************************************************************************
 * Video output thread. This function does only returns when the thread is
 * terminated. It handles the pictures arriving in the video heap and the
 * display device events.
 *****************************************************************************/
static void RunThread( vout_thread_t *p_vout)

在這個函數(shù)里面,看到下列code, 很難理解了, 
!p_picture->b_force &&
                p_picture != p_last_picture &&
                display_date < current_date + p_vout->render_time &&
                b_drop_late )


這個p_vout->render_time ,到底是怎么算出來的。

到底,pcr,pts,出現(xiàn)了什么錯誤,導(dǎo)致不能播放,還沒有搞清楚。

以下內(nèi)容為轉(zhuǎn)載:
http://www.wangchao.net.cn/bbsdetail_61529.html

vout_DatePicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Gives the picture a presentation date. You can start working on a picture before knowing precisely at what time it will be displayed. For instance to date an I or P picture, you must wait until you have decoded all previous B pictures (which are indeed placed after - decoding order != presentation order).
  vout_DisplayPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Tells the video output that a picture has been completely decoded and is ready to be rendered. It can be called before or after vout_DatePicture.
   vout_DestroyPicture ( vout_thread_t *p_vout, picture_t *p_pic ) : Marks the picture as empty (useful in case of a stream parsing error).

不過上面這個內(nèi)容說的很簡潔了,不詳細(xì)。




TS,MPEG2,dvbc專家 2009-09-23 08:48 發(fā)表評論

文章來源:http://www.cnitblog.com/dvb-dvb/archive/2009/09/23/61531.html

TS,MPEG2,dvbc專家 2009-09-23 08:48 發(fā)表評論
]]>
得到位置點的坐標(biāo)和顏色 RGB值,http://www.shnenglu.com/dvb-dvb/archive/2009/08/24/99267.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Mon, 24 Aug 2009 01:09:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/08/24/99267.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99267.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/08/24/99267.html#Feedback0http://www.shnenglu.com/dvb-dvb/comments/commentRss/99267.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99267.html有時候想得到屏幕上某個點的位置,和某個點的 RGB的值,就給大家推薦這個工具
估計增加下列功能:
1,顯示所點擊的位置。
2,全屏顯示,去掉邊和菜單欄等。

/Files/dvb-dvb/GetColor.rar



TS,MPEG2,dvbc專家 2009-08-24 09:09 發(fā)表評論

文章來源:http://www.cnitblog.com/dvb-dvb/archive/2009/08/24/rgb.html

TS,MPEG2,dvbc專家 2009-08-24 09:09 發(fā)表評論
]]>
怎么得到h264的frame ratehttp://www.shnenglu.com/dvb-dvb/archive/2009/08/12/99268.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Wed, 12 Aug 2009 02:33:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/08/12/99268.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99268.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/08/12/99268.html#Feedback0http://www.shnenglu.com/dvb-dvb/comments/commentRss/99268.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99268.html
nFrame_rate = sps->time_scale / sps->num_units_in_tick ;
但是這個值,我得到的是 50, 其它的分析工具得到的都是25,
有人說,看time_scale 是frame,還是field,可是標(biāo)準(zhǔn)上沒有這么說,我看的是中文版的,



今天又發(fā)現(xiàn)一個奇怪的事情:
如果h264的 profile是 main,那么在vui parameters里面,
num_units_in_tick:1200 time_scale:60000, nFrame_rate = sps->time_scale / sps->num_units_in_tick ; 50 fps --- ok.
但是,如果profile 是high,那么值是這樣:
num_units_in_tick:48 time_scale:16777216 ,F(xiàn)rame_rate:349525 fps
奇怪的,我的code到底那里錯誤了,
第二,若說我的code錯誤了,那sps里面包含,vui parameters,以前的任何值都沒有錯誤呀,偏偏這兩個值錯誤了,

若果換一個high的h264文件,那值是這樣的,
num_units_in_tick:384 time_scale:16777217 fixed_frame_rate_flag:1 Frame_rate:43690 ,
用其它的分析工具看,num_units_in_tick = 1, time_scale = 50,50 fps,
我到底怎么排除這個錯誤呢。



TS,MPEG2,dvbc專家 2009-08-12 10:33 發(fā)表評論

文章來源:http://www.cnitblog.com/dvb-dvb/archive/2009/08/12/60739.html

TS,MPEG2,dvbc專家 2009-08-12 10:33 發(fā)表評論
]]>
h264 : 關(guān)于level_idc和Profile_IDC的解釋http://www.shnenglu.com/dvb-dvb/archive/2009/08/10/99269.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Mon, 10 Aug 2009 00:48:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/08/10/99269.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99269.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/08/10/99269.html#Feedback0http://www.shnenglu.com/dvb-dvb/comments/commentRss/99269.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99269.html這個帖子是轉(zhuǎn)貼:因為下列內(nèi)容,沒有再h264的標(biāo)準(zhǔn)上出現(xiàn),所以要轉(zhuǎn), 我翻變了下列標(biāo)準(zhǔn),都沒有找到,希望網(wǎng)友告知我,這些內(nèi)容到底在那個標(biāo)準(zhǔn)文檔里面。
我已經(jīng)翻閱的:
H.264官方中文版.pdf   
H.264和MPEG-4視頻壓縮.pdf 
H.264編解碼手冊.rar
T-REC-H.264-200503-S!!PDF-E.pdf


http://bbs.chinavideo.org/viewthread.php?tid=1986

關(guān)于level_idc和Profile_IDC的解釋

我在帖子上經(jīng)??吹絾栴},現(xiàn)發(fā)表在這,大家可以參考一下:Class: Numeric (Integer)
Description: Set bitstream Profile IDC. Default is 88.

Note: Some profiles cannot support certain features. See MPEG-4 AVC for supported features for each profile. Reference software may perform tests for certain features for profile conformance, but it is possible that certain validations are missing. See Annex A of H.264/AVC.

Options:
66
Baseline
77
Main
88
Extended
100
High (FRExt)
110
High 10 (FRExt)
122
High 4:2:2 (FRExt)
144
High 4:4:4 (FRExt)

Class: Numeric (Integer)
Description: Set bitstream Level IDC. Default is 21.

Note: Similar with the ProfileIDC, LevelIDC sets certain restrictions during the encoding process, such as resolution supported, maximum number of references, frame rate etc. See Annex A of H.264/AVC.

Options:
10
1       (supports only QCIF format and below with 380160 samples/sec)
11
1.1    (CIF and below. 768000 samples/sec)
12
1.2    (CIF and below. 1536000 samples/sec)
13
1.3    (CIF and below. 3041280 samples/sec)
20
2       (CIF and below. 3041280 samples/sec)
21
2.1    (Supports HHR formats. Enables Interlace support. 5068800 samples/sec)
22
2.2    (Supports SD/4CIF formats. Enables Interlace support. 5184000 samples/sec)
30
3       (Supports SD/4CIF formats. Enables Interlace support. 10368000 samples/sec)
31
3.1    (Supports 720p HD format. Enables Interlace support. 27648000 samples/sec)
32
3.2    (Supports SXGA format. Enables Interlace support. 55296000 samples/sec)
40
4       (Supports 2Kx1K format. Enables Interlace support. 62914560 samples/sec)
41
4.1    (Supports 2Kx1K format. Enables Interlace support. 62914560 samples/sec)
42
4.2    (Supports 2Kx1K format. Frame coding only. 125829120 samples/sec)
50
5       (Supports 3672x1536 format. Frame coding only. 150994944 samples/sec)
51
5.1    (Supports 4096x2304 format. Frame coding only. 251658240 samples/sec)

附件有更多的詳細(xì)介紹>>>>


 



TS,MPEG2,dvbc專家 2009-08-10 08:48 發(fā)表評論

文章來源:http://www.cnitblog.com/dvb-dvb/archive/2009/08/10/h264level_idc.html

TS,MPEG2,dvbc專家 2009-08-10 08:48 發(fā)表評論
]]>
哥倫布編碼的解析過程,golomb 編碼,golomb 變長編碼算法http://www.shnenglu.com/dvb-dvb/archive/2009/07/28/99270.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Tue, 28 Jul 2009 09:32:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/07/28/99270.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99270.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/07/28/99270.html#Feedback0http://www.shnenglu.com/dvb-dvb/comments/commentRss/99270.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99270.htmlgolomb 變長編碼算法

哥倫布編碼的解析過程

golomb 編碼主要是針對整數(shù)進(jìn)行編碼,減少整數(shù)使用的空間位數(shù)
golomb編碼時,有一個可以變化的參數(shù)m

本人的算法如下,很簡便的!
 

int My_get_se_golomb_31()

{

     int b = 0;

     int nValue = 0;

    

     b = My_get_ue_golomb_31();

     nValue = b / 2;

     if (b > 1 && b%2 ==0)

     {

         nValue = nValue * (-1);

     }

 

     return nValue;

}

 

int  My_get_ue_golomb_31()

{

     int b = 0;

     int i = 0;

 

     do

     {

         i ++;

         if (i <32)

              b = Bitstream_get(i,FALSE);

         else

         {

              outlog("SPS: nreserved should is zero.");

              break;

         }       

     } while(!b);

    

     Bitstream_get(i);

 

     b = (1 <<(i - 1)) -1 + Bitstream_get(i-1);    

     return b;

}





 

 

http://ludajun.blog.sohu.com/

 

 例如:取m = 1, 對整數(shù)x = 4進(jìn)行編碼, 算法如下
b = 2
的m次方
q = int((x-1)/ b)
r = x - qb - 1

由此計算出 q = 1, r = 1
二進(jìn)制編碼為q  1,  個0, 然后是r的二進(jìn)制編碼
所以編碼為:101

解碼思路:
先算出所給整數(shù)的位數(shù)n
然后從高位--〉低位找到第一個0所在的位置i,這樣就能 q = n - i, r = x的第0位到第i-1位所表示的數(shù)字(由低位--〉高位)
最終解碼結(jié)果為qb + 1 + r

python
實現(xiàn)的 算法:
from math import log

m = 1

def compress(x):
    q = (x - 1) >> m
    r = x - (q << m) - 1
    result = ((((1 << q) - 1) << 1) << m) | r
    return result

def uncompress(x):
    if x == 0:
        return 1
    #計算x的位數(shù)
    n = int(log(x, 2))
    if n == 0:
        return x + 1
    for i in range(n, -1, -1):
        if (x & (1 << i)) == 0:
            q = n - i
            r = x & (1 << i - 1)
            return r + 1 + (q << m)



TS,MPEG2,dvbc專家 2009-07-28 17:32 發(fā)表評論

文章來源:http://www.cnitblog.com/dvb-dvb/archive/2009/07/28/60423.html

TS,MPEG2,dvbc專家 2009-07-28 17:32 發(fā)表評論
]]>
Mpeg2解壓縮的詳細(xì)過程 介紹。http://www.shnenglu.com/dvb-dvb/archive/2009/07/14/99271.htmlTS,MPEG2,dvbc專家TS,MPEG2,dvbc專家Tue, 14 Jul 2009 06:49:00 GMThttp://www.shnenglu.com/dvb-dvb/archive/2009/07/14/99271.htmlhttp://www.shnenglu.com/dvb-dvb/comments/99271.htmlhttp://www.shnenglu.com/dvb-dvb/archive/2009/07/14/99271.html#Feedback0http://www.shnenglu.com/dvb-dvb/comments/commentRss/99271.htmlhttp://www.shnenglu.com/dvb-dvb/services/trackbacks/99271.htmlMPEG-1流比特層次結(jié)構(gòu)分析總結(jié)
1.簡要介紹Mpeg
Mpeg是Motion Picture Expert Group的縮寫?;顒訄D像專家組是在1988年由ISO和IEC聯(lián)合成立的專家組,負(fù)責(zé)開發(fā)電視圖像數(shù)據(jù)和聲音數(shù)據(jù)的編碼,解碼和它們的同步等標(biāo)準(zhǔn)。到目前為止已經(jīng)開發(fā)和正在開發(fā)的MPEG標(biāo)準(zhǔn)有很多,主要包括Mpeg-1,Mpeg-2,Mpeg-4,和Mpeg-7.

其中的Mpeg-1處理的是標(biāo)準(zhǔn)圖像交換格式(standard interchange format,SIF)或者稱為源輸入格式(Source Input Format,SIF)的電視,將模擬的圖像信息,通過編碼成為數(shù)字圖像信息,原始輸入可以是NTSC制式352pixels * 240lines * 30frames/second, PAL制352pixels * 288lines*25frames/second,壓縮后的數(shù)字圖像信息的速率為1.5Mb/s.這個標(biāo)注是1992年正是的發(fā)布的,是針對當(dāng)時具有這種數(shù)據(jù)傳輸速率的CD-ROM和網(wǎng)絡(luò)而開發(fā)的,用于在CD-ROM上存儲數(shù)字影視和在網(wǎng)絡(luò)上傳輸數(shù)字影視。
MPEG-1的標(biāo)準(zhǔn)號為ISO/IEC 11172,標(biāo)準(zhǔn)名:“信息技術(shù)——用于數(shù)據(jù)速率大約高達(dá)1.5Mb/s的數(shù)字存儲替的電視圖像和伴音編碼”
本文主要是對Mpeg-1Video數(shù)據(jù)流的結(jié)構(gòu)進(jìn)行分析,并將怎樣得到Mpeg-1流中的數(shù)據(jù)部分進(jìn)行的闡述。ISO/IEC 11172-2

2.Mpeg-1數(shù)據(jù)流分析
編碼后的視頻序列是一個如同計算機(jī)網(wǎng)絡(luò)的OSI模型下的數(shù)據(jù)序列一樣,數(shù)據(jù)被分成很多層的概念。

視頻序列層-畫面組層-畫面層-片層-宏塊層-塊層
層次的關(guān)系很明顯,越往后越是底層,越接近實際的數(shù)據(jù)。

2.1視頻序列層(VideoStream)
視頻序列是以一個序列標(biāo)題開始,之后可以跟著一個或者多個畫面組。最后以Sequence_end_code結(jié)束。緊挨著每一個畫面組之前可以有一個序列標(biāo)題。也就是說每個畫面組,都可以有一個自己的序列標(biāo)題。
序列標(biāo)題是一個以sequence_header_code開始,后跟著一系列數(shù)據(jù)元素的結(jié)構(gòu)。是視頻流中用來解碼的重要的參數(shù)之一。其中定義了量化矩陣(load_intra_quantizer_matrix和 load_non_intra_quantizer_matrix以及可選的intra_quantizer_matrix和non_intra_quantizer_ matrix)以及其它的一些重要的數(shù)據(jù)元素,其中量化矩陣是可以在視頻流中重復(fù)的量化矩陣中變化的,并且在每次變化后,量化矩陣重新定義。其它的元素必須與第一個序列標(biāo)題中的值相同。
整個視頻序列的結(jié)構(gòu)可以用下面的代碼表示:
Video_Stream{
unsigned int h_size;                         /* Horiz. size in pixels.     */
  unsigned int v_size;                         /* Vert. size in pixels.      */
  unsigned int mb_height;                      /* Vert. size in mblocks.     */
  unsigned int mb_width;                       /* Horiz. size in mblocks.    */
  unsigned char aspect_ratio;                  /* Code for aspect ratio.     */
  unsigned char picture_rate;                  /* Code for picture rate.     */
  unsigned int bit_rate;                       /* Bit rate.                  */
  unsigned int vbv_buffer_size;                /* Minimum buffer size.       */
  BOOLEAN const_param_flag;                    /* Contrained parameter flag. */
  unsigned char intra_quant_matrix[8][8];      /* Quantization matrix for
  intracoded frames.         */
  unsigned char non_intra_quant_matrix[8][8];  /* Quanitization matrix for
  non intracoded frames.     */
  char *ext_data;                              /* Extension data.            */
  char *user_data;                             /* User data.                 */
  GoP group;                                   /* Current group of pict.     */
  Pict picture;                                /* Current picture.           */
  Slice slice;                                 /* Current slice.             */
  Macroblock mblock;                           /* Current macroblock.        */
  Block block;                                 /* Current block.             */
  int state;                                   /* State of decoding.         */
  int bit_offset;                              /* Bit offset in stream.      */
  unsigned int *buffer;                        /* Pointer to next byte in
  buffer.                    */
  int buf_length;                              /* Length of remaining buffer.*/
  unsigned int *buf_start;                     /* Pointer to buffer start.   */
  int max_buf_length;                          /* Max lenght of buffer.      */
  PictImage *past;                             /* Past predictive frame.     */
  PictImage *future;                           /* Future predictive frame.   */
  PictImage *current;                          /* Current frame.             */
  PictImage *ring[RING_BUF_SIZE];              /* Ring buffer of frames.     */
} Video_Stream;  
具體的序列標(biāo)題的結(jié)構(gòu)的部分是這樣的:
序列
sequence_header{
SEQ_START_CODE 0x000001b3;  /* 常量 ,作用使用來定位視頻序列的序列頭 */  
unsigned int h_size;                         /* Horiz. size in pixels.     */
  unsigned int v_size;                         /* Vert. size in pixels.      */
  unsigned int mb_height;                      /* Vert. size in mblocks.     */
  unsigned int mb_width;                       /* Horiz. size in mblocks.    */
  unsigned char aspect_ratio;                  /* Code for aspect ratio.     */
  unsigned char picture_rate;                  /* Code for picture rate.     */
  unsigned int bit_rate;                       /* Bit rate.                  */
  unsigned int vbv_buffer_size;                /* Minimum buffer size.       */
  BOOLEAN const_param_flag;                    /* Contrained parameter flag. */
  unsigned char load_intra_quantizer_matrix;
unsigned char intra_quant_matrix[8][8];      /* Quantization matrix for intracoded frames.         這個結(jié)構(gòu)是可選的,要看load_intra_quantizer_matrix的值,為真則有這個部分,否則沒有,因為
intra_quant_matrix是量化表的值,而Sequence_header結(jié)構(gòu)在視頻序列中是可重復(fù)的,即在每個畫面組之前都有可能再次給出一個sequence_header,并且可以在新的sequence_header 中重新定義量化表*/
unsigned char load_non_intra_quantizer_matrix;
  unsigned char non_intra_quant_matrix[8][8];  /* Quanitization matrix for non intracoded frames. 也是可選。愿意于intra_quant_matrix可選的原因相同。當(dāng)load_non_intra_quant_matrix的值為真的時候需要定義。    */
  char *ext_data;                              /* Extension data.            */
  char *user_data;                             /* User data.                 */
 
}

由上面的分析,可以看出來的是:
video_sequence(){
next_start_code()
do{
sequence_header();
do{
group_of_pictures() ;畫面組
}while (nextbits()==GROUP_START_CODE)
}while(nextbits()==SEQUENCE_HEADER_CODE)
SEQUENCE_END_CODE
};

正是由于視頻序列中存在很多開始碼,或者稱之為定位碼、同步碼。用來告訴解碼器目前數(shù)據(jù)的區(qū)域信息,所以解碼器才可以正確的處理各個數(shù)據(jù)區(qū)的數(shù)據(jù),下面就是視頻序列中的開始碼的羅列:
#define SEQ_END_CODE 0x000001b7
#define SEQ_START_CODE 0x000001b3
#define GOP_START_CODE 0x000001b8
#define PICTURE_START_CODE 0x00000100
#define SLICE_MIN_START_CODE 0x00000101
#define SLICE_MAX_START_CODE 0x000001af
#define EXT_START_CODE 0x000001b5
#define USER_START_CODE 0x000001b2
這些開始碼都是一些特殊的32bits的比特序列,在視頻碼流中不會出現(xiàn)的。他們的起著標(biāo)志的作用,具體可以從名稱上面看出來。
其中EXT_START_CODE和USER_START_CODE在每個層里面都會出現(xiàn),用來標(biāo)志擴(kuò)展數(shù)據(jù)區(qū)和用戶數(shù)據(jù)區(qū),用來添加任意的數(shù)據(jù),直到下一個開始碼結(jié)束。
2.2畫面組層(GOP)
在軟件xmplay1.1中的定義
typedef struct GoP {
  BOOLEAN drop_flag;                     /* Flag indicating dropped frame. */
  unsigned int tc_hours;                 /* Hour component of time code.   */
  unsigned int tc_minutes;               /* Minute component of time code. */
  unsigned int tc_seconds;               /* Second component of time code. */
  unsigned int tc_pictures;              /* Picture counter of time code.  */
  BOOLEAN closed_gop;                    /* Indicates no pred. vectors to
    previous group of pictures.    */
  BOOLEAN broken_link;                   /* B frame unable to be decoded.  */
  char *ext_data;                        /* Extension data.                */
  char *user_data;                       /* User data.                     */
} GoP;

當(dāng)然每個畫面組層都是開始與標(biāo)志碼:GOP_START_CODE
該層次語法上的定義是
group_of_pictures{
GOP_START_CODE
Time_code; tc_hours,tc_minutes,tc_seconds,tc_pictures
Closed_gop;
Broken_link;
Next_start_code;
If(nextbits==extension_start_code){
Extension_start_code;
While(nextbits()==”0000 0000 0000 0000 0000 0001”){
Group_extension_data;
}
next_start_code()
}
if(nextbits==user_data_start_code){
user_data_start_code
while(nextbits()!=’0000 0000 0000 0000 0000 0001’){
user_data;
}
next_start_code()
}
do{
picture()
}while(nextbits==picture_start_code)
}

Mpeg流最終顯示出來是一系列的畫面,而畫面組是mpeg流中可以獨立編碼的最小的單位,每個畫面組由一個標(biāo)題和一系列畫面組成。GOP標(biāo)題包含了時間和編輯的信息。
Mpeg畫面組中必須至少有一個I幀畫面,可以有數(shù)目可變的B幀和P幀畫面,也可以沒有P和B幀。畫面組的第一幅編碼畫面是I畫面,該畫面之后跟隨著任意數(shù)目的I或P畫面,每對I、P畫面之間可以插入任意數(shù)目的B畫面。
畫面組是畫面的集合,每幅畫面按照顯示的順序相鄰。
畫面組中的畫面有兩種排列順序:
1.按比特流順序 必須以I幀開頭,后面可按任何的次序,跟上任意數(shù)目的I,P或B畫面。
2.按顯示順序必須以I或B畫面打頭,且以I或P畫面結(jié)束,最小的畫面組由一個I畫面組成。

從編碼角度,可以精確的陳述的是,畫面組以一個畫面組標(biāo)題開始,以最先出現(xiàn)的下一個畫面組標(biāo)題或者下一個序列標(biāo)題或者序列結(jié)束碼結(jié)束。

Mepg流中的標(biāo)志碼也就是開始碼,對正確的分割和識別碼流的成分起到了至關(guān)重要的作用。

2.3畫面層(Pictures)
畫面組層中的一幅幅畫面就是畫面層的數(shù)據(jù)了。包含了一幅畫面的所有編碼信息。一幅畫面同樣始于畫面的標(biāo)題。標(biāo)題以畫面開始碼(PICTURE_START_CODE 0x00000100)打頭。
解析畫面單元的語法結(jié)構(gòu):
picture(){
picture_start_code
temprol_reference     /*時序編號,通常一組畫面的編號都在1024以內(nèi),如果超過那么在1025幅畫面出復(fù)位為0,重新計數(shù)。*/                                   
picture_coding_type                        
vbv_delay/*對于固定比特率的視頻流,vbv_delay用與解碼過程開始和隨機(jī)存取之后,以保證在第一幅畫面被顯示之前,解碼器已經(jīng)讀到正確數(shù)目的比特數(shù)。*/
if((picture_coding_type==2) || picture_coding_type==3){
full_pel_foward_vector /*全象素前向矢量,給定前向矢量的精度,在P和B畫面的標(biāo)題中出現(xiàn)*/
forward_f_code
}
if(picture_coding_type==3){
full_pel_backward_vector
back_f_code
}
while(nextbits()==’1’){
extra_bit_picture
extra_information_picture
}
extra_bit_picture
next_start_code

if(nextbits()==extension_start_code){
extension_start_code
while(nextbits()!=’0000 0000 0000 0000 0000 0001’){
picture_extension_data
}
next_start_code()
}
if(nextbits()==user_data_start_code){
user_data_start_code
while(nextbits()!=’0000 0000 0000 0000 0000 0001’){
user_data
}
next_start_code()
}
do {
slice()
}while(nextbits()==slice_start_code)
}


整個畫面單元結(jié)構(gòu)是這樣的:
typedef struct pict {
  unsigned int temp_ref;                 /* Temporal reference.             */
  unsigned int code_type;                /* Frame type: P, B, I             */
  unsigned int vbv_delay;                /* Buffer delay.                   */
  BOOLEAN full_pel_forw_vector;          /* Forw. vectors specified in full
    pixel values flag.              */
  unsigned int forw_r_size;              /* Used for vector decoding.       */
  unsigned int forw_f;                   /* Used for vector decoding.       */
  BOOLEAN full_pel_back_vector;          /* Back vectors specified in full
    pixel values flag.              */
  unsigned int back_r_size;              /* Used in decoding.               */
  unsigned int back_f;                   /* Used in decoding.               */
  char *extra_info;                      /* Extra bit picture info.         */
  char *ext_data;                        /* Extension data.                 */
  char *user_data;                       /* User data.                      */
} Pict;

可以看出整個pictures層的bit流結(jié)構(gòu)中由標(biāo)題和pictures數(shù)據(jù)組成。
標(biāo)題中提供了必要的畫面信息數(shù)據(jù)和運(yùn)動矢量的信息。

2.4片層(Slice)
片是任意數(shù)目宏塊組成的序列,其中宏塊必須從畫面的左上位置開始,按照光柵掃描的方向從左到右,從上到下排列。片中至少包涵一個宏塊,片與片之間沒有重疊,也沒有間隙。

片層的解析語法:
首先給出識別出Slice層數(shù)據(jù)的頭標(biāo)slice_start_code

#define SLICE_MIN_START_CODE 0x00000101
#define SLICE_MAX_START_CODE 0x000001af

slice{
slice_start_code /*從中可以計算出slice_vertical_position  片中第一個宏塊,以宏塊為單位的垂直位置*/
quantizer_scale       /*設(shè)置量化步長尺寸。1-31*/
while(nextbits()==’1’){
extra_bit_slice                       ‘1’
extra_information_slice
}
extra_bit_scale                            ‘0’
do{
macroblock()
}while(nextbits()!=’0000 0000 0000 0000 0000 0000’)
next_start_code()
}

typedef struct slice {
  unsigned int vert_pos;                 /* Vertical position of slice. */
  unsigned int quant_scale;              /* Quantization scale.         */
  char *extra_info;                      /* Extra bit slice info.       */
} Slice;


[此貼子已經(jīng)被作者于2008-7-19 17:51:53編輯過]
--  作者:cdmalcl
--  發(fā)布時間:2008-7-19 17:49:34
-- 
每個片由一個開始碼開始,開始后DC系數(shù)和矢量解碼的預(yù)測值都被復(fù)位,片開始部位的位置的水平位置由片中第一個宏塊的宏塊地址決定。這些措施使得在一幅畫面內(nèi)任何一片都可以單獨編碼而不需要前一片的信息。當(dāng)解碼是出現(xiàn)錯誤,即可以從后繼的片重新開始。
所以,當(dāng)數(shù)據(jù)在無錯的環(huán)境中,可以一幅畫面就作為一片,但是如果是有錯的環(huán)境,則每行宏塊作為一片會更加合理。

表2  256×192畫面內(nèi)的片劃分(每行宏塊作為一個片,每個片的高度都是16pixels)
1開始                                                                                1結(jié)束
2開始                                                                                2結(jié)束
3開始                                                                                3結(jié)束
4開始                                                                                4結(jié)束
5開始                                                                                5結(jié)束
6開始                                                                                6結(jié)束
7開始                                                                                7結(jié)束
8開始                                                                                8結(jié)束
9開始                                                                                9結(jié)束
10開始                                                                              10結(jié)束
11開始                                                                              11結(jié)束
12開始                                                                              12結(jié)束
13開始                                                                              13結(jié)束
實際情況中片不宜太多,因為片標(biāo)題,以及新片所需要盡心重新編碼花費的開銷很大。
片始于片標(biāo)題,片標(biāo)題又始于片開始碼,片開始碼是可以在一個范圍中取得得,這個范圍就是
#define SLICE_MIN_START_CODE 0x00000101
#define SLICE_MAX_START_CODE 0x000001af
片開始碼得最后8為可以給出片得垂直位置,即以宏塊為單位從畫面頂部位置為1開始算起,片中第一個宏塊的垂直位置。宏塊有一個行號可以作為它得定位數(shù)據(jù),這個行號的計算方法是:片垂直位置-1
宏塊的垂直位置最大為175。片中第一個宏塊的水平位置,可以由該宏塊的地址偏移計算出來,所以不需要依賴畫面內(nèi)的任何其他的宏塊的信息。
--  作者:cdmalcl
--  發(fā)布時間:2008-7-19 17:49:59
-- 
2.5宏塊層(Macroblock)
宏塊是包含16pixels*16lines的亮度分量部分,以及在空間位置上對應(yīng)的兩個8pixels*8lines的色度分量部分,一個宏塊有4個亮度塊和2個色度塊。宏塊可以指源圖像或者重構(gòu)圖像的數(shù)據(jù),或者是量化后的DCT系數(shù)。
宏塊中塊的順序如下:
表1  宏塊中塊的排列

01
23


4

5

Y分量Cb分量Cr分量

宏塊的數(shù)據(jù)分析語法描述:

macroblock(){
while(nextbits()==’0000 0001 111’){
macroblock_stuffing /*宏塊填料,為了防止下溢出,由編碼器填入的數(shù)據(jù),有它固定的11位bit格式就是’0000 0001 111’,當(dāng)然解決下溢出的方法還有很多,編碼器可以在標(biāo)題之前就加入填料位,或者可以減小quant_scale獲得更多的編碼系數(shù)等等*/
}
while(nextbits()==’0000 0001 000’){
macroblock_escape  /*固定模式的bit串,當(dāng)macroblock_address與previous_macroblock_address的差大于33時將用到該碼。使得后繼的macroblock_increment所表示的值加33。
}
macroblock_address_increment   /*用于表示macroblock_address和previous_macorblock_ address之間的差值。 最大值為33,當(dāng)前兩者差大于33時用macroblock_escape補(bǔ)充。 Macroblock_address表示的是宏塊在畫面中的絕對位置,最左上角的宏塊的macroblock_address為0,previous_macroblock_address指示片中最后一個非跳空宏塊的位置。
macroblock_type 
if(macroblock_motion_forward){
motion_horizontal_forward_code
if((forward_f!=1) && (motion_horizontal_forward_code!=0))
motion_horizontal_forward_r
motion_vertical_forward_code
if((forward_f!=1) && (motion_vertical_forward_code!=0))
motion_vertical_forward_r
}
if(macroblock_motion_backward){
motion_horizontal_backward_code
if((backward_f!=1) && (motion_horizontal_backward_code!=0))
motion_horizontal_backward_r
motion_vertical_backward_code
if((backward_f!=1) && (motion_vertical_backward_code!=0))
motion_vertical_backward_r
}
if(macroblock_pattern)
coded_block_pattern /*可以得到宏塊宏塊的pattern_code[i](i=0:5),從而確定該宏塊接收到的塊的種類有哪些。*/
for(i=0;i<6;i++)
block(i)
if(picture_coding_type==4)
end_of_marcoblock
}
片被分為16pixels*16lines的象素宏塊。每個宏塊都有它的標(biāo)題。包含了宏塊的地址、類型、量化器標(biāo)尺信息等等。標(biāo)題之后是該宏塊的6個塊的數(shù)據(jù)。

在Xmplay代碼中給出的macrblock的定義:
typedef struct macroblock {
  int mb_address;                        /* Macroblock address.              */
  int past_mb_addr;                      /* Previous mblock address.         */
  int motion_h_forw_code;                /* Forw. horiz. motion vector code. */
  unsigned int motion_h_forw_r;          /* Used in decoding vectors.        */
  int motion_v_forw_code;                /* Forw. vert. motion vector code.  */
  unsigned int motion_v_forw_r;          /* Used in decdoinge vectors.       */
  int motion_h_back_code;                /* Back horiz. motion vector code.  */
  unsigned int motion_h_back_r;          /* Used in decoding vectors.        */
  int motion_v_back_code;                /* Back vert. motion vector code.   */
  unsigned int motion_v_back_r;          /* Used in decoding vectors.        */
  unsigned int cbp;                      /* Coded block pattern.             */
  BOOLEAN mb_intra;                      /* Intracoded mblock flag.          */
  BOOLEAN bpict_past_forw;               /* Past B frame forw. vector flag.  */
  BOOLEAN bpict_past_back;               /* Past B frame back vector flag.   */
  int past_intra_addr;                   /* Addr of last intracoded mblock.  */
  int recon_right_for_prev;              /* Past right forw. vector.         */
  int recon_down_for_prev;               /* Past down forw. vector.          */
  int recon_right_back_prev;             /* Past right back vector.          */
  int recon_down_back_prev;              /* Past down back vector.           */
} Macroblock;
2.6塊層(Block)
塊是一個正交的8pixels*8lines的亮度或者色度分量,塊可以指源畫面數(shù)據(jù)或者相應(yīng)的編碼數(shù)據(jù)元素。
8*8單位象素的源畫面數(shù)據(jù)經(jīng)過DCT變換后的成為了相應(yīng)的DCT系數(shù)塊。
塊的具體結(jié)構(gòu)為(xmplay源碼中的結(jié)構(gòu)定義):
typedef struct block {
  short int dct_recon[8][8];             /* Reconstructed dct coeff matrix. */
  short int dct_dc_y_past;               /* Past lum. dc dct coefficient.   */
  short int dct_dc_cr_past;              /* Past cr dc dct coefficient.     */
  short int dct_dc_cb_past;              /* Past cb dc dct coefficient.     */
} Block;

解析塊的語法結(jié)構(gòu)是:
block(i){
if(pattern_code[i]){
if(macroblock_intra){
if(i<4){
dct_dc_size_luminance
if(dc_size_luminance!=0)
dct_dc_differential
}
else{
dct_dc_size_chrominance
if(dc_size_chrominance!=0)
dct_dc_differential
}
}
else{
dct_coeff_first
}
if(picture_coding_type!=4){
while(nextbits()!=’10’)
dct_coeff_next
end_of_block
}
}
http://www.ds0101.net/bbs/TopicOther.asp?t=5&BoardID=19&id=889 , 引用的原址。



TS,MPEG2,dvbc專家 2009-07-14 14:49 發(fā)表評論

文章來源:http://www.cnitblog.com/dvb-dvb/archive/2009/07/14/Mpeg2decode.html

TS,MPEG2,dvbc專家 2009-07-14 14:49 發(fā)表評論
]]>
伊人久久大香线蕉av不变影院| 国内精品久久国产大陆| 人妻无码久久一区二区三区免费| 亚洲精品高清久久| 伊人久久亚洲综合影院| 国产精品熟女福利久久AV| 一本久久a久久精品综合夜夜| 精产国品久久一二三产区区别| 久久人人爽人人爽人人片AV不| 一级做a爱片久久毛片| 欧美午夜A∨大片久久| 国产精品成人99久久久久91gav| 久久久久AV综合网成人| 中文国产成人精品久久不卡| 久久亚洲精品无码AV红樱桃| 国产精品熟女福利久久AV| 国产精品中文久久久久久久| 亚洲七七久久精品中文国产 | 久久97精品久久久久久久不卡| 亚洲精品NV久久久久久久久久| 国产综合成人久久大片91| 韩国免费A级毛片久久| 国产精品对白刺激久久久| 久久成人永久免费播放| 亚洲欧美成人综合久久久 | 伊人久久免费视频| 亚洲精品美女久久久久99小说| 久久综合狠狠综合久久97色| 久久嫩草影院免费看夜色| 欧美亚洲色综久久精品国产| 中文字幕成人精品久久不卡| 伊人久久精品无码二区麻豆| 久久精品免费大片国产大片| 日韩十八禁一区二区久久| 国产精品美女久久久久久2018| 久久久久人妻一区二区三区vr| 色综合久久久久久久久五月| 久久综合久久伊人| 日本福利片国产午夜久久| 精品久久久久久无码中文字幕| 久久精品不卡|