- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我一直在尝试使用 RtAudio 和 libsndfile。
任务看起来很简单:
1.) 使用 libsndfile 将一些样本读入缓冲区(使用 SndfileHandle 类和 readf())
2.) 使用 RtAudio 播放样本
但是,出于某种原因,我得到的只是噪音和大量失真……我尝试将样本读取为 16 位 PCM(使用短缓冲区),并使用 RTAUDIO_SINT16 格式进行播放。没有成功......事实上,我尝试了很多不同的组合,但只有噪音......
我最接近实际播放的是使用 int16_t 作为缓冲区和 RTAUDIO_SINT16。看起来合乎逻辑,对吧?无论如何,它仍然像使用 bitcrusher 一样。尝试了 JACK 和 ALSA,以及缓冲区大小的许多不同组合,但无济于事......
关于如何结合这两者的任何提示?
我使用静态缓冲区会不会有问题(只是为了实验,当然不会在最终产品中这样做......)?
最佳答案
好的,在这里回答我自己的问题,这只是一些参数之间的混淆,主要是帧和样本......而样本只是单个样本,帧是所有 channel 的样本......
#include <iostream>
#include <sndfile.hh>
#include "RtAudio.h"
/*
* Audio-Wiedergabe mit RtAudio und libsndfile !
*/
// Call
int fplay( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
double streamTime, RtAudioStreamStatus status, void *userData )
{
int16_t *buffer = (int16_t *) outputBuffer;
// ok, i know this is not the best way to do file i/o in the audio thread, but
// this is just for demonstration purposes ...
SndfileHandle *sndfile = reinterpret_cast<SndfileHandle*>(userData);
// Error handling !
if ( status ){
std::cout << "Stream underflow detected!" << std::endl;
}
// 'readf()' liest frames
// 'read()' liest einzelne Samples !
// ACHTUNG! Frames != Samples
// ein Frame = Samples für alle Kanäle
// d.h. |Samples| = Kanäle * Frames !
sndfile->readf(buffer, nBufferFrames);
return 0;
}
int main () {
// Damit das Programm funktioniert, muss eine 16Bit PCM Wave-Datei im
// gleichen Ordner liegen !
const char * fname = "test.wav" ;
// Soundfile-Handle aus der libsndfile-Bibliothek
SndfileHandle file = SndfileHandle (fname) ;
// Alle möglichen Infos über die Audio-Datei ausgeben !
std::cout << "Reading file: " << fname << std::endl;
std::cout << "File format: " << file.format() << std::endl;
std::cout << "PCM 16 BIT: " << (SF_FORMAT_WAV | SF_FORMAT_PCM_16) << std::endl;
std::cout << "Samples in file: " << file.frames() << std::endl;
std::cout << "Samplerate " << file.samplerate() << std::endl;
std::cout << "Channels: " << file.channels() << std::endl;
// Die RtAudio-Klasse ist gleichermassen dac und adc, wird hier aber nur als dac verwendet !
RtAudio dac;
if ( dac.getDeviceCount() < 1 ) {
std::cout << "\nNo audio devices found!\n";
return 0;
}
// Output params ...
RtAudio::StreamParameters parameters;
parameters.deviceId = dac.getDefaultOutputDevice();
parameters.nChannels = 2;
parameters.firstChannel = 0;
unsigned int sampleRate = 44100;
// ACHTUNG! Frames != Samples
// ein Frame = Samples für alle Kanäle
// d.h. |Samples| = Kanäle*Frames !
unsigned int bufferFrames = 1024;
try {
dac.openStream( ¶meters, NULL, RTAUDIO_SINT16,
sampleRate, &bufferFrames, &fplay, (void *)&file);
dac.startStream();
}
catch ( RtAudioError& e ) {
e.printMessage();
return 0;
}
char input;
std::cout << "\nPlaying ... press <enter> to quit.\n";
std::cin.get( input );
try {
// Stop the stream
dac.stopStream();
}
catch (RtAudioError& e) {
e.printMessage();
}
if ( dac.isStreamOpen() ) dac.closeStream();
return 0 ;
}
关于c++ - 结合 libsndfile 和 RtAudio?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34135031/
作为我学习 C++ 的一部分,我正在自学如何将 wav 文件读入 C++。我在网上找到了很多推荐以下库的资源:libsnfile library因此,我按照下面的一些教程来测试该库的基本功能,但我无法
作为我学习 C++ 的一部分,我正在自学如何将 wav 文件读入 C++。我在网上找到了许多推荐以下库的资源:libsnfile library所以我按照下面的一些教程测试了库的基本功能,但是我无法让
我正在编写一个处理音频文件的软件。我正在使用 libsndfile 库来读取 wave 文件数据,我遇到了一个他们的文档没有解决的疑问:读取项目的函数和读取帧的函数有什么区别?或者,换句话说,如果我交
Cmake 似乎没有找到 lib libsndfile。但是,它安装在我的机器上。 find_library(sndfile REQUIRED) 并安装: yum list installed | g
我正在使用 libsndfile 做一些简单的程序,目前正在尝试找到一种在音频文件中打印静音的方法 - 除了将另一个文件静音之外。表面上,我正在制作一台鼓机。在给定时刻,我只能写入输入音频文件的长度,
现在我在 iOS 上尝试使用 libsndfile 时遇到了一个奇怪的链接问题: 我已经在 MACOSX 10.6.8 上编译了 libsndfile 并通过了所有检查。但是当我将它添加到 Xcode
我正在尝试使用 MinGW 在 Windows 7 机器上用 C 语言编译程序。现在我不得不承认,我一开始并没有太多的 C 经验,而且我不是一个非常熟练的 Windows 用户,这使情况更加复杂。 程
我使用 libsndfile 和 wasapi 创建了一个应用程序,它允许使用 QSlider 使用光标手动缓慢播放音频文件。 我看到 libsndfile 使用帧,我想知道如何获取此音频文件的持续时
目前,我已经根据可用的“libsndfile”示例代码编写了一个程序(在 Visual Studio C++ 中),其中我刚刚添加了一个减法函数,用于将一个( channel )WAV 文件与另一个相
我正在尝试开发一个简单的c应用程序,它可以在wav文件中给定时间戳的特定频率范围内给出0-100之间的值。 示例:我的频率范围为44.1kHz(典型的MP3文件),我想将该范围拆分为n个范围(从0开始
我正在尝试生成一个正弦波,它以 1 秒的间隔在立体声 wav 文件的左右声道之间切换,但我找不到任何方法来写入一个声道,同时保持另一个声道静音。这是我必须写入一个 channel 的代码: for (
我需要帮助开始使用 libsndfile。 我有四个 .wav 文件(都具有相同的采样率)。 我想把前两个连在一起,然后再把下两个连在一起, 然后将生成的 2 个 .wav 文件混合为一个。 最佳答案
我正在制作一个程序,从麦克风录音,然后使用 libsndfile 将其编码为 OGG 文件。 大约一个月前,我制作了这个程序的控制台版本,只是为了确保录制和编码功能良好。现在,当我开始将此程序作为窗口
我使用 libsndfile 库打开了 wav 文件,想要读取该文件并获取 FFT 中的 N 个点,并获取时域样本并计算 FFT。 有什么想法可以用 libsndfile 库中的函数替换 fscanf
因此,我一直在尝试使用 RtAudio 和 libsndfile。 任务看起来很简单: 1.) 使用 libsndfile 将一些样本读入缓冲区(使用 SndfileHandle 类和 readf()
谁能告诉我 portaudio 回调函数变量 framesperbuffer 是什么?如果我想通过 PA_WriteStream() 每次迭代以 64 字节数据播放音频流,那么我应该在 framesp
我正在尝试交叉编译 libsndfile 以便在具有 flac 功能的 intel edison 上使用。我已经成功地将 FLAC、OGG 和 VORBIS 编译到我的交叉工具链中,但是当我运行 ./
我正在尝试安装“libsndfile-dev”。我执行以下操作: sudo apt-get install libsndfile-dev 结果我得到以下内容: Reading package list
我刚从 Windows 切换到 Mac,我正尝试使用 brew 为我的一个 C 项目安装 libsndfile。但是安装之后还是在终端报错找不到,我好像也想不通是什么原因。 brew 安装 libsn
我刚从 Windows 切换到 Mac,我正尝试使用 brew 为我的一个 C 项目安装 libsndfile。但是安装之后还是在终端报错找不到,我好像也想不通是什么原因。 brew 安装 libsn
我是一名优秀的程序员,十分优秀!