JM8.6编码后,需要将码流写进文件,在默认代码中是写进test.264文件的,写入过程把test.264当成了一个二进制文件,可以用UltraEdit看其中的码流,码流开始部分(本人用的是baseline)一般是:00 00 00 01 67 42...,鉴于test.264是二进制文件,而UltraEdit只相当于一个显示器,让人可以看到其中的比特(并不能复制粘贴其中的比特). 也就是说,通过UltraEdit, 人眼仿佛就看到了计算器中存储在硬件中的比特.
那么JM8.6中的码流是怎样写入test.264文件中的呢?写码流操作一般是和fwrite有关的,在JM8.6中搜索一下,搜到了四处,与本文讨论相关的仅有一处:
if (n->len != fwrite (n->buf, 1, n->len, f)) { printf ("Fatal: cannot write %d bytes to bitstream file, exit (-1)\n", n->len); exit (-1); }
跟踪了一下代码,发现除了fwrite写码流外,putc函数也进行了写码流操作. 我跟踪代码后发现,在JM8.6中(采用annexb而非rtp),写码流的语句一共有五个,都在annexb.c中,分别是:
putc (0, f);
putc (0, f);
putc (0, f);
putc (1, f);
if (n->len != fwrite (n->buf, 1, n->len, f)) { printf ("Fatal: cannot write %d bytes to bitstream file, exit (-1)\n", n->len); exit (-1); }
为什么如此肯定只有这五个地方呢?可以写一个简单的代码验证一下,代码如下: (为了简便起见,只编码第一帧. 我测试过,编码多帧时也同理)
extern FILE *fp; // 全局的文件指针fp指向了myData.txt文件 // 打开方式为:fp = fopen("myData.txt", "w"); // 下面函数把十进制转成十六进制, 并打印到myData.txt中 void printDataIntoFiles(FILE *fp, int i) { static int n = 0; assert(i >= 0 && i <= 255); n++; if(0 == n % 16) { n = 0; if(i <= 15) fprintf(fp, "0%X ", i); else fprintf(fp, "%X ", i); fprintf(fp, "\n"); } else { if(i <= 15) fprintf(fp, "0%X ", i); else fprintf(fp, "%X ", i); } } /*! ******************************************************************************************** * \brief * Writes a NALU to the Annex B Byte Stream * * \return * number of bits written * ******************************************************************************************** */ int WriteAnnexbNALU (NALU_t *n) { int BitsWritten = 0; int i; assert (n != NULL); assert (n->forbidden_bit == 0); assert (f != NULL); assert (n->startcodeprefix_len == 3 || n->startcodeprefix_len == 4); // printf ("WriteAnnexbNALU: writing %d bytes w/ startcode_len %d\n", n->len+1, n->startcodeprefix_len); if (n->startcodeprefix_len > 3) { putc (0, f); BitsWritten =+ 8; printDataIntoFiles(fp, 0); } putc (0, f); printDataIntoFiles(fp, 0); // 写到myData.txt中 putc (0, f); printDataIntoFiles(fp, 0); // 写到myData.txt中 putc (1, f); printDataIntoFiles(fp, 1); // 写到myData.txt中 BitsWritten += 24; n->buf[0] = n->forbidden_bit << 7 | n->nal_reference_idc << 5 | n->nal_unit_type; // printf ("First Byte %x, nal_ref_idc %x, nal_unit_type %d\n", n->buf[0], n->nal_reference_idc, n->nal_unit_type); if (n->len != fwrite (n->buf, 1, n->len, f)) { printf ("Fatal: cannot write %d bytes to bitstream file, exit (-1)\n", n->len); exit (-1); } BitsWritten += n->len * 8; for(i = 0; i < n->len; i++ ) { // 写到myData.txt中 printDataIntoFiles(fp, n->buf[i]); } fflush (f); #if TRACE fprintf (p_trace, "\n\nAnnex B NALU w/ %s startcode, len %d, forbidden_bit %d, nal_reference_idc %d, nal_unit_type %d\n\n", n->startcodeprefix_len == 4?"long":"short", n->len, n->forbidden_bit, n->nal_reference_idc, n->nal_unit_type); fflush (p_trace); #endif return BitsWritten; }
编码完后,去看看myData.txt中的数据,字符数据复制过来如下:
00 00 00 01 67 42 00 1E F1 61 62 62 00 00 00 01
68 C8 A1 43 88 00 00 00 01 65 88 84 02 63 61 7C
00 1D 6E FC 00 73 E0 C1 77 30 F2 14 3B 65 A4 49
75 3E 16 06 98 07 FF 9F 2F 96 00 A9 A9 74 E6 6E
09 55 1A 05 91 65 C8 4A CE 20 4F C0 42 0B 24 C6
AC 24 F0 70 09 07 48 DF 91 1D A9 F5 0A 6F 43 AD
7E 65 32 78 B0 39 20 C0 2E 8D A4 F9 73 81 05 1D
42 28 E5 FF 1C 77 77 7E 4E 5E 06 D3 6E 02 D4 F4
2C B2 14 BD BD F0 5A AC 0C 09 5A DC 40 1C 99 B8
C9 AA 93 D0 6F 9D 6A EE 72 41 CB 17 42 8B 4D 7F
F8 04 08 49 32 3F BE 32 7D 1F EE FB CF FB BD 4C
23 E5 1F FE 31 A4 7D 60 D1 8F 6E B2 BA 97 0B 26
50 2C B4 9B 8C 24 78 36 39 85 26 CE AC CF 07 44
5F EE EE 0F 77 DE BD 40 40 26 0B 1F F1 3B 4F F4
08 D0 A3 B8 B0 33 8F F4 4C BF FC FB 22 79 45 09
EA F5 FE CA F4 1E 2B 37 3D EE FB BF 3F D4 04 82
62 CE 5E 0C 4E 8A DF FC 8D E9 01 F2 7C 10 4C 1B
E1 8D 21 1D 49 7E 33 C5 A9 F0 77 2C 3C 2C FB 0A
78 2F 8D F7 C5 7F E1 6A E5 F7 DC 79 B9 F6 98 F9
C3 4E FE A7 99 D7 A9 E6 E0 07 7B 5B 09 C9 8D 9D
53 37 3B 40 CD 94 27 82 38 4D E4 15 65 BE C2 3F
35 AF 11 F5 92 DE C6 37 9A 69 FE 75 7C FE 05 15
86 D4 D7 25 BE 67 BD 2D B7 65 25 6D 96 90 DB DB
D4 8A 36 CE AD 39 51 97 33 CF 3A 53 B8 75 28 39
70 5D 9D F2 C8 C0 04 36 19 75 ED D4 83 15 9B 33
B9 7C 57 5E 32 11 7F 87 C4 E2 EF 1C 5E 7A 4F 29
9E E0 0A 08 A4 2B 07 DA 7C 9C 4E 11 01 E4 BE 98
BD 81 40 4A 22 76 74 13 54 74 BF F5 E3 3E 08 CE
6D 57 80 C4 EC B9 39 9F 3F 3D 2A EF 90 D8 E9 7D
82 DD 51 72 6B 39 34 F5 C8 3E 80 26 55 18 20 5B
6A 79 32 C4 50 47 80 9B D1 E1 49 D6 6B 76 2F 47
B3 E8 F9 6E CB 4A 60 84 CF 1F E5 95 49 EB 5E C1
40 DE 70 83 EE CD 63 26 D8 64 04 3B 79 35 16 C1
FB 7D FB 7D 3F 9A 1B 60 11 36 90 D2 D8 68 FE 29
F6 F7 00 85 6C 0B 1F E8 98 C3 17 02 18 BF 20 8B
E5 F8 76 4E 65 6B DE EE EF D5 53 80 80 58 58 BF
88 05 16 2C B3 33 0F 8B 48 F6 0F FF 15 3C FA 1A
26 93 33 3C C9 95 C0 6F 3B A0 F1 5A BA 15 AE 5B
BB C1 C7 FF 2E F2 7A 8E 7D 1B C1 86 F2 40 7C 9F
17 F5 61 EB 84 41 66 BE 01 9F 3E 6E F5 B9 EB FD
A1 45 E0 D7 FF 0B D7 80 30 36 62 8E 74 6F FF FF
C2 F6 5F 5F 7A DC 8A 9D 26 DF 4F 4D 6B 5A 3B F9
0F 0C AB C7 09 A2 9D 15 5D F4 BA 7B C5 31 6A 67
C8 D1 3E 13 6F D7 8C 91 D7 6B C0 ED FB 78 7C 99
B7 D4 6E DF 59 59 B5 32 EE 67 3F E6 09 4E E5 16
2E 4F E0 77 15 42 56 FD EB F4 A5 AE E8 BB C6 3C
D9 C3 AE 7A 30 47 E3 F5 E6 9E 95 F0 9D C0 18 94
F9 CF EF 5F B2 10 44 3C 7B C7 81 8F 39 AD F2 E9
59 CA 67 47 85 2F 04 BD F3 5E 10 81 3D A7 3F 80
80 B9 14 21 EF 35 93 38 9E B1 DA 88 43 DF 7C 1D
7C 06 12 97 3B 92 3C 0F 7C 04 8F 4D F9 24 4B 7D
C3 FF FF BB BB C5 AD FE 1D 4F 31 C0 28 B5 1C C9
99 C0 EF B7 77 D2 1A 3B 82 19 5C B6 A3 07 DA 51
53 EF 77 BD F9 6A F0 85 30 2C 7F 86 68 88 01 47
53 98 35 7C 53 BF 0D 52 8E 0D 29 C4 11 84 87 D1
F8 4A 91 38 9B B4 7F F9 D7 D9 6F C7 4B 76 3B 77
7B 7D 6C 19 D3 7D CC E5 44 50 8F DA 68 7D F6 7F
BF 3D 7F 0D EA EF FF EE FB BC 3B C5 EF E5 1E 8E
F8 13 8A 7A 56 C3 16 1E 73 2D 31 6F 6D BF F8 06
01 A0 AE 03 A0 11 A2 47 73 9E D2 3F F0 0C 03 41
DC D6 27 87 89 06 E1 D8 C9 EA B9 77 F8 E1 48 06
B8 20 85 7E 9C CA 20 B9 50 5E 35 E2 2C BC A3 C5
06 B6 FE B9 FA 95 7D BD D2 75 59 91 6D BC 6E BC
2C A7 59 CB C8 56 BD 29 92 15 96 7C FE 53 89 98
4E EB 86 15 D6 77 76 18 27 68 8D 19 68 D7 54 E3
F7 1B 9C 25 6E 8F 9F 79 32 34 39 CF B3 A2 43 76
6D 3C 22 79 CC EE 16 6C 2F 3E 22 69 86 6A F7 9F
8E 2C CB B5 3D 52 67 8E 1F EB 6B E6 8B 3B 8E 55
66 21 F7 BF F2 0E 17 BC 1C 25 E5 80 71 C4 8E A4
7C 50 F4 75 2E E8 9A 27 57 85 B9 AE B7 D9 D1 C6
85 65 5D 54 0C 3B F0 18 31 DC 2B 83 5E 72 FE FF
FA 0B 5B C9 03 ED F8 90 9B 9E 6E FE 7B F7 3F BF
17 FF FE 82 BE EE 5F 01 17 5B 0C C3 2B B9 13 05
9A BC B8 02 40 70 88 39 78 06 E1 D1 25 08 16 67
2C 7A 9F 49 57 B1 DE 76 72 8F CB C2 80 A9 45 E0
08 86 0B 33 54 9D 6E 7F C1 EF F4 15 7B FA 3E 78
65 C8 E7 B6 4F 38 37 BA 6D 76 F2 6C 8E FA 12 5E
07 CD E7 E2 E9 13 2E BF FF EB 88 8C 79 7B DA B6
B7 52 F6 AF A6 EC EB 19 43 7F 57 8E D4 F4 AC B2
61 92 FE 19 B7 C6 4A 25 4E E2 1E 90 1F B5 FE B1
9A AD 4E 8A 97 66 37 EF 39 E4 CE 84 FE 5B 34 DD
76 2E 5F EA 2D 9B A3 A8 20 E3 F6 3B AB 16 F7 F8
B5 73 BF 9E DE 68 F5 F0 0B 64 D0 A0 5C BE 85 83
78 93 65 1C 39 85 64 D0 B5 A4 B3 7A AF DB 1B 8D
BE 68 D7 D5 2B EC EA F4 3A CF C7 97 E7 4C AC 7B
D6 59 CC D7 0D BC D0 2C B3 05 E1 59 B6 06 93 CE
13 B9 19 B6 74 D9 F5 3E 95 F2 A3 B4 B9 FC 76 84
2F 33 AE AF 1E F9 90 B4 CF 62 4D D9 C1 6C 08 09
17 7A 90 85 78 38 0B BC 67 EF 84 5E 90 14 46 D3
BC 34 AE 04 38 68 C5 97 3A 5E 94 E1 00 DD C1 D2
09 EC 80 5C 1F BB 01 DB EF 83 B9 3A BF 4F 80 51
65 1C C8 2B 5F C7 C0 85 AE 64 CE 73 3A 4B 3B 99
06 43 90 B0 CD 26 2C 68 E1 36 CE 21 FD B7 0F DE
1C 78 3B DC 3E 3E 8D 86 8B 3B 89 C7 2B 8D AF 4B
24 B5 24 16 9E 17 D5 55 FB 33 55 68 69 3C E9 6E
03 40 BF 58 F3 24 69 3A 4F 3E BB 0A D5 7A D8 8C
7B C8 B5 C8 7E B4 74 37 95 B7 AE 61 01 56 B7 83
DF 38 70 B4 B8 E7 DE 1B 69 E0 51 E2 BB 7B 62 A4
6A 70 BD DA EC 94 E7 1C CA E8 7F 55 76 56 ED F5
75 35 AD 5B 36 55 FA 50 EB 4F 19 55 14 83 18 7C
D5 72 E5 FA 30 CA 5C 4F AB F4 55 BE 9B CD 52 E0
2E CF CC D2 A5 8E BD 8F B6 27 59 1B 0E E1 3F 4B
A2 19 A8 D9 0F 9B 5D 67 60 33 63 A4 19 27 36 51
E8 93 CB CF FF 62 7C D7 F8 2A A6 9E 12 FE FC E1
3A E1 35 DE 8F 65 61 76 86 79 95 09 EF EC 7C 32
BC E7 B4 56 3A 9F 0A C8 2C D1 B2 71 0C FE EA CC
30 F0 CE 06 79 FC 64 01 FE A9 9D 32 06 83 90 1A
34 DD 78 C9 AF CC C4 1C 36 C2 19 31 56 67 48 C6
39 80 ED C8 8D 7B 3C DD 47 8F 5A A8 7F CB 92 C9
F4 9E 60 94 4D DE 73 A1 CB 8C 7B C9 01 F6 22 53
ED A7 F8 5D 55 6B AD 3D 56 7B F1 CF 65 C3 77 71
3C B3 60 AE D2 AD 42 7B F5 90 A4 9D F0 8E BC 17
5C 5C DA 08 EF FA 72 B2 F6 1E CB 2C 4A BC 40 FE
09 9E EB FD 7F 02 ED 54 D9 CF AA FB BD DD D3 79
65 02 CD 56 35 A5 74 B0 BF 0E 21 ED 48 16 A3 C3
0E 4E EF A7 B9 DC 09 0D 46 2E 6E AB 02 A2 C0 58
2E 89 70 A9 49 E3 52 DA 51 8B 5A 85 94 D9 2A C5
97 AA 28 7E B4 FB 84 16 B3 5F 16 FA E3 FD AD 5D
0D C2 3F 72 F5 B7 31 B5 E7 9E 70 3E 75 B8 44 DA
3F BA BE CE AA 05 86 50 F6 5F BF B4 9F 01 D6 77
19 52 AD 88 3A E3 FA 0D CE E5 CE 07 14 A5 7D FB
EF 11 F8 1B ED 37 75 77 86 DA 87 FE B3 CF CE 27
72 2B CF 09 13 33 98 2C AD 1B 52 79 8E 55 AE 32
B2 AD EB 33 A1 F4 CA D0 BE 1C 81 D1 B5 48 43 94
18 0B 5D FB D4 B5 9B D7 A0 F8 98 6A B8 8F C1 35
3E E6 DE 69 44 E7 92 52 9C BF 93 CF 9E 9D 34 64
C8 55 19 A6 B4 A0 55 66 ED 54 D0 67 2C 1B B5 0E
78 15 DE EB 9F 2D 1D E7 FC D2 13 70 E8 6C 12 6A
BE 9F 07 AD 32 EE 54 D8 BB BE 7E 30 53 A4 0B 55
D5 60 6E 1F 19 97 73 5D 6B 51 E1 D0 48 13 FD B6
E4 27 9B A0 02 FF 27 10 64 62 78 20 9E 79 F5 73
B6 6D 56 8B BE B5 7C ED 9E 8B 1A 85 71 93 B4 16
5D 82 9C 3B 4F 91 46 74 71 33 FA 0A 9D 43 FD F3
8C F5 B4 D4 2A C4 B4 22 9B 42 FA 6E 66 5D 6F BF
0E 2A 1A 2F 63 8C 99 DF F9 CF 8E B8 8F 7B F3 50
B1 69 39 AB F7 3C F3 9F AA C5 69 7D 80 3B 1C 86
FB 6B C6 4D 8F D8 0E AB B8 CA 90 94 FD 1D 09 6F
7D 7F E6 19 D4 F3 D6 FD EF 63 03 7D 90 DD D5 DE
86 20 3D 8E A1 F8 77 DC DD FF 08 5B 84 27 E1 68
CA 0E E9 38 47 BD 6F CA 84 33 6F CC A7 FF A1 67
A7 80 0A 41 1E 32 AE EE DE 89 75 54 A2 53 FD 15
B6 B3 51 83 67 D6 B3 7F C7 6E 7D 72 34 4A 01 EA
8F 14 E4 C5 62 5A D8 E7 CD E7 97 1B 39 CA E8 DF
A8 96 D6 85 F5 4B A7 37 43 86 F0 13 37 34 1A B0
F6 1A 8A 07 12 04 B4 6D 93 FB 74 CF 5C D1 2C B4
5A CA BC 4F B2 3C E1 E7 3C 55 14 6C AA F5 D2 26
8E 32 1F B6 CD 3C 6E CC F9 DD 84 EB E2 6E 1E A9
93 57 53 A4 3C 3E 28 D0 AB 70 16 3F 9A B5 B6 71
38 0D 75 B5 67 CF C6 BD EB D5 65 EE 93 BC E0 35
3D F1 06 FD 7A EF A5 6F AC 54 EA DE BA 0F F8 CC
64 8D 33 5D DB C5 3B ED 2E 06 8D 71 95 90 BA 7A
BB 9A 5F 68 3E BB A2 FE 5E B0 29 4E BD 09 C2 5C
93 76 FF 27 DD E1 5C F0 15 9F B9 E7 E9 4B 54 9C
14 C0 FE 6F 7D 44 F0 D7 E2 06 DF 83 BD B0 F8 D4
B5 4B E6 21 C5 76 05 D0 43 BB 7F 9A 2A 0A 1C E4
CB 1F 0F 35 D3 DB AD C2 DB FE F3 44 8C 98 B5 F3
79 2A CF 41 1C B2 9B 02 C7 62 90 F7 CD 7A 8D C3
66 A4 A6 11 84 FE B8 78 2D C7 AD 79 7D 17 EE 3E
32 5B 9C F6 9B 46 9F 4A E0 57 3F A6 1B 17 29 94
E3 CB E9 46 7A 81 3A 1A 9F C9 4F E3 F7 B3 5B 1F
AC 97 C9 3D 4E 65 B3 9B AC 94 66 A4 B6 3C FF 26
45 D7 9A 69 40 62 1E 39 7C DD BE C1 D9 D7 36 E4
8C 2D 32 8E C6 03 F4 E7 C5 A9 25 42 DC C1 2C B3
A2 C6 5C 03 00 21 16 60 02 73 77 C4 B0 05 85 6C
0A DA B4 D4 57 C9 40 14 D5 5E 6A 28 42 0C 94 D7
A5 51 3A 0C F4 1E 97 2D 4B DB 3A 2D 06 CA DE 91
C9 C5 C3 5C 90 6E 78 31 29 DA 5F 0B FC 90 D6 35
C4 EB BF EA AF 13 C9 FE 7B 09 CA 7C CF 5F 0F A5
A0 4B 33 90 36 CA 1A 6C 05 C7 03 FD A6 5E 18 45
A0 A8 E5 FF 9D DD 2E FF 21 5C DB 9B A3 50 74 9A
96 11 A4 E3 7E E4 E5 84 83 2A 19 B4 8E 6B EB 07
1E 09 9F D4 A0 A0 66 83 33 F5 D1 67 58 0B 05 4D
0A 7A BA 70 35 A3 2C 70 C1 FD C6 CC 1C EC
用UltraEdit打开test.264看看,发现上面结果与实际码流结果完全一样,只不过在test.264中是二进制流,在myData.txt中是test.264二进制流的十六进制对应的字符.
由上面的结果便可以找到并确认JM8.6(采用annexb而非rtp)中写码流的地方了(上面说过的五处).