- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在编写一些代码来使用 PortAudio 和 sndfile 在 C++ 中播放立体声 .wav 文件,但是输出声音是模糊的并且向下倾斜(向下倾斜对我来说不是问题,但它可能是问题的一部分) .看起来它似乎在播放部分垃圾数据,但我不相信我正在使用任何变量,这可能会发生在我没有先清除数据的情况下。我尝试过一些带有立体声播放的 PortAudios 示例,但由于输入来自 .wav 文件而不是生成的,我无法完美地遵循它。我还编译并运行了一些 PortAudio 示例(使用立体声)并且工作正常。我不确定问题出在哪里。
音频.h
struct AudioFile {
SNDFILE* file = nullptr;
SF_INFO info;
int buffer_size = 512;
int readHead = 0;
sf_count_t count = 1;
};
/*
Class for handling basic audio functions
*/
class Audio {
protected:
public:
/// Constructor
Audio();
/// Destructor
~Audio();
/// Load an audio file
AudioFile loadFile(const char* path);
/// Play an audio file
void playFile(AudioFile* file);
};
/// Audio constructor
Audio::Audio() {
PaError err = Pa_Initialize();
if (err != paNoError) std::cerr << "PAError: " << err << std::endl;
#ifdef DEBUG
std::cout << "Initialising PortAudio" << std::endl;
std::cout << "----------------------" << std::endl;
std::cout << "Version: " << Pa_GetVersion << std::endl;
std::cout << "Devices:" << std::endl;
std::cout << "----------------------" << std::endl;
int numDevices = Pa_GetDeviceCount();
for (int i=0; i < numDevices; i++) {
auto deviceInfo = Pa_GetDeviceInfo(i);
std::cout << "Name: " << deviceInfo->name << std::endl;
std::cout << "HostApi: " << deviceInfo->hostApi << std::endl;
std::cout << "SampleRate: " << deviceInfo->defaultSampleRate << std::endl;
std::cout << "InputChannels: " << deviceInfo->maxInputChannels << std::endl;
std::cout << "OutputChannels: " << deviceInfo->maxOutputChannels << std::endl;
std::cout << "----------------------" << std::endl;
}
#endif
}
Audio::~Audio() {
PaError err = Pa_Terminate();
if (err != paNoError) std::cerr << "PAError: " << err << std::endl;
}
/* Loads an audiofile */
AudioFile Audio::loadFile(const char* path) {
AudioFile file;
::memset(&file.info, 0, sizeof(file.info));
file.file = sf_open(path, SFM_READ, &file.info);
return file;
}
static int patestCallback(const void* inputBuffer, void* outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags, void* userData) {
/// Prevent warnings
(void)inputBuffer;
(void)timeInfo;
(void)statusFlags;
/// an AudioFile gets passed as userData
AudioFile* file = (AudioFile*)userData;
float* out = (float*)outputBuffer;
sf_seek(file->file, file->readHead, SF_SEEK_SET);
auto data = std::make_unique<float[]>(framesPerBuffer);
file->count = sf_read_float(file->file, data.get(), framesPerBuffer);
for (int i = 0; i < framesPerBuffer; i++) {
*out++ = data[i];
}
file->readHead += file->buffer_size;
if (file->count > 0) return paContinue;
else return paComplete;
}
void Audio::playFile(AudioFile* file) {
PaStream* stream = nullptr;
PaStreamParameters params;
params.device = Pa_GetDefaultOutputDevice();
params.channelCount = file->info.channels;
params.sampleFormat = paFloat32;
params.suggestedLatency =
Pa_GetDeviceInfo(params.device)->defaultLowOutputLatency;
params.hostApiSpecificStreamInfo = nullptr;
/// Check if params work
PaError err = Pa_IsFormatSupported(nullptr, ¶ms, file->info.samplerate);
if (err != paFormatIsSupported) {
std::cerr << "PAError: " << Pa_GetErrorText(err) << std::endl;
return;
}
err = Pa_OpenStream(&stream, nullptr, ¶ms, file->info.samplerate,
file->buffer_size * params.channelCount, paClipOff,
&patestCallback, file);
if (err != paNoError) std::cerr << "PAError: " << Pa_GetErrorText(err) << std::endl;
err = Pa_StartStream(stream);
if (err != paNoError)
std::cerr << "PAError: " << Pa_GetErrorText(err) << std::endl;
/// wait until file finishes playing
while (file->count > 0) {}
err = Pa_StopStream(stream);
if (err != paNoError)
std::cerr << "PAError: " << Pa_GetErrorText(err) << std::endl;
err = Pa_CloseStream(stream);
if (err != paNoError)
std::cerr << "PAError: " << Pa_GetErrorText(err) << std::endl;
}
data
指针(使用它似乎会产生更清晰但仍然模糊的声音)并将音频文件按值传递到
playFile
功能。任何帮助表示赞赏。
最佳答案
最终弄清楚了,我有一个主要问题,在这里:
err = Pa_OpenStream(&stream, nullptr, ¶ms, file->info.samplerate,
file->buffer_size * params.channelCount, paClipOff,
&patestCallback, file);
static int patestCallback(const void* inputBuffer, void* outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags, void* userData) {
/// Prevent warnings
(void)inputBuffer;
(void)timeInfo;
(void)statusFlags;
/// an AudioFile gets passed as userData
velox::AudioFile* file = (velox::AudioFile*)userData;
float* out = (float*)outputBuffer;
sf_seek(file->file, file->readHead, SF_SEEK_SET);
auto data = std::make_unique<float[]>(framesPerBuffer * file->info.channels);
file->count = sf_read_float(file->file, data.get(),
framesPerBuffer * file->info.channels);
for (int i = 0; i < framesPerBuffer * file->info.channels; i++) {
*out++ = data[i];
}
file->readHead += file->buffer_size;
if (file->count > 0) return paContinue;
else return paComplete;
}
关于c++ - 使用 PortAudio 和 sndfile 播放立体声 .wav 文件,输出模糊且变慢/变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61721531/
如果已知该确切样本存在于 wav 中的某处(但可能与其他声音混合),是否可以使用 FFT 找到较长 wav 中出现的小 wav 样本? 编辑 (收到两个回复后):如果我有一个包含所有已知声音的库,这些
我对 .NET 中的音频完全陌生,所以请多多包涵。 我的目标是创建一个具有两个 channel 的 wav 文件。左声道将包含语音消息(使用 SpeechSynthesizer 生成的流),右声道需要
我的大部分信息都来自其他stackoverflow帖子,但没有一个真正有用。 import UIKit import AVFoundation class FaceButtonSc
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
这可能是一个非常简单的问题;我将一个单声道 WAV 文件转换为一个 short[] 数组,并且我有一个将其写回 WAV 文件的函数。一切正常。 (writeBuffer 是 short[] 数组) b
我们的应用程序需要知道它加载的音频文件的样本数。我们使用的库可以可靠地确定采样率,但不能确定样本数。我们是否可以仅从文件大小和采样率来计算样本数? 最佳答案 马克说什么。不,通常您需要解释标题。但是,
我正在用java做一个项目,需要我加密wave文件。那么,是否有一个直接的过程可以将波形文件转换为二进制文件并返回?我将对二进制数据应用加密算法。 最佳答案 是的。 File file = new F
我想知道如何从 .wav 文件中获取样本以执行两个 .wav 文件的窗口连接。 谁能告诉我怎么做? 最佳答案 wave标准库的模块是关键:当然在代码顶部的 import wave 之后,wave.op
我有一个几分钟长的 .wav 文件,我想将其分成不同的 10 秒 .wav 文件。 到目前为止,这是我的 python 代码: import wave import math def main(fil
我在 ffmpeg 中使用以下命令合并多个 wav 文件: -f concat -safe 0 -i /storage/emulated/0/AudioClipsForSpeakerRecogniti
我正在尝试用python实现主动降噪。我的项目由两组代码组成: 录音代码 声音过滤代码 我的目标是当您运行该程序时,它将开始通过麦克风录音。录音完成后,会生成一个名为“file1.wav”的保存文件,
我正在尝试制作一个音乐识别系统。我担心我可能没有按照预期读取 wav 样本,而且我可能会应用错误的窗口大小来进行 FFT 和其他操作。 如果你能帮我的话,那就太好了。 首先,我有一些关于 Wavs 中
如何使用 java 合并两个 wav 文件? 我试过了 this但它没有正常工作,他们还有其他方法吗? 最佳答案 如果您直接处理 wav 文件的字节,您可以在任何编程语言中使用相同的策略。对于此示例,
尝试为我的 previous question 找到解决方法,我想将用 byte[](具有 wav header )编写的 16k 8 位单声道 wav 转换为 8k 8 位单声道流/字节 []。 是
目前我正在使用一个语音到文本的翻译模型,该模型采用 .wav 文件并将音频中的可听语音转换为文本转录本。该模型之前曾用于直接录制的 .wav 音频录音。但是现在我正在尝试对视频中最初出现的音频做同样的
试图在 python 中将 wav 文件转换为 wav uLaw。 使用 pydub 的 AudioSegment,我可以使用以下命令转换为 mp3: AudioSegment.from_wav(fr
我在 xcode 项目中添加了 LibFlac。然后我在我的项目中添加了来自 Libflac 的decode/main.c。我通过了 infile.flac 并运行了项目的可执行文件,但它给出了以下错
大家好,感谢您的阅读。 我想使用 Python 的 scipy.io.wavfile 对一首歌进行一些分析。由于我只有 .mp3 格式的歌曲,因此我使用 ffmpeg 将文件转换为 .wav,方法如下
我需要连接两个音频波,以便最终输出的音频波应该有一个更平滑的交汇点。我的意思是,在连接点,假设 10 秒钟,第一个音频应该开始淡出,而另一个音频开始拾取。 我已经能够连接两个音频文件并生成单个输出,但
我需要将一个 wav 文件转换为 8000Hz 16 位单声道 Wav。我已经有一个代码,它适用于 NAudio 库,但我想使用 MemoryStream 而不是临时文件。 using System.
我是一名优秀的程序员,十分优秀!