Поменять местами порядковый номер в pcm audio - PullRequest
2 голосов
/ 23 августа 2011

Я просто запрограммировал обменять порядок байтов в аудио PCM (2 канала, 48 кГц, 24 бита), но только один канал поменялся местами правильно, второй по-прежнему немного Endian (я проверил сгенерированный вывод в CoolEdit 2000),Кто-нибудь может дать мне несколько советов, что не так в моем коде?

inline int endian_swap(unsigned int x)
{
unsigned char c1, c2, c3, c4;

    c1 = x & 255;
    c2 = (x >> 8) & 255;
    c3 = (x >> 16) & 255;
    c4 = (x >> 24) & 255;

    return ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4;
}

int main()
{

FILE *fpIn, *fpOut;
short x;

fpIn = fopen("audio.pcm", "rb");
fpOut = fopen("out.pcm", "wb");
int test = sizeof(short);

int count = 0;
int swaped = 0;

while( fread(&x, sizeof(int), 1, fpIn) == 1 )
    {
    swaped = endian_swap(x);

    fwrite(&swaped, sizeof(int), 1, fpOut);
    }

system("pause");
return 0;
}

С наилучшими пожеланиями!

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

Вы читаете в файле по одному int за раз.Но int может быть 16-битным или 32-битным.Вы говорите, что у вас 24-битный звук.

Вы должны изменить свой код так, чтобы считывать три char за раз, в массив char [3].Затем вы тоже измените свою функцию swap_endian для работы с char [3] (это легко; просто поменяйте местами содержимое первого и последнего элементов массива!)

1 голос
/ 23 августа 2011

Вы объявили short x. Попробуйте объявить unsigned int x.

...