简体   繁体   English

解码RTP G,711 A-法律数据包问题,c#和c ++之间的区别

[英]Decoding RTP G,711 A-Law Packet Problem , difference between c# & c++

first sorry for my English 首先对不起我的英语

by using c# I'm try to decoding RTP A-Law Packet but it is gave me a noise, i checked my code with wireshark code which can gave me the voice without noise , i can not get the difference between wireshark code (c++) and my code (c#) which because I can not Debugging wireshark , but i get the difference Bytes resulting from my code and wireshark code 通过使用C#,我尝试解码RTP A-Law数据包,但它给了我一个噪音,我用wireshark代码检查了我的代码,它可以给我声音而没有噪音,我无法得到wireshark代码之间的区别(c ++)和我的代码(c#),这是因为我无法调试wirehark,但是我得到了我的代码和wireshark代码导致的字节差

i will write the Bytes result from two code and simple of my code and wireshark 我将通过两个代码编写字节结果,并简化我的代码和wireshark

for example : 例如 :

when the alaw_exp_table[data[i]] = -8 当alaw_exp_table [data [i]] = -8时

in my cod the bytes result are : 248 , 255 在我的鳕鱼中,字节结果是:248,255

in wireshark code the bytes result are : 255 , 248 在wireshark代码中,字节结果为:255,248

are you see 248,255 : 255,248 i think it was a reflection but the next example not 您是否看到248,255:255,248,我认为这是一种反映,但下一个示例不是

when the alaw_exp_table[data[i]] = 8 当alaw_exp_table [data [i]] = 8时

in my cod the bytes result are : 8 , 0 在我的鳕鱼中,字节结果是:8,0

in wireshark code the bytes result are : 0 , 0 在Wireshark代码中,字节结果为:0,0

this wireshark 这个wireshark

 int
    decodeG711a(void *input, int inputSizeBytes, void *output, int *outputSizeBytes)

    {

    guint8 *dataIn = (guint8 *)input;

    gint16 *dataOut = (gint16 *)output;


     int i;


    for (i=0; i<inputSizeBytes; i++)

     {

     dataOut[i] = alaw_exp_table[dataIn[i]];

    }

     *outputSizeBytes = inputSizeBytes * 2;

     return 0;

    }

   static  short[] alaw_exp_table= {
      -5504, -5248, -6016, -5760, -4480, -4224, -4992, -4736,
      -7552, -7296, -8064, -7808, -6528, -6272, -7040, -6784,
      -2752, -2624, -3008, -2880, -2240, -2112, -2496, -2368,
      -3776, -3648, -4032, -3904, -3264, -3136, -3520, -3392,
     -22016,-20992,-24064,-23040,-17920,-16896,-19968,-18944,
     -30208,-29184,-32256,-31232,-26112,-25088,-28160,-27136,
     -11008,-10496,-12032,-11520, -8960, -8448, -9984, -9472,
     -15104,-14592,-16128,-15616,-13056,-12544,-14080,-13568,
       -344,  -328,  -376,  -360,  -280,  -264,  -312,  -296,
       -472,  -456,  -504,  -488,  -408,  -392,  -440,  -424,
        -88,   -72,  -120,  -104,   -24,    -8,   -56,   -40,
       -216,  -200,  -248,  -232,  -152,  -136,  -184,  -168,
      -1376, -1312, -1504, -1440, -1120, -1056, -1248, -1184,
      -1888, -1824, -2016, -1952, -1632, -1568, -1760, -1696,
       -688,  -656,  -752,  -720,  -560,  -528,  -624,  -592,
       -944,  -912, -1008,  -976,  -816,  -784,  -880,  -848,
       5504,  5248,  6016,  5760,  4480,  4224,  4992,  4736,
       7552,  7296,  8064,  7808,  6528,  6272,  7040,  6784,
       2752,  2624,  3008,  2880,  2240,  2112,  2496,  2368,
       3776,  3648,  4032,  3904,  3264,  3136,  3520,  3392,
      22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
      30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136,
      11008, 10496, 12032, 11520,  8960,  8448,  9984,  9472,
      15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568,
        344,   328,   376,   360,   280,   264,   312,   296,
        472,   456,   504,   488,   408,   392,   440,   424,
         88,    72,   120,   104,    24,     8,    56,    40,
        216,   200,   248,   232,   152,   136,   184,   168,
       1376,  1312,  1504,  1440,  1120,  1056,  1248,  1184,
       1888,  1824,  2016,  1952,  1632,  1568,  1760,  1696,
        688,   656,   752,   720,   560,   528,   624,   592,
        944,   912,  1008,   976,   816,   784,   880,   848};

and this is my code 这是我的代码

 public static void ALawDecode(byte data, out byte[] decoded)
        {
            int size = data.Length;
            decoded = new byte[size * 2];
            for (int i = 0; i < size; i++)
            {
                 //First byte is the less significant byte
                decoded[2 * i] = (byte)(alaw_exp_table[data[i]] & 0xff);  
                //Second byte is the more significant byte
                decoded[2 * i + 1] = (byte)(alaw_exp_table[data[i]] >> 8);
            }
        }

the alaw_exp_table is same in my code and wireshark code 我的代码和Wireshark代码中的alaw_exp_table相同

please tell me what is the wrong in my code which do that noise ? 请告诉我我的代码有什么问题吗?

thanks in advance 提前致谢

Your are probably handling the endianess incorrectly. 您可能错误地处理了字节序。

Try swapping the the two decoding operations in your C# sample. 尝试交换C#示例中的两个解码操作。 Eg: 例如:

decoded[2 * i + 1] = (byte)(alaw_exp_table[data[i]] & 0xff);  
decoded[2 * i] = (byte)(alaw_exp_table[data[i]] >> 8);

You are decoding eight bit A-law samples into 16 bit signed PCM, so it would make sense for you to use an array of shorts for the output. 您正在将8位A律采样解码为16位带符号PCM,因此对输出使用短裤数组很有意义。 This is close to what the C code is doing. 这接近于C代码正在执行的操作。

If you don't have a particular reason for using a byte array as output, I would suggest just having the A-law lookup table be a short array an just move 16-bit signed values around instead of messing around with byte ordering. 如果您没有使用字节数组作为输出的特殊原因,我建议您将A-law查找表作为一个短数组,只移动16位带符号的值,而不用弄乱字节顺序。

If you really do care about bytes and byte ordering, you need to get the byte ordering right, as @leppie says. 如果您确实关心字节和字节顺序,则需要正确设置字节顺序,如@leppie所说。 This will depend on what you actually do with the output. 这将取决于您对输出实际执行的操作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM