- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个程序,该程序呈现波形类型(正弦波、方波、波齿波等)并将其写入文件。问题是声音播放器说标题丢失,即使我写了它。数据类型应该以小尾数法编写。
我尝试用不同的方式多次重写I/O函数,但没有成功。我尝试用要用测试数据写入的数据填充数组,但即使这样也不起作用。文件写入时出现问题。
主要功能:
int main (int argc, char** argv){
if (argc != 6){
printf("Error: expecting more arguments\n");
return -1;
}
//First argument: voice
int voice = atof(argv[1]);
//Second argument: frequency
float frequency = atof(argv[2]);
//Third argument: amplitude
float amplitude = atof(argv[3]);
//Fourth argument: numsample
int numsamples = atof(argv[4]);
//Fifth argument: output file name
char* filename = argv[5];
int16_t buffer[numsamples*2];
memset(buffer, 0.1, numsamples*2);
if (check_args(voice, frequency, amplitude) != 0) {
//Sine wave
if (voice == 0) {
//render_sine_wave_stero(buffer, numsamples, frequency, amplitude);
}
//If square wave
else if (voice == 1){
//render_square_wave_stereo(buffer, numsamples, frequency, amplitude);
}
//Sawtooth
else if (voice == 2) {
//render_sawtooth_wave_stero(buffer, numsamples, frequency, amplitude);
}
FILE *outputfile = fopen(filename, "wb+");
if (outputfile == NULL){
printf("Error: file failed to open");
return 1;
}
write_wave_header(outputfile, numsamples);
write_s16_buf(outputfile, buffer, numsamples*2);
fclose(outputfile);
printf("Finished\n");
header 写入功能:
#define PI 3.14159265358979323846
#define SAMPLES_PER_SECOND 44100u
#define NUM_CHANNELS 2u
#define BITS_PER_SAMPLE 16u
void write_wave_header(FILE *out, unsigned num_samples) {
/*
* See: http://soundfile.sapp.org/doc/WaveFormat/
*/
uint32_t ChunkSize, Subchunk1Size, Subchunk2Size;
uint16_t NumChannels = NUM_CHANNELS;
uint32_t ByteRate = SAMPLES_PER_SECOND * NumChannels * (BITS_PER_SAMPLE/8u);
uint16_t BlockAlign = NumChannels * (BITS_PER_SAMPLE/8u);
/* Subchunk2Size is the total amount of sample data */
Subchunk2Size = num_samples * NumChannels * (BITS_PER_SAMPLE/8u);
Subchunk1Size = 16u;
ChunkSize = 4u + (8u + Subchunk1Size) + (8u + Subchunk2Size);
/* Write the RIFF chunk descriptor */
write_bytes(out, "RIFF", 4u);
write_u32(out, ChunkSize);
write_bytes(out, "WAVE", 4u);
/* Write the "fmt " sub-chunk */
write_bytes(out, "fmt ", 4u); /* Subchunk1ID */
write_u32(out, Subchunk1Size);
write_u16(out, 1u); /* PCM format */
write_u16(out, NumChannels);
write_u32(out, SAMPLES_PER_SECOND); /* SampleRate */
write_u32(out, ByteRate);
write_u16(out, BlockAlign);
write_u16(out, BITS_PER_SAMPLE);
/* Write the beginning of the "data" sub-chunk, but not the actual data */
write_bytes(out, "data", 4); /* Subchunk2ID */
write_u32(out, Subchunk2Size);
}
IO功能:
void write_byte(FILE* out, char val){
fwrite(&val, sizeof(char), 1, out);
}
void write_bytes(FILE* out, const char data[], unsigned n){
for (unsigned i=0; i<n; i++){
write_byte(out, data[n]);
}
}
void write_u16(FILE* out, uint16_t value){
char bytes[] = {0, 0};
//Lowest byte
bytes[0] = value & 0xFF;
//Biggest byte
bytes[1] = value>>8;
write_bytes(out, bytes, 2u);
//fwrite(&value, sizeof(uint16_t), 1, out);
}
void write_u32(FILE* out, uint32_t value){
uint16_t first = value & 0x0000FFFF;
uint16_t second = value >> 16;;
write_u16(out, first);
write_u16(out, second);
//fwrite(&value, sizeof(uint32_t), 1, out);
}
void write_s16(FILE* out, int16_t value){
uint16_t newV = (uint16_t)value;
write_u16(out, newV);
//fwrite(&value, sizeof(int16_t), 1, out);
}
void write_s16_buf(FILE* out, const int16_t buf[], unsigned n){
for (unsigned i=0; i<n; i++){
write_s16(out, buf[n]);
}
}
我希望声音播放器可以读取通过调用 ./render_tone 1 100 0.1 44100 out.wav 生成的文件,但 out.wav 会导致错误,指出读取时缺少 header 。
最佳答案
您的 write_bytes()
函数中有一个拼写错误(我假设):
void write_bytes(FILE* out, const char data[], unsigned n){
for (unsigned i=0; i<n; i++){
write_byte(out, data[n]);
}
}
您应该使用data[i]
而不是data[n]
。现在如果您调用:
write_bytes(out, "RIFF", 4u);
它将写入 \0
字符(NUL 终止 c 字符串)4 次。
关于c - 声音播放器无法读取我的程序生成的 WAV 文件,提示缺少 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58357678/
如果已知该确切样本存在于 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.
我是一名优秀的程序员,十分优秀!