大佬教程收集整理的这篇文章主要介绍了c – 将16位立体声转换为16位单声道声音,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
if( bitsPerSample == 8 ) { dataSize /= 2; openALFormat = AL_FORMAT_MONO8; for( SizeType i = 0; i < dataSize; i++ ) { PDAta[ i ] = static_cast<Uint8>( ( static_cast<Uint16>( PDAta[ i * 2 ] ) + static_cast<Uint16>( PDAta[ i * 2 + 1 ] ) ) / 2 ); }
但是,现在我试图用16位音频做同样的事情,但我无法让它工作.我只能听到某种奇怪的声音.我试图将“monoSample”设置为“left”(Uint16 monoSample = left;),来自该频道的音频数据效果非常好.正确的渠道.谁能看到我做错了什么?
这是代码(PDAta是一个字节数组):
if( bitsPerSample == 16 ) { dataSize /= 2; openALFormat = AL_FORMAT_MONO16; for( SizeType i = 0; i < dataSize / 2; i++ ) { Uint16 left = static_cast<Uint16>( PDAta[ i * 4 ] ) | ( static_cast<Uint16>( PDAta[ i * 4 + 1 ] ) << 8 ); Uint16 right = static_cast<Uint16>( PDAta[ i * 4 + 2 ] ) | ( static_cast<Uint16>( PDAta[ i * 4 + 3 ] ) << 8 ); Uint16 monoSample = static_cast<Uint16>( ( static_cast<Uint32>( left ) + static_cast<Uint32>( right ) ) / 2 ); // Set the new mono sample. PDAta[ i * 2 ] = static_cast<Uint8>( monoSample ); PDAta[ i * 2 + 1 ] = static_cast<Uint8>( monoSample >> 8 ); } }
unsigned size = header.data_size; char *data = new char[size]; // Read the contents of the WAV file in to data for (unsigned i = 0; i < size; i += 4) { short left = *(short *)&data[i]; short right = *(short *)&data[i + 2]; short monoSample = (int(left) + right) / 2; }
此外,虽然8位WAV文件是无符号的,但是16位WAV文件是有符号的.要对它们进行平均,请确保将其存储在适当大小的签名类型中.请注意,其中一个示例暂时提升为int以防止溢出.
正如Stix在下面的评论中指出的那样,简单平均可能无法获得最佳结果.你的旅费可能会改变.
此外,Greg Hewgill正确地指出,这假设机器是小端的.
以上是大佬教程为你收集整理的c – 将16位立体声转换为16位单声道声音全部内容,希望文章能够帮你解决c – 将16位立体声转换为16位单声道声音所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。