在 libsndfile 中一次写入一个通道
Writing to one channel at a time in libsndfile
我正在尝试生成一个正弦波,该正弦波以 1 秒的间隔在立体声 wav 文件的左右声道之间切换,但我找不到任何方法在保持另一个声道静音的同时写入一个声道。这是我必须写入一个通道的代码:
for (int f = 0; f < numFrames; f++) {
double time = f * duration / numFrames;
buffer[f] = sin(2.0 * pi * time * freq);
以下是我发现的一些代码,可用于将两个单声道 wav 文件混合在一起:
short* mixdown = new short[2 * sizeof(short) * 800000];
for (int t = 0; t < 800000 * 2; ++t) {
mixdown[t] = (buffer1[t] + buffer2[t]) / 2;
}
FILE* process2 = _popen("ffmpeg -y -f s16le -acodec pcm_s16le -ar 44100 -ac 2 -i - -f vob -ac 2 D:\audioMixdown.wav", "wb");
fwrite(mixdown, 2 * sizeof(short) * 800000, 1, process2);
我已经浏览了 libsndfile API http://www.mega-nerd.com/libsndfile/api.html 但找不到任何关于写入通道的内容。如果有人有任何想法,最好的方法是什么,我很想听听你的意见。
您只需将零个样本写入"静音"通道即可实现此目的,例如(使右侧通道静音(:
for (int f = 0; f < numFrames; f++)
{
double time = f * duration / numFrames;
buffer[f * 2] = sin(2.0 * pi * time * freq);
buffer[f * 2 + 1] = 0;
}
这假设libsndfile
期望交错格式的通道数据(我相信这是真的,但不确定(。
假设通道在缓冲区中交错,请执行以下操作:
for (int f = 0; f < numFrames; f+=2) {
...
int odd = seconds % 2;
buffer[f+odd] = sin(2.0 * pi * time * freq);
buffer[f+1-odd] = 0.0;
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 在 libsndfile 中一次写入一个通道
- 将一个通道数据复制到OpenCV中的另一个通道
- 根据OPENCV中一个通道中的一个值,查找最大颜色像素
- 在标头中定义 cv::Mat 后跟另一个 Mat 可避免多个通道
- 强制无线网卡只扫描一个通道(以程序方式)
- 将一个音频通道静音
- Gstreamer选择一个通道并转换为单声道(去交错)
- 如何解除对RenderTarget纹理的绑定,这样它就可以被用作下一个通道的输入
- 我怎样才能把一个三通道矩阵变成一个汇总的一通道矩阵呢?
- 在gcc 5.1.0中注册一个GIMPLE通道