2011-08-23 3 views
2

PCM 오디오 (2 채널, 48kHz, 24 비트)로 엔디안을 바꾸는 프로그램을 만들었지 만 하나의 채널 만 올바르게 바뀌었고 두 번째 엔 여전히 엔디안이 거의 없습니다. CoolEdit 2000에서 출력). 아무도 내 코드에서 잘못된 점을 알려줄 수 있습니까?pcm 오디오의 스왑 엔디안

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; 
} 

감사합니다.

+0

'endian_swap()은 어떻게 구현 되나요? – sharptooth

+0

죄송합니다. – Luke

+1

전에 endian_swap()을 추가하지 않았습니다. 두 버그 (Oli Charlesworth와 mtrw에 언급 됨)의 조합으로 어느 채널도 괜찮아 보입니다. –

답변

2

한 번에 int 파일을 읽는 중입니다. 그러나 int은 아마도 16 비트 또는 32 비트 일 것입니다. 24 비트 오디오가 있다고 가정 해보십시오.

코드를 수정하여 한 번에 char 세 개를 읽고 char [3] 어레이로 읽어야합니다. 그런 다음 swap_endian 함수를 char [3]에서 작동하도록 수정합니다 (배열의 첫 번째 요소와 마지막 요소의 내용을 바꾸기 만하면됩니다.)

+0

그리고 32 비트 정수를 스와핑하는 함수에 해당 값을 전달하면 24 비트 값의 endianess를 바꿀 수 없다는 것을 잊지 마십시오. –

1

short x을 선언했습니다. unsigned int x을 선언 해보십시오.

+0

이것은 실제로 문제입니다. 하지만 주요 문제를 해결하지는 않을 것입니다 (제 답변 참조). –

+0

@Oli - 필자는 파일이 실제로'int'가 아닌'char [3]'이 아니라고 가정했습니다. 대부분의 인터페이스는 24 비트 데이터 비트가 한쪽 끝 또는 다른 쪽 끝으로 이동하여 전체 32 비트 결과를 제공합니다. 이것이 OP의 첫 번째 실험에서 한 채널이 좋아 보인 이유입니다. 파일에 실제로'char [3]'이 들어 있으면 양쪽 채널 모두 엉망으로 보일 것입니다. – mtrw

+0

@mrtw : 파일에'char [3]'이 그대로 있다는 것을 의미하지는 않습니다 만,'int24'를 포함 할 것입니다. 그러나 그들은 C에서 네이티브 타입으로 존재하지 않습니다! –