我想编写一个Java程序将wav文件拆分为多个通道。输入将是一个wav文件,而输出将是与通道数量一样多的wav文件。我可以用Java读取wav文件,但是如何将其拆分为通道?
我想创建一个程序,将一些音乐文件从wav转换为mp3.WAV应该是原始比特流并且阅读它不应该是一个大问题,但我甚至不知道从哪里开始学习如何将原始流编码为mp3.我已经阅读了如何构建mp3帧的标题,但我想知道音乐数据是如何存储的.因为我对这些东西很新,一些全面的参考或教程会很棒(也欢迎书籍).
我想指出现有的库和编解码器的使用不是一个选项,所以我需要深入了解基础并为自己做.如果您自己提供代码,我更喜欢c/c ++,但我也可以通过其他语言阅读.
我有一个工具,逐帧比较两个音频wav文件,并返回一个等级,给出两个文件之间的相似程度.
我有一个原始的wav文件和wav文件的录音,因为这两个文件几乎相似我应该得到高分相似,但我得分很差,主要是由于录制文件领先一点点延迟框架不匹配
我的问题是 - 如何使用MATLAB精确对齐两个音频文件,以便可以进行有效的帧到帧比较.
我现在尝试使用delphi读取.wav文件,这里是我的代码:
type
TWaveHeader = packed record
Marker_RIFF: array [0..3] of char;
ChunkSize: cardinal;
Marker_WAVE: array [0..3] of char;
Marker_fmt: array [0..3] of char;
SubChunkSize: cardinal;
FormatTag: word;
NumChannels: word;
SampleRate: longint;
BytesPerSecond: longint;
BytesPerSample: word;
BitsPerSample: word;
Marker_data: array [0..3] of char;
DataBytes: longint;
end;
TChannel = record
Data : array of double;
end;
Run Code Online (Sandbox Code Playgroud)
一些私人移民
private
wavehdr:TWaveHeader;
wavedata:array[0..3]of TChannel;
numsamples:integer;
Run Code Online (Sandbox Code Playgroud)
功能
FillChar(wavehdr, sizeof(wavehdr), 0);
Stream.Read(wavehdr, sizeof(wavehdr));
{ Log Header data }
with memo1.Lines do begin
Add('Filename : '+od.FileName);
Add('Header size …Run Code Online (Sandbox Code Playgroud) 我有AIFF格式的音轨。我想使用Python打开此音频文件,并导入声音的幅度并执行一些数学分析,例如Fourier Transform等。
在整个搜索过程中,我发现了scipy.io.wavfile适用于WAV音频文件的。
显然,我可以将AIFF转换为WAV文件,但如果可能的话,我想直接导入AIFF文件。
附带提出一个问题:是否存在一些更特定的(具体而言,我的意思是比Python更好的)编程语言来执行此类音频文件的分析和获取?
我试图通过直接读取其二进制数据来使用c ++编辑wav文件.我写了文件的标题如下:
struct header{
char chunk_id[4];
int chunk_size;
char format[4];
char subchunk1_id[4];
int subchunk1_size;
short int audio_format;
short int num_channels;
int sample_rate;
int byte_rate;
short int block_align;
short int bits_per_sample;
char subchunk2_id[4];
int subchunk2_size;
};
Run Code Online (Sandbox Code Playgroud)
现在假设标题的数据已经加载到某个变量中,如何计算声道的最大持续时间?
我正在尝试从Arduino Uno的模拟输入中编码WAV文件。该analogRead(pinNumber)函数返回0到1023之间的值。然后需要将此10位值编码到WAV文件中。有一个功能map(val, inMin, inMax, outMin, outMax)可以将其调整为完整的16位值(或8位值)。但是理想情况下,如果我可以将WAV文件的样本大小简单地设置为10位,那将是完美的。我知道如何将其写入标头,但我不知道它是否会真正起作用,或者如果它不是8位的倍数,则如何实际写入数据。
如果可能的话,我假设它需要一些花哨的按位运算,但是我不知道如何使它起作用。
我写了一个简单的代码,读取Wav文件的标题,然后开始播放它.这是我的代码:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Generics.collections,
Vcl.ExtCtrls, MMSystem;
type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Label1: TLabel;
Label2: TLabel;
Shape1: TShape;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TWaveformSample = integer; // signed 32-bit; -2147483648..2147483647
TWaveformSamples = packed array of TWaveformSample; // one channel
var
Form1: TForm1;
myWavFile: file;
DataBlock: …Run Code Online (Sandbox Code Playgroud) 通过研究另一个与SIPp相关的问题,我了解到现在可以使用该rtp_stream动作播放WAV文件。
我尝试了几种不同的WAV文件,但均未成功。我得到的只是一些噪音而不是预期的声音。
在提到的问题的一个评论中,有一条简单的指令将WAV文件转换为兼容格式,但效果不佳。
我也曾尝试使用sox转换此文件,但没有成功。
谁能指导我如何生成与SIPp一起使用的有效WAV文件?
这是我的recv 200 OK命令,其中包括播放音频操作:
<recv response="200" rtd="true">
<action>
<exec rtp_stream="sorry_dave.wav,-1" />
</action>
</recv>
Run Code Online (Sandbox Code Playgroud) 我想在assembly/8086/masm/dosbox中制作一个程序,将键盘变成各种乐器,所以我需要能够播放一些.wav文件以产生所需的声音.我知道beep char并通过声音产生声音向pc扬声器发送频率(端口41h,42h和61h),但两种方式显然不会让我在那里.
我四处搜索,发现我需要int 21h使用Sound Blaster打开文件,了解.wav格式和声音编程知识.
不幸的是我找不到任何有用的文档如何在Dosbox(或一般)中使用Sound Blaster,如果你可以帮助我解决如何在dosbox上播放.wav文件的问题,或者如果你有任何解决方法我是所有的耳朵(更准确的眼睛).