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