セキュリティビデオ監視システムビデオクラウドソリューションEasyCVR音声転送機能オーディオデータのパッケージ化と送信プロセスの紹介

現在では、私たちのビデオのクラウドサービスプラットフォームEasyCVRはHaikang EHomeのプライベートプロトコルを統合することができます前回の記事で、私もEHomeプロトコルの設定と呼び出し元のプロセスについて、あなたに言った、あなたが興味を持っている場合は、あなたが読むことができます:。。設定およびプロトコルの導入Ehomeプロトコルを呼び出しプロセスの紹介

EasyCVR1.png

EasyCVR音声転送機能オーディオデータパッケージ送信プロセス

1.全体的なデータ構造については、以下の図を参照してください

202.png

2. psファイルヘッダー

int gb28181_make_ps_header(char *pData, unsigned long long s64Scr)
{
    unsigned long long lScrExt = (s64Scr) % 100;
    s64Scr = s64Scr / 100;
    bits_buffer_t      bitsBuffer;
    bitsBuffer.i_size = PS_HDR_LEN;
    bitsBuffer.i_data = 0;
    bitsBuffer.i_mask = 0x80;
    bitsBuffer.p_data =    (unsigned char *)(pData);
    memset(bitsBuffer.p_data, 0, PS_HDR_LEN);
    bits_write(&bitsBuffer, 32, 0x000001BA);            /*start codes 起始码*/
    bits_write(&bitsBuffer, 2,     1);                        /*marker bits '01b'*/
    bits_write(&bitsBuffer, 3,     (s64Scr>>30)&0x07);     /*System clock [32..30]*/
    bits_write(&bitsBuffer, 1,     1);                               /*marker bit*/
    bits_write(&bitsBuffer, 15, (s64Scr>>15)&0x7FFF);   /*System clock [29..15]*/
    bits_write(&bitsBuffer, 1,     1);                            /*marker bit*/
    bits_write(&bitsBuffer, 15, s64Scr & 0x7fff);        /*System clock [14..0]*/
    bits_write(&bitsBuffer, 1,     1);                        /*marker bit*/
    bits_write(&bitsBuffer, 9,     0);                     /*SCR extension*/
    bits_write(&bitsBuffer, 1,     1);                        /*marker bit*/
    bits_write(&bitsBuffer, 22, (255)&0x3fffff);        /*bit rate(n units of 50 bytes per second.)*/
    bits_write(&bitsBuffer, 2,     3);                        /*marker bits '11'*/
    bits_write(&bitsBuffer, 5,     0x1f);                    /*reserved(reserved for future use)*/
    bits_write(&bitsBuffer, 3,     0);                        /*stuffing length*/
    return 0;
}

パケット開始コードフィールドpack_start_codeは、「0000 0000 0000 0000 0000 0001 1011 1010」(0x000001BA)のビット文字列で、パケットの開始を示すために使用されます。

システムクロック参照フィールドsystem_clock_reference_baseおよびsystem_clock_reference_extenstion

マーカービットフィールドmarker_bit 1ビットフィールド、固定値 '1'

プログラム複合レートフィールドprogram_mux_rateは、このフィールドを含むパケット中にP-STDがプログラムストリームを受信するレートを指定する22ビット整数です。その値は50バイト/秒の単位であり、値0は許可されていません

パケットスタッフィング長さフィールドpack_stuffing_lengthは、フィールドの後のスタッフィングバイト数を指定する3ビット整数です。

Stuffing_byte 8ビットフィールド、値は常に「1111 1111」

3. PSシステム情報

system_header_start_codeは、システムヘッダーの開始を示す '0000 0000 0000 0000 0000 0001 1011 1011'(0x000001BB)のビット文字列を取るシステムヘッダースタートコードフィールドの32ビットフィールドです。

header_lengthヘッダー長フィールドは16ビットのフィールドです。このフィールドの後のシステムヘッダーのバイト長を指摘します。このフィールドは、この仕様の将来の拡張で拡張される可能性があります

marker_bitは1ビットを占め、固定値は1です

rate_bound:レートバウンドフィールドの22ビットフィールド値は、プログラムストリームのパケットにエンコードされたprogram_mux_rateフィールドの最大値以上です。このフィールドは、デコーダーがストリーム全体をデコードできるかどうかを推定するために使用できます。

marker_bitは1ビットを占め、固定値は1です

audio_boundオーディオバウンドフィールドは6ビットフィールドであり、値は0〜32の閉じた間隔の整数であり、プログラムストリームのデコードプロセスで同時にアクティブなGB / T XXXX.3およびGB / T AAAA.3オーディオストリームの値以上です。最大数

fixed_flag固定フラグフィールドは1ビットのフラグです。「1」に設定すると、ビットレートが一定であることを意味し、「0」に設定すると、操作のビットレートが可変であることを意味します

