ESパッケージストリームPS

https://blog.csdn.net/qq_24977505/article/details/95193041

 

最近の国家標準カスケード、シンプルPS・フロー・パッケージといじくり回すには、共有メモを行います。

書式#include <stdint.h>
の#include <文字列>
の#include <memory.h>

#define H264_IDとして0x1B
の#define H265_ID 0x24を
の#define MPEG_IDの0x10
の#define SVACV_IDは0x80

#define G711_ID 0x90を
の#define SVACA_ID 0x9b

uint8_t PS_HEAD CONST [] = {
    / *ヘッドPS * /
    $ 00、$ 00、0x01の、0xBA、
    0x00で、0x00に、0x00で、0x00に、0x00で、0x00に、/ *タイムスタンプ* /
    が0x01、0x47、0xb3、 
    0xF8
}。

uint8_t SYS_MAP_HEADのCONST [] = {
    / * PS_SYSヘッダ* /
    $ 00、$ 00、0x01の、0xbb、 
    0x00に、0x0Cの、/ * SYSヘッダ長、自身を除く、6 * 3 +ストリーム数* /
    0x80の、0xA3の、0xD9、 / *レート* /
    0x04の、0xE1の、/ *オーディオストリームの数は、ビデオストリームの識別番号1を加えた3 * /
    0xFFで、/ ** /
    0xB9、0xE0となっ、0x00に、0xB8、0xC0の、0x40の、/ *フロー情報、B9ビデオ、B8オーディオ* /
    / *ヘッダPS_MAP * /
    $ 00、$ 00、0x01の、の0xBC、 
    0x00に、0x12を、/ *長PSM * /
    0x04の、0xFFを、/ ** /
    $ 00、$ 00、$ 00、0x08に、/ 2ウェイ固定* * /流れ
    として0x1Bを、0xE0となって、0x00で、0x00に、/ *ビデオ、最初のバイト(として0x1B)、異なるビデオストリームのパッケージに複数の異なるコーディングの変更、マクロ定義の開始を参照してください* /
    0x90を、0xc0から、0x00で、0x00に、 / * とオーディオ、ビデオ* /
    $ 00、$ 00は、0x00には、$ 00 / * CRC 4Bは、設定されていないれています* /
}。

CONST uint8_t PES_HEAD [] = {
    / * PS_PESヘッダ* /
    $ 00、$ 00、0x01の、0xE0となっ、 
    0x00で、0x00に、/ * PESの長さ* /
    0x80の、0xC0の、/ *追加情報* /
    は0x0A、/ *追加情報の長さ* /
    0x00で、0x00に、0x00で、0x00に、 0x00で、0x00に、0x00で、0x00に、0x00に、0x00の/ * PTS *及びPDS /
}。

ボイドSetHeaderTimeStamp(uint8_t * DEST、uint64_tをPTS)
{
    uint8_t * scr_buf = DEST + 4。
    scr_buf [0] = 0x40の| (((uint8_t)(PTS >> 30)&0x07の)<< 3)| 0x04の| ((uint8_t)(PTS >> 28)&0x03の);
    scr_buf [1] =(uint8_t)((PTS >> 20)&0xffの)。
    scr_buf [2] =(((uint8_t)(PTS >> 15)&0x1Fの)<< 3)| 0x04の| ((uint8_t)(PTS >> 13)&0×03)。
    scr_buf [3] =(uint8_t)((PTS >> 5)&0xffの)。
    scr_buf [4] =(((uint8_t)PTS&0x1Fの)<< 3)| 0×04;
    scr_buf [5] = 1。
}

//设置PES头中的PTS和DTS字段
空隙SetPESTimeStamp(uint8_t *バフ、uint64_tをTS)
{
    バフ+ = 9。
    // PTSの
    バフ[0] =(uint8_t)(((TS >> 30)&0x07の)<< 1)| 0x30の| 0x01を;
    バフ[1] =(uint8_t)((TS >> 22)&0xffの)。
    バフ[2] =(uint8_t)(((TS >> 15)&0xffの)<< 1)| 0x01を;
    バフ[3] =(uint8_t)((TS >> 7)&0xffの)。
    バフ[4] =(uint8_t)((TS&0xffの)<< 1)| 0x01を;
    // DTSの
    バフ[5] =(uint8_t)(((TS >> 30)&0x07の)<< 1)| 0x10の| 0x01を;
    バフ[6] =(uint8_t)((TS >> 22)&0xffの)。
    バフ[7] =(uint8_t)(((TS >> 15)&0xffの)<< 1)| 0x01を;
    バフ[8] =(uint8_t)((TS >> 7)&0xffの)。
    バフ[9] =(uint8_t)((TS&0xffの)<< 1)| 0x01を;
}

INT GetSinglePESHeader(uint8_t *ヘッダ、uint64_tを最終変更時刻、uint16_t farmLen)
{
    farmLen + = 13。
    memcpy(ヘッダ、PES_HEAD、はsizeof(PES_HEAD))。
    *(ヘッダ+ 4)=(uint8_t)(farmLen >> 8)。
    *(ヘッダ+ 5)=(uint8_t)farmLen。

    SetPESTimeStamp(ヘッダ、最終変更時刻)。
    リターンはsizeof(PES_HEAD)。
}

