Lut*_*ndo 3 .net c# ffmpeg azure asp.net-core
我正在编写一个需要获取音频文件的原始波形数据的应用程序,以便我可以在应用程序 (C#/.NET) 中呈现它。我正在使用 ffmpeg 来卸载此任务,但看起来 ffmpeg 只能将波形数据作为 png 或作为流输出到 gnuplot。
我已经查看了其他库来执行此操作(NAudio/CSCore),但是它们需要 Windows/Microsoft 媒体基础,并且由于此应用程序将作为 Web 应用程序部署到 azure,因此我无法使用它们。
我的策略是只从 png 本身读取波形数据,但这似乎有点过头了。理想的输出将是数组中固定采样的一系列峰值,其中数组中的每个值都是峰值(范围从 1-100 或类似的值,例如这样)。
萨博纳布迪,
写了手动获取波形的方法,然后向您展示了一个示例,我发现this code 哪个可以满足您的需求(或者至少,您可以从中学到一些东西)。
1)使用FFmpeg获取样本数组
试试这里显示的示例代码:http : //blog.wudilabs.org/entry/c3d357ed/?lang=en-US
试验它,尝试调整手册等的建议......在显示的代码中,只需更改string path为指向您自己的文件路径。编辑该proc.StartInfo.Arguments部分以替换最后一个部分,如下所示:
proc.StartInfo.Arguments = "-i \"" + path + "\" -vn -ac 1 -filter:a aresample=myNum -map 0:a -c:a pcm_s16le -f data -";
Run Code Online (Sandbox Code Playgroud)
这myNum从部分aresample=myNum由下式计算:
44100 * total Seconds = X.
myNum = X / WaveForm Width.
Run Code Online (Sandbox Code Playgroud)
最后使用ProcessBuffer具有此逻辑的函数:
static void ProcessBuffer(byte[] buffer, int length)
{
float val; //amplitude value of a sample
int index = 0; //position within sample bytes
int slicePos = 0; //horizontal (X-axis) position for pixels of next slice
while (index < length)
{
val = BitConverter.ToInt16(buffer, index);
index += sizeof(short);
// use number in va to do something...
// eg: Draw a line on canvas for part of waveform's pixels
// eg: myBitmap.SetPixel(slicePos, val, Color.Green);
slicePos++;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想在没有 FFmpeg 的情况下手动完成。你可以试试...
2) 将音频解码为 PCM
您可以将音频文件 (mp3) 加载到您的应用程序中,然后首先将其解码为 PCM(即:原始数字音频)。然后仅读取 PCM 编号以制作波形。不要直接从 MP3 之类的压缩数学字节中读取数字。
这些 PCM 数据值(关于音频幅度)进入一个字节数组。如果您的声音是 16 位,那么您可以通过将每个样本作为 a 读取来提取 PCM 值short(即:自 以来一次获取两个连续字节的值16 bits == 2 bytes length)。
基本上,当您在字节数组中有 16 位音频 PCM 时,每两个字节代表一个音频样本的幅度值。该值成为您在每个切片的高度(响度)。切片是波形中某个时间的 1 像素垂直线。
现在采样率意味着每秒采样数。通常为 44100 个样本(44.1 khz)。您可以看到使用 44,000 像素来表示一秒的声音是不可行的,因此divide所需波形的总秒数width。将结果 &multiply乘以 2(覆盖两个字节),这就是您在形成波形时跳跃和采样幅度的程度。while循环执行此操作。
| 归档时间: |
|
| 查看次数: |
4435 次 |
| 最近记录: |