CSPS_flag CSPSフラグフィールドは1ビットのフィールドです。「1」に設定すると、プログラムストリームは標準に準拠します

system_audio_lock_flagシステムオーディオロックフラグフィールドは1ビットのフィールドです。システムターゲットデコーダーのオーディオサンプリングレートとsystem_clock_frequencyの間に指定された比率があることを示します

system_video_lock_flagシステムビデオロックフラグフィールドは1ビットのフィールドです。システムターゲットデコーダーのビデオフレームレートとsystem_clock_frequencyの比率が指定されていることを示します

marker_bitは1ビットを占め、固定値は1です

vedio_boundビデオバインドフィールド5ビットフィールド。値は0〜16の閉じた間隔の整数で、プログラムストリームのデコードプロセス中に同時にアクティブになるGB / T XXXX.2およびGB / T AAAA.2ストリームの最大数以上

packet_rate_restriction_flagパケットレート制限フラグフィールドの1ビットフラグ。CSPSフラグが「1」の場合、このフィールドは、2.7.9で指定された制限がパケットレートに適用されることを示します。CSPSフラグが「0」の場合、このフィールドの意味は未定義です。

reserved_bits予約済みビットフィールド、7ビットフィールド。固定値は「111 1111」である必要があります

stream_idストリーム識別フィールドは8ビットのフィールドです。これは、後続のP-STD_buffer_bound_scaleおよびP-STD_buffer_size_boundフィールドに含まれるストリームのエンコーディングとエレメンタリストリーム番号を示します。値が「1011 1000」の場合、次のP-STD_buffer_bound_scaleフィールドとP-STD_buffer_size_boundフィールドはプログラムストリーム内のすべてのオーディオストリームを参照し、値が「1011 1001」の場合、後続のP-STD_buffer_bound_scaleフィールドとP-STD_buffer_size_boundフィールドはプログラムストリーム内のすべてのビデオストリーム

P-STD_buffer_bound_scale P-STDバッファーバインドスケールフィールドは1ビットフィールドです。後続のP-STD_buffer_size_boundフィールドを解釈するために使用されるスケール係数を表します。前のstream_idがオーディオストリームを表す場合、このフィールドの値は「0」です。ビデオストリームを表す場合、このフィールドの値は「1」です。他のすべてのストリームタイプの場合、このフィールドの値は「0」または「1」のいずれかです。

P-STD_buffer_size_bound P-STDバッファーサイズバインドフィールドは13ビットの符号なし整数であり、その値はプログラムストリーム内のストリームnのすべてのパケットのP-STDバッファーサイズBSnの最大値以上です。P-STD_buffer_bound_scaleの値が「0」の場合、このフィールドは128バイトを単位として使用して、バッファーサイズの境界を測定します。

4. psm情報

packet_start_code_prefixパケット開始コードプレフィックスフィールドの24ビットコード。それとそれに続くmap_stream_idが一緒になってパケット開始コードを形成し、パケットの始まりを示します。このフィールドは、値が「0000 0000 0000 0000 0000 0001」(0x000001)であるビット文字列です。

map_stream_idは、マッピングストリーム識別フィールドの8ビットフィールドであり、値は0xBCです。

program_stream_map_lengthプログラムストリームマップ長フィールドは、16ビットのフィールドです。このフィールドの直後のprogram_stream_mapのバイト数を示します

current_next_indicator現在の次のインジケータフィールドは1ビットのフィールドです。「1」に設定されている場合、送信されたプログラムストリームマップが現在使用可能であることを意味します。「0」に設定されている場合、送信されたプログラムストリームマッピングはまだ使用できませんが、次の有効なテーブルになります

予約済み予約済みフィールド2ビット

program_stream_map_versionプログラムストリームマップのバージョンフィールドは、プログラムストリームマップ全体のバージョン番号を表す5ビットのフィールドです。プログラムストリームマッピングの定義が変更されると、このフィールドは1、および32を法として増分されます。current_next_indicatorが「1」の場合、このフィールドは現在適用可能なプログラムストリームマッピングのバージョン番号である必要があり、current_next_indicatorが「0」の場合、このフィールドは次に適用可能なプログラムストリームマッピングのバージョン番号である必要があります

予約済み予約済みフィールド7ビット

marker_bitフラグビット、1ビットのフィールド、値は「1」

program_stream_info_lengthプログラムストリーム情報の長さフィールドは16ビットのフィールドで、このフィールドの直後に続く記述子の全長を示します。

elementary_stream_map_lengthエレメンタリストリームマップの長さフィールドは、プログラムストリームマップ内のすべてのエレメンタリストリーム情報のバイト長を示す16ビットのフィールドです。stream_type、elementary_stream_id、およびelementary_stream_info_lengthフィールドのみが含まれます

