h264码流分为rbsp和mp4两种格式
sps和pps,蓝色字段为nal头
00 00 00 01 6742 80 1E 96 54 05 01 ED80 A8 40 00 00 03 00 40 00 00 07 B8 00 01 F4 00 03 E8 1F C6 38 C0 00 0F A0 001F 40 FE 31 C3 B4 24 4D 4000 00 00 01 68 CE 35 20 0000 00 01 09 30
在sdp中的fmtp字段是将sps和pps分别做base64编码后组合成一个字符串。
slice帧数据,每个nal以00 00 00 01间隔
00 00 00 01 09 30 00 00 00 01 06 01 0D 00 03 00 00 03 00 90 809D 54 40 00 00 10 80 00 00 00 01 41 9A 0C 18 01 15 B3 89 E2C4 F1 BA F2 FE 14 13 C2 77 82 8B C2 A2 38 D1 1B C4 ED 44 BC 97 8A 11 E2 38 4441 2A 41 4B 13 78 73 51 98 D8 91 1E 23 87 AF 09 8E EF 59 A1 0B F7 F5 0D 88 5975 37 BC 7C 2B AF AB D8 85 15 F1 35 89 92 87 E2 39 75 47 78 64 41 38 85 58 8573 E5 BC F9 DF AC 48 9F C0 F9 1E 2B C4 12 94 51 38 A5 2F 36 F3 AE 75 AB 1F 59E1 B1 0A 21 A4 62 83 BE 54 A2 9D 8E 14 51 5F FD 3F E2 33 4A 29 F3 92 E5 AD D86A F7 09 63 EE F2 8A 76 A2 96 4C 6D EA F5 08 88 E4 F1 B8 F8 7B 71 95 87 C5
extradata数据,包含sps和pps
01 42 00 1E FF E1 00 2C 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 E81F C6 38 C0 00 0F A0 00 1F 40 FE 31 C3 B4 24 4D 40 01000468 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 00 00 02 09 10 00 00 00 28 06 00 11 80 00 4B EB 80 00 00 0300 00 03 00 4B EB 80 00 00 03 00 40 01 0D 00 07 80 00 00 90 80 BB 33 00 00 0300 10 8000 00 18 77 65 88 80 00 2E B0 00 21 6C 46 2800 08 0D 47 63 E4 E4 E4 E4 E4 DC 9C 9B 93 93 93 72 72 6E 4E 4D FF B1 7D 9B 1985 15 75 AB 7D F6 60 69 83 A2 EE 9F 66 72 FA 94 B9 43 AF 1F 62 D3 F2 40 7B FB73 57 BE 9B 75 11 84 70 33 6B C2 1F FF BE B0 86 09 B3 17 66 7F BF FE 10 C0 51A9 85 09 0E FA EF AB 3F FE BF E2 6F EB AB E1 0C E8 3D 7F FF F3 3F F8 52 27 CB1D 39 77 08 67 FE FF FF FC 7F E1 2C 99 B3 3C 21 82 2E C7 7B 76 F6 EE 5B 96 BF36 FF 84 7F C1 3D A7 7C BE A4 DC 46 EF 27 26 A4 E2 3B 42 18 04 A0 56 41 44 1BDA F7 6E 9C
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码流。
默认创建的AVCodecContext只支持解码rbsp格式的码流。
如果要解码mp4格式的码流,需要将接收到flv extradata置入AVCodecContext结构体中
av_context.extradata= extradata;
av_context.extradata_size= extradata_size;
avcodec_open2(&av_context,codec,NULL);
x264编码
将x264_param_t中
b_annexb置为1输出rbsp格式,置为0输出mp4格式
i_slice_max_size设置每个nal最大字节数,如果不置该值,表示每帧编码成一个nal。