我正在尝试将单通道WAV文件导出为2通道WAV文件(基本上与原始通道重复);但是,添加numChannels = channels
后,我的程序正在执行这种奇怪的行为。我不知道为什么它会像这样。我还尝试使用&
,*
和按位操作修改该行,但它仍会导致那些奇怪的输出。我的唯一领导[从几个小时前开始]是上面有问题的一行。
免责声明:抱歉,我不知道如何在不显示整个来源的情况下解释问题。我做了尝试把它全部放在这里,但我认为这会更简洁(我在这里结束了)。这是包含有问题的行的源代码的link。包含该行的代码段位于输出之下。
Without numChannels = channels
5249 4646 f052 0200 5741 5645 666d 7420
1000 0000 0100 0100 112b 0000 112b 0000
0100 0800 6461 7461 cb52 0200 8080 8080
8080 8080 8180 8080 8080 8080 8080 8080
8080 8080 8080 8080 8080 8180 8180 8180
8180 8180 8180 8180 8180 8180 8180 8180
8180 8180 8180 8180 8180 8180 8180 8180
8180 8180 8180 8180 8180 8180 8180 8180
With numChannels = channels
5249 4646 f052 0200 5741 5645 666d 7420
1000 0000 0100 0200 112b 0000 2256 0000
0200 0800 6461 7461 94a5 0400 8080 8080
8080 8080 8080 8080 8080 8080 8181 8080
8080 8080 8080 8080 8080 8080 8080 8080
8080 8080 8080 8080 8080 8080 8080 8080
8080 8080 8080 8080 8181 8080 8181 8080
8181 8080 8181 8080 8181 8080 8181 8080
8181 8080 8181 8080 8181 8080 8181 8080
8181 8080 8181 8080 8181 8080 8181 8080
8181 8080 8181 8080 8181 8080 8181 8080
8181 8080 8181 8080 8181 8080 8181 8080
8181 8080 8181 8080 8181 8080 8181 8080
伪代码
代码段
// FILE * audio;
// uint16_t numChannels;
// audio = fopen("11k8bitpcm.wav", "rb");
// fread(...);
// fread(&numChannels, sizeof(uint16_t), 1, );
bool WAVFile::changeNumChannels(uint16_t channels) {
if(numChannels == channels) return false;
else if(numChannels < channels) {
audioData8.insert(audioData8.end(), channels - numChannels, vector<uint8_t>());
for(uint16_t i = numChannels; i < channels; i++)
audioData8.at(i) = audioData8.at(i - numChannels);
}
numChannels = channels;
byteRate = channels * sampleRate * (bitsPerSample/8);
blockAlign = channels * (bitsPerSample/8);
uint32_t numSamples = subchunk2Size / (channels * (bitsPerSample/8));
subchunk2Size = blockAlign * numSamples * (channels * (bitsPerSample/8));
return true;
}