【发布时间】:2016-09-20 23:12:43
【问题描述】:
我正在尝试提取 wav 文件的音频内容并将生成的波形导出为图像 (bmp/jpg/png)。
所以我找到了以下代码,它可以绘制正弦波并按预期工作:
string filename = @"C:\0\test.bmp";
int width = 640;
int height = 480;
Bitmap b = new Bitmap(width, height);
for (int i = 0; i < width; i++)
{
int y = (int)((Math.Sin((double)i * 2.0 * Math.PI / width) + 1.0) * (height - 1) / 2.0);
b.SetPixel(i, y, Color.Black);
}
b.Save(filename);
这完全符合预期,我想做的是替换
int y = (int)((Math.Sin((double)i * 2.0 * Math.PI / width) + 1.0) * (height - 1) / 2.0);
类似的东西
int y = converted and scaled float from monoWaveFileFloatValues
那么,我最好如何以最简单的方式来做这件事呢?
我有 2 个基本问题需要处理(我认为)
- 以不丢失信息的方式将 float 转换为 int,这是由于
SetPixel(i, y, Color.Black);其中 x 和 y 都是 int - 在 x 轴上跳过样本,以便波形适合定义的空间
audio length / image width给出样本数以平均由单个像素表示的强度
其他选项是找到另一种绘制波形的方法,该方法不依赖于上述方法。 Using a chart 可能是个好方法,但如果可能的话我希望能够直接渲染图像
这一切都是从控制台应用程序运行的,并且我的音频数据(减去标题)已经在一个浮点数组中。
更新 1
以下代码使我能够使用System.Windows.Forms.DataVisualization.Charting 绘制所需的输出,但处理 27776 个样本需要大约 30 秒,虽然它确实可以满足我的需求,但速度太慢而无法使用。所以我仍在寻找一种直接绘制位图的解决方案。
System.Windows.Forms.DataVisualization.Charting.Chart chart = new System.Windows.Forms.DataVisualization.Charting.Chart();
chart.Size = new System.Drawing.Size(640, 320);
chart.ChartAreas.Add("ChartArea1");
chart.Legends.Add("legend1");
// Plot {sin(x), 0, 2pi}
chart.Series.Add("sin");
chart.Series["sin"].LegendText = args[0];
chart.Series["sin"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Spline;
//for (double x = 0; x < 2 * Math.PI; x += 0.01)
for (int x = 0; x < audioDataLength; x ++)
{
//chart.Series["sin"].Points.AddXY(x, Math.Sin(x));
chart.Series["sin"].Points.AddXY(x, leftChannel[x]);
}
// Save sin_0_2pi.png image file
chart.SaveImage(@"c:\tmp\example.png", System.Drawing.Imaging.ImageFormat.Png);
【问题讨论】:
-
那么你有什么代码可以读取音频文件吗?评估标题然后检查数据?这应该是你的开始;绘图只是在.. 而且,不,绘制图表的点数并不是一个好主意,imo
-
@TaW - “我的音频数据(减去标题)已经在浮点数组中。”所以我正在寻找下一步。
标签: c# audio visualization