H264 ストリームから寸法 (高さと幅) を取得しようとしています。mpeg2 ストリームから同じ詳細を取得するには、シーケンス ヘッダーの開始コード ((01B3)) に続く 4 バイトを確認する必要があることを私は知っています。H264 でも同じロジックが機能しますか? 私が得た助けに感謝します..
4 に答える
いいえ!!!
シーケンス パラメータ セットからビデオ ディメンションを抽出するには、複雑な関数を実行する必要があります。これを行う方法?まず、独自の Exp-Golomb デコーダーを作成するか、オンラインで見つける必要があります...たとえば、live555 ソース コードのどこかにある...
次に、1 つの SPS フレームを取得する必要があります。これには(NAL は H.264 フレームの最初のバイト) があり、最初のコンマの前の最初の Base64 文字列のNAL=0x67
下にある SDP の Base64 エンコード文字列として見つけることができます。sprop-parameter-sets
他のカンマ区切りの文字列には、画像パラメータ セットがあります... これはZ0KAKYiLQDIBL0IAAB1MAAK/IAg=
、Base64 からバイト配列にこのようなものをデコードする必要がある SDP からの 1 つの SPS です。
次に、そのバイト配列で NAL UNIT HEADER が続くRAW BYTE SEQUENCE PAYLOAD を抽出する必要があります!!! 通常は 1 バイトの長さですが、念のため読み進めてください... RBSP には、seq_parameter_set_data( )
関数の実行に必要なバイトが含まれています。そのため、最初に NAL UNIT HEADER (1 バイト以上) を取り除く必要があります。
これは、SPS NAL UNIT から RBSP バイトを抽出する関数です。
次に、SPS (RBSP バイト) がある場合は、このバイト配列のビットを解析する関数を実行する必要があります。すべてのパラメーターがそこで解析された関数を次に示します (ドキュメント全体はここにあります: http://www.itu.int/rec/T-REC-H.264-201003-I/enおよびその無料):
そこには奇妙なものがいくつかあります...まず、ビデオのサイズは次のように計算されます。
Width = ((pic_width_in_mbs_minus1 +1)*16) - frame_crop_right_offset*2 - frame_crop_left_offset*2;
Height = ((2 - frame_mbs_only_flag)* (pic_height_in_map_units_minus1 +1) * 16) - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2);
2 番目に最も重要なことは、このコード表の DESCRIPTOR 列に、最初の列の太字のテキスト パラメータを読み取るために何をすべきかが示されていることです。そこに含まれる値の意味は次のとおりです。
- u(N) - N ビット長の符号なし数値を読み取る
- s(N) - N ビット長の符号付き数値を読み取る
- ue(v) - 符号なし Exp-Golomb 数を読み取ります (v は可変長のため、 と同じです
ue()
) - se(v) - 符号付き Exp-Golomb 数を読み取る
ここで、Exp-Golomb デコーダーが役立ちます...
したがって、この関数を実装し、SPS を解析すると、幅と高さが得られます。楽しみ... :)
サイズの計算は残念ながら間違っており、次のようになります。
width = ((pic_width_in_mbs_minus1 +1)*16) - frame_crop_left_offset*2 - frame_crop_right_offset*2;
height= ((2 - frame_mbs_only_flag)* (pic_height_in_map_units_minus1 +1) * 16) - (frame_crop_top_offset * 2) - (frame_crop_bottom_offset * 2);
実際には、SPS で [frame_cropping_flag] が有効になっている場合にのみ、トリミング パラメータを使用する必要があります。H.264を楽しもう!
フレーム サイズの計算に関して、上記の式は正しくありません。
が存在する場合chroma_format_idc
は、SPS から抽出する必要があります。が存在しない場合chroma_format_idc
、1 に等しいと推論されます (4:2:0 クロマ形式)。その場合、separate_color_plane_flag
は設定されません。これは、chromaArrayType = chroma_format_idc
とが 2 に等しいことsubWidthC
を意味します。subHeightC
変数cropUnitXとcropUnitYは次のように導出されます:
chromaArrayType
が に等しい場合0
、次のようcropUnitX
にcropUnitY
導出されます。cropUnitX = 1 cropUnitY = 2 - frame_mbs_only_flag
それ以外の場合 (は、、または) に等しく
chromaArrayType
、次のように導出されます。1
2
3
cropUnitX
cropUnitY
cropUnitX = subWidthC cropUnitY = subHeightC * ( 2 - frame_mbs_only_flag )
cropUnitX
これで、上記の式でとを使用しcropUnitY
て、フレーム サイズの正しい値を取得できます。