搜档网
当前位置:搜档网 › h264码流类型

h264码流类型

h264码流类型
h264码流类型

h264码流分为rbsp和mp4两种格式

rbsp格式

sps和pps,蓝色字段为nal头

00 0000 01 6742 80 1E 96 54 05 01 ED 80 A8 40 00 00 03 00 40 00 00 07 B8 00 01 F4 00 03 E8 1F C6 38 C0 00 0F A0 00 1F 40 FE 31 C3 B4 24 4D 40 00 0000 01 68 CE 35 20 00 0000 01 09 30

在sdp中的fmtp字段是将sps和pps分别做base64编码后组合成一个字符串。

slice帧数据,每个nal以00 0000 01间隔

00 0000 01 09 30 00 0000 01 06 01 0D 00 03 00 00 03 00 90 80 9D 54 40 00 00 10 80 00 0000 01 41 9A 0C 18 01 15 B3 89 E2 C4 F1 BA F2 FE 14 13 C2 77 82 8B C2 A2 38 D1 1B C4 ED 44 BC 97 8A 11 E2 38 44 41 2A 41 4B 13 78 73 51 98 D8 91 1E 23 87 AF 09 8E EF 59 A1 0B F7 F5 0D 88 59 75 37 BC 7C 2B AF AB D8 85 15 F1 35 89 92 87 E2 39 75 47 78 64 41 38 85 58 85 73 E5 BC F9 DF AC 48 9F C0 F9 1E 2B C4 12 94 51 38 A5 2F 36 F3 AE 75 AB 1F 59 E1 B1 0A 21 A4 62 83 BE 54 A2 9D 8E 14 51 5F FD 3F E2 33 4A 29 F3 92 E5 AD D8 6A F7 09 63 EE F2 8A 76 A2 96 4C 6D EA F5 08 88 E4 F1 B8 F8 7B 71 95 87 C5

mp4格式

extradata数据,包含sps和pps

01 42 00 1E FF E1 00 2C 67 42 80 1E 96 54 05 01 ED 80 A8 40 00 00 03 00 40 00 00 07 B8 00 01 F4 00 03 E8 1F C6 38 C0 00 0F A0 00 1F 40 FE 31 C3 B4 24 4D 40 0100 0468 CE 35 20 00

extradata格式如下:

| cfgVersion(8) | avcProfile(8) | profileCompatibility(8) |avcLevel(8) | reserved(6) | lengthSizeMinusOne(2) | reserved(3) | numOfSPS(5) |spsLength(16) | sps(n) | numOfPPS(8) | ppsLength(16) | pps(n) |

对应到上述码流各字段值为:

configurationVersion = 01

AVCProfileIndication = 42

profile_compatibility = 00

AVCLevelIndication = 1e

lengthSizeMinusOne = 3 -- FLV中NALU包长数据所使用的字节数,(lengthSizeMinusOne& 3)+1,计算结果为4

numOfSPS = 1 -- SPS 的个数,numOfSequenceParameterSets& 0x1F,计算结果为1

spsLength = 00 2c -- SPS 的长度,2个字节,计算结果44

slice帧数据,每个nal头前4个字节表示nal长度

00 0000 02 09 10 00 0000 28 06 00 11 80 00 4B EB 80 00 00 03 00 00 03 00 4B EB 80 00 00 03 00 40 01 0D 00 07 80 00 00 90 80 BB 33 00 00 03 00 10 80 00 00 18 77 65 88 80 00 2E B0 00 21 6C 46 28 00 08 0D 47 63 E4 E4E4E4E4 DC 9C 9B 93 9393 72 72 6E 4E 4D FF B1 7D 9B 19 85 15 75 AB 7D F6 60 69 83 A2 EE 9F 66 72 FA 94 B9 43 AF 1F 62 D3 F2 40 7B FB 73 57 BE 9B 75 11 84 70 33 6B C2 1F FF BE B0 86 09 B3 17 66 7F BF FE 10 C0 51 A9 85 09 0E FA EF AB 3F FE BF E2 6F EB AB E1 0C E8 3D 7F FF F3 3F F8 52 27 CB 1D 39 77 08 67 FE FF FF FC 7F E1 2C 99 B3 3C 21 82 2E C7 7B 76 F6 EE 5B 96 BF 36 FF 84 7F C1 3D A7 7C BE A4 DC 46 EF 27 26 A4 E2 3B 42 18 04 A0 56 41 44 1B DA F7 6E 9C

用ffmpeg将mp4格式转为rbsp

unsigned char *outbuf=NULL; //输入的指针

int out_len;

AVBitStreamFilterContext* bsfc = av_bitstream_filter_init("h264_mp4toannexb");

av_bitstream_filter_filter(bsfc, pCodecCtx, NULL, &outbuf, &out_len, inbuf, in_len, 0); …………..

av_bitstream_filter_close(bsfc);

free(outbuf);

其中inbuf为mp4码流,outbuf为rbsp码流。

用ffmepg解码h264码流

默认创建的AVCodecContext只支持解码rbsp格式的码流。

如果要解码mp4格式的码流,需要将接收到flvextradata置入AVCodecContext 结构体中

av_context.extradata=extradata;

av_context.extradata_size=extradata_size;

avcodec_open2(&av_context,codec, NULL);

相关主题