我最近对这个问题的最新讨论的更新显示在底部
好吧,我正在尝试构建一个平台,我的 silverlight 应用程序将把不同的乐器音频合并到一个文件中并输出音乐音频。
我现在想做的是将多个 mp3 文件合并为一个 mp3 文件。但最终的 mp3 文件不应该播放第一个 mp3,然后播放第二个,......直到最后。它应该像 mp3 频道一样播放它们。用户将放置吉他通道、鼓通道等,合并器会将它们全部合并到一个 mp3 文件中作为输出。
我发现我可以通过一些代码来做到这一点ffmpeg和其他一些实用程序,但我找不到一种方法使其在通道结构中分层。
我发现了一个更简单的合并 mp3 的方法Mp3Wrap我更喜欢使用它,但我在谷歌上找不到任何关于它的帮助代码,而且从我读过的内容来看,我一直在尝试做的结构更难找到。
哦,顺便说一句..最后一个问题,我不喜欢 GPL 知识,所以如果我在我的项目中使用 Mp3Wrapper.exe 我可以将它用作商业项目吗?我能赚到钱吗?或筹集捐款?
编辑:
我还发现了一个叫做NAudio我不太确定它可以完成工作,但至少它看起来很熟悉,因为它是用 c# 编写的。但我不能在我的 silverlight 项目中使用它,因为它不是 silverlight 组件,而且我不确定它是否能工作。
另外,我一直在浪费时间搜索深度谷歌和 3 个选项的文档,找不到任何有用的东西,我真的不明白这些东西,但是,我准备好进行黑客攻击,不确定它是否有任何用处。使用或可行,但我也可以将 mp3 文件合并为音频通道(我看到我可以在 ffmpeg 中选择音频通道,但不太确定如何操作)。并将多个媒体元素添加到我的项目中并同时播放它们,希望它们能够同步并且mp3文件大小较小。
任何建议我如何通过黑客或良好的解决方案来实现我的目标。
另一个更新:
我决定使用流来合并我的 mp3 文件,因为我可以直接通过 .net 播放它们,并且经过一些尝试后它似乎更快。我正在使用以下代码,但我仍然找不到在“通道”或“分层”系统中合并文件的方法,而且我对流、位、缓冲区以及与 IO 相关的任何内容一无所知。希望这次更新可以帮助您给我一些见解。
string path = AppDomain.CurrentDomain.BaseDirectory;
using (var fs = File.OpenWrite(Path.Combine(path, "cOut.mp3")))
{
var buffer = File.ReadAllBytes(Path.Combine(path, "c1.mp3"));
fs.Write(buffer, 0, buffer.Length);
buffer = File.ReadAllBytes(Path.Combine(path, "c3.mp3"));
fs.Write(buffer, 0, buffer.Length);
fs.Flush();
}
我也改变了主意,将 mp3 文件嵌入为音频通道。另一项似乎非常困难。我也完全接受有关音频通道操作的建议,您可以编写任何您能想到的解决方案,我对任何事情都持开放态度。
提前致谢..
最后我能够实现对 wmv 音频流的操作,但是尺寸太大了!所以我将注意力转移到合并 mp3 的原始点上,并且我能够通过 ffmpeg 实现我想要的!这个简单的代码合并多个 mp3 文件!但现在我遇到了音频速度的问题。我猜想 ffmpeg 会计算两个 mp3 文件(a1.mp3 + a2.mp3)的持续时间,然后拉伸音频以适应。因此我的音频以半速播放......我已经尝试过了;
- -shortest(最短输入流结束时完成编码)
- -async 1(将音频同步到时间戳,与 -copyts 一起使用)
- -copyts(从输入流获取时间戳)
- -speed 2(操纵速度)
但找不到出路。当它处理音频时,它会执行到正确的持续时间,但由于 -newaudio 流,它会产生双持续时间的定时音频。
当我在媒体播放器中将音乐速度加快 2 倍时,我就可以随心所欲地听音乐了。
这是代码;
ffmpeg -i a1.mp3 -i a2.mp3 -map 0:0 -map 1:0 -acodec wmav2 -ar 44100 -ab 128k -y aout.wav -acodec wmav2 -ar 44100 -ab 128k -newaudio
顺便说一句:两个输入流是相同的 mp3 用于调试过程,因此输入没有问题。
谢谢。
P.S:如果可以的话,我不想使用 SOX,但如果没有其他选择,请指导我使用完全工作的二进制文件。