stream_typeストリームタイプフィールド
MPEG-4ビデオストリーム:0x10;
H.264ビデオストリーム:0x1B;
SVACビデオストリーム:0x80;
G.711オーディオストリーム:0x90;
G.722.1オーディオストリーム:0x92;
G.723.1オーディオストリーム:0x93;
G.729オーディオストリーム:0x99;
SVACオーディオストリーム:0x9B。

elementary_stream_idエレメンタリーストリーム識別子フィールドは、エレメンタリーストリームが配置されているPESパケットのPESパケットヘッダーのstream_idフィールドの値を示す8ビットのフィールドです。(このフィールドの定義。0x(C0DF)はオーディオを指し、0x(E0EF)はビデオを指します)

elementary_stream_info_lengthエレメンタリーストリーム情報の長さフィールドは16ビットのフィールドで、このフィールドの直後に続く記述子のバイト長を示します。(つまり、このタイプのストリーム記述の長さ。このフィールドの後に指定された長さは、elementary_stream_map_lengthで指定された範囲クラスにありません。)

CRC_32 CRC 32字段

32ビットのフィールド。完全なプログラムストリームマッピングを処理した後、付録Aで定義されたデコーダーレジスターで0出力値を生成するためのCRC値が含まれます。

5. PESデータ

int gb28181_make_pes_header(char *pData, int stream_id, int payload_len, unsigned long long pts, unsigned long long dts)
{

    bits_buffer_t      bitsBuffer;
    bitsBuffer.i_size = PES_HDR_LEN;
    bitsBuffer.i_data = 0;
    bitsBuffer.i_mask = 0x80;
    bitsBuffer.p_data =    (unsigned char *)(pData);
    memset(bitsBuffer.p_data, 0, PES_HDR_LEN);
    /*system header*/
    bits_write( &bitsBuffer, 24,0x000001);    /*start code*/
    bits_write( &bitsBuffer, 8, (stream_id));    /*streamID*/
    bits_write( &bitsBuffer, 16,(payload_len)+13);    /*packet_len pes剩余头部以及后面的es长度之和,比如SPS长度+13*/
    bits_write( &bitsBuffer, 2, 2 );        /*'10'*/
    bits_write( &bitsBuffer, 2, 0 );        /*scrambling_control*/
    bits_write( &bitsBuffer, 1, 1 );        /*priority*/
    bits_write( &bitsBuffer, 1, 1 );        /*data_alignment_indicator*/
    bits_write( &bitsBuffer, 1, 0 );        /*copyright*/
    bits_write( &bitsBuffer, 1, 0 );        /*original_or_copy*/
    bits_write( &bitsBuffer, 1, 1 );        /*PTS_flag 是否有PTS*/
    bits_write( &bitsBuffer, 1, 1 );        /*DTS_flag 是否有DTS信息*/
    bits_write( &bitsBuffer, 1, 0 );        /*ESCR_flag*/
    bits_write( &bitsBuffer, 1, 0 );        /*ES_rate_flag*/
    bits_write( &bitsBuffer, 1, 0 );        /*DSM_trick_mode_flag*/
    bits_write( &bitsBuffer, 1, 0 );        /*additional_copy_info_flag*/
    bits_write( &bitsBuffer, 1, 0 );        /*PES_CRC_flag*/
    bits_write( &bitsBuffer, 1, 0 );        /*PES_extension_flag*/
    bits_write( &bitsBuffer, 8, 10);        /*header_data_length*/

    /*PTS,DTS*/
    bits_write( &bitsBuffer, 4, 3 );                    /*'0011'*/
    bits_write( &bitsBuffer, 3, ((pts)>>30)&0x07 );     /*PTS[32..30]*/
    bits_write( &bitsBuffer, 1, 1 );
    bits_write( &bitsBuffer, 15,((pts)>>15)&0x7FFF);    /*PTS[29..15]*/
    bits_write( &bitsBuffer, 1, 1 );
    bits_write( &bitsBuffer, 15,(pts)&0x7FFF);          /*PTS[14..0]*/
    bits_write( &bitsBuffer, 1, 1 );
    bits_write( &bitsBuffer, 4, 1 );                    /*'0001'*/
    bits_write( &bitsBuffer, 3, ((dts)>>30)&0x07 );     /*DTS[32..30]*/
    bits_write( &bitsBuffer, 1, 1 );
    bits_write( &bitsBuffer, 15,((dts)>>15)&0x7FFF);    /*DTS[29..15]*/
    bits_write( &bitsBuffer, 1, 1 );
    bits_write( &bitsBuffer, 15,(dts)&0x7FFF);          /*DTS[14..0]*/
    bits_write( &bitsBuffer, 1, 1 );
    return 0;
}

おすすめ

転載: blog.csdn.net/EasyNVS/article/details/108635518