2014-10-20 4 views
0

2 개의 샘플 프로그램이 있습니다. 하나는 WAV를 MP3로 변환합니다. 다른 하나는 내 연사를 포착하고 WAV 파일을 씁니다. 나는 2 : 입력 스피커, 출력 MP3를 결합하려고합니다.BYTE *에서 int C++ 로의 유형 변환

short int pcm_buffer[PCM_SIZE*2]; 
    unsigned char mp3_buffer[MP3_SIZE]; 
    read = fread(pcm_buffer, 2 * sizeof(short int), PCM_SIZE, pcm); 
    write=lame_encode_buffer_interleaved(gfp, pcm_buffer, read, mp3_buffer, MP3_SIZE); 
    size_t lBytesWritten = fwrite(mp3_buffer, write, sizeof(char), mp3); 

실무 인코딩 : 내 결과가 올바른 길이의 MP3 파일로 MP3로 근로 변환 소스에 WAV를 (그래서 나는 정수의 정확한 숫자를 통과) 만 소음 (그래서 내가 잘못된 데이터를 전달) 에 WAV에 있습니다

BYTE *pData; 
    hr = pAudioCaptureClient->GetBuffer(&pData, &nNumFramesToRead, &dwFlags, NULL, NULL); 
    LONG lBytesToWrite = nNumFramesToRead * nBlockAlign; 
    mmioWrite(hFile, reinterpret_cast<PCHAR>(pData), lBytesToWrite); 

내 버전은 다음과 같습니다

BYTE *pData; 
    unsigned char mp3_buffer[MP3_SIZE]; 
    hr = pAudioCaptureClient->GetBuffer(&pData, &nNumFramesToRead, &dwFlags, NULL, NULL); 
    LONG lBytesToMP3=lame_encode_buffer_interleaved(gfp, reinterpret_cast<short int*>(pData), nNumFramesToRead, mp3_buffer, MP3_SIZE); 
    fwrite(mp3_buffer, lBytesToMP3, sizeof(char), mp3); 

I 오류가 표시되지 않습니다. Borland C++에서 약 10 년 전까지 C++를 코딩했고, 이제는 Microsoft가 무능한 프로그래머로부터 세상을 보호한다는 것을 알게되었습니다. 그러나 (나는 정말로 유감스럽게 생각한다) 그들이 내가 그것을 올바르게하고 싶어하는 방법을 모르고있다!

답변

0

귀하의 문제는 여기에 있습니다 : 16 비트 사운드 데이터를 수 있도록 설계되어있을 경우 lame_encode_buffer_interleaved 8 비트 사운드 데이터를 전달하는

LONG lBytesToMP3=lame_encode_buffer_interleaved(gfp, reinterpret_cast<short int*>(pData), nNumFramesToRead, mp3_buffer, MP3_SIZE); 

. reinterpret_cast<short int*>(pData)을 통해 데이터를 전송한다는 사실을 분명히해야합니다.

실제로 16 비트 사운드 샘플을 전달해야합니다.

입력에서 16 비트 샘플을 캡처 할 수 있다면 좋습니다. 그렇지 않은 경우 8 비트 샘플을 16 비트 샘플로 쉽게 변환 할 수 있습니다. 당신은 단지 가치를 스케일! 서명이 올바르게 처리되었는지 확인하십시오.

+0

내가 Wav 인코더를 디버깅하는 경우, 그는 mmio에 PCHAR 스트림으로 데이터 BYTE 스트림을 쓰는 것을 볼 수 있습니다. WAV를 MP3 인코더로 디버깅하면 WAV 데이터가 16 비트 (짧은 int) 숫자임을 알 수 있습니다. AudioClient에서 BYTE로 가져 왔고 Lame로 보내야하지만 이번에는 짧은 int 배열로 보내야합니다. 따라서 샘플 (2 개의 프로그램이 올바르게 작동하기 때문에)은 실제로 16 비트 여야합니다. 나는 아마도 엉망이 될 것입니다. & 또는 * 너무 많거나 너무 적습니다. – Martin

+1

많은 시도 끝에 마침내 무슨 일이 일어나는지 알게되었습니다. 그것은 당신의 8 비트입니다. 그것은 나를 더 가까이 보이게했습니다. 사실 그것은 32 비트 플로트입니다. 이것은 16 int로 전달됩니다. 당신은 포인트를 얻지 못 하기엔 너무 가깝습니다! – Martin

+0

굉장합니다. 그것을 알아내는 것에 축하! – StilesCrisis