JM8.6代码中究竟是如何把码流写进test.264文件的?

       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)中写码流的地方了(上面说过的五处).

 

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值