INT GetPSHeader(uint8_t *ヘッダ、uint64_tを最終変更時刻、uint16_t farmLen、INT streamType、INT farmType)
{
    IF(streamType == 2)//语音包
    {
        GetSinglePESHeader(ヘッダ、最終変更時刻、farmLen)。
        *(ヘッダ+ 3)= 0xc0から。
        リターンはsizeof(PES_HEAD)。
    }
    そうであれば(farmType == 1)// I帧
    {
        memcpyを(ヘッダ、PS_HEAD、はsizeof(PS_HEAD))。
        SetHeaderTimeStamp(ヘッダ、最終変更時刻)。
        ヘッダ+ =はsizeof(PS_HEAD)。

        memcpy(ヘッダ、SYS_MAP_HEAD、はsizeof(SYS_MAP_HEAD))。
        ヘッダ+ =はsizeof(SYS_MAP_HEAD)。

        GetSinglePESHeader(ヘッダ、最終変更時刻、farmLen)。
        リターンはsizeof(PS_HEAD)+はsizeof(SYS_MAP_HEAD)+はsizeof(PES_HEAD)。
    }
    他
    {
        memcpyの(ヘッダ、PS_HEAD、はsizeof(PS_HEAD))。
        SetHeaderTimeStamp(ヘッダ、最終変更時刻)。
        ヘッダ+ =はsizeof(PS_HEAD)。

        GetSinglePESHeader(ヘッダ、最終変更時刻、farmLen)。
        リターンはsizeof(PS_HEAD)+はsizeof(PES_HEAD)。
    }
}

unsigned char型PSFrameBuffer [10 * 1024 * 1024]; //コンバートPSフレームバッファの後
のint TransPSFrame(PFRAMEチャー*、nFrameLength、nIFrameFlagのINT、INT nStreamType、u_int nTimeStamp INT)
{
    IF(PFRAME || nFrameLength!)
        リターン0;

    65400のデータまで//各PES
    INT PesLenth nFrameLength => 65400 65400 :? NFrameLength、    
    PESのPSヘッド及び他の望ましくないオーディオ直接パッケージ化PES(00 00 01 C0)を有すること//最初必要
    INT psHeadLen = GetPSHeader(PSFrameBufferを、nTimeStamp、PesLenth、nStreamType、nIFrameFlag)
    のmemcpy(PSFrameBuffer + psHeadLen、PFRAME、PesLenth);
    INT = psHeadLen psSize + PesLenth;
    INT = PesLenth POD。

    nFrameLength - = PesLenth。
    (nFrameLength> 0)、一方
    {
        PesLenth = nFrameLength> 65400?65400:nFrameLength。
        psHeadLen = GetSinglePESHeader(PSFrameBuffer + psSize、nTimeStamp、PesLenth)。

        memcpy(PSFrameBuffer + psSize + psHeadLen、PFRAME +件名、PesLenth)。
        psSize + =(+ PesLenth psHeadLen)。    
        + = PesLenth以下。
        nFrameLength - = PesLenth。
    }

    //静的ファイル* FP =のfopen( "my.ps"、 "WB")。
    // IF(FP)
    //関数fwrite(PSFrameBuffer、1、psSize、FP)。

    psSizeを返します。
}

試験に使用TransPSFrame機能、PSフレームヘッダおよびアプリケーションデータが直接得られるRTPパケットを書き込むべきmemcpyの処理を省略。

あなたは、データのカプセル化形式を変更したい場合はSYS_MAP_HEADデータは、GBの標準的なハードコーディングされたストリームpsに応じています。

変更SYS_MAP_HEAD [30]とパッケージ34とh265 svac svacビデオ及びオーディオ、及び本明細書にマクロ定義の開始時にメモを参照

 

コードカウンタ(SYS_MAP_HEAD [30]と値[34])に対応する付加各種コード:

    PSMUX_ST_RESERVED = 0x00で、
    PSMUX_ST_VIDEO_MPEG1 = 0x01で、
    PSMUX_ST_VIDEO_MPEG2 = 0x02の、
    PSMUX_ST_AUDIO_MPEG1 = 0x03の、
    PSMUX_ST_AUDIO_MPEG2 = 0x04の、
    PSMUX_ST_PRIVATE_SECTIONS = 0x05の、
    PSMUX_ST_PRIVATE_DATA = 0x06で、
    PSMUX_ST_MHEG = 0x07の、
    PSMUX_ST_DSMCC = 0x08に、
    PSMUX_ST_H222_1 = 0x09の、
    PSMUX_ST_AUDIO_AAC = 0x0Fの、
    PSMUX_ST_VIDEO_MPEG4 = 0x10を、
    PSMUX_ST_VIDEO_H264 = 0x1B、
    PSMUX_ST_VIDEO_H265 = 0x24を、
    = 0x80をPSMUX_ST_PS_VIDEO_SVAC、
    PSMUX_ST_PS_AUDIO_AC3 = 0x81と、
    PSMUX_ST_PS_AUDIO_DTS = 0x8A、
    PSMUX_ST_PS_AUDIO_LPCM = 0x8b、
    PSMUX_ST_PS_AUDIO_G711A = 0x90を、
    PSMUX_ST_PS_AUDIO_G711U = 0x91を、
    PSMUX_ST_PS_AUDIO_G722_1 = 0x92、
    PSMUX_ST_PS_AUDIO_G723_1 = 0x93、
    PSMUX_ST_PS_AUDIO_G729 = 0x99、
    PSMUX_ST_PS_AUDIO_SVAC = 0x9B、
    PSMUX_ST_PS_DVD_SUBPICTURE = 0xFFで、
    //標準以下に定義されていませんこれは、定義された
    PSMUX_ST_VIDEO_DIRAC = 0xD1
----------------
免責事項:この記事では、元の記事CSDNブロガー「Heworld_guo」、およびフォローのCC 4.0 BY-SAの著作権契約、転載を添付してくださいがあります元のソースのリンクと、この文。
オリジナルリンクします。https://blog.csdn.net/qq_24977505/article/details/95193041

おすすめ

転載: www.cnblogs.com/mingzhang/p/12565762.html