我正试图直接从我的安卓应用程序中动态生成一个小的MP4 audio+video文件。
我最初的攻击计划是:
该应用程序已经建立了基于用户输入的MIDI文件,包括节奏、乐器、注释等。这部分工作很容易完成,MIDI文件正在正确生成。这个MIDI从安卓的MediaPlayer上弹得很好。(第1步)
动画帧也是通过读取MIDI文件并交叉引用序列中每个和弦的静态位图来正确创建的。这些画面将成为视频..。但一开始是没有声音的。(第2步)
如您所见,Android延迟的问题对我来说并不是什么问题,因为我没有创建一个实时的合成器应用程序.我只想把MIDI转换成一些音频格式,然后可以混合到一个视频中,这个视频已经被设定为MIDI的原版。(第3步)
我遇到的问题是第三步。
我知道,我需要使用软件MIDI合成器,以获得实际的音频输出,将产生的一系列MIDI事件。然而,让它正确运作已经成为一个主要的障碍。我不关心产生的音频的精确质量,只是它与某人在使用通用设备(ala Gravis声音字体或bulit在Sovinox中的声音等)的通用MIDI样本时所期望的非常接近。
所以..。
我第一次尝试的是以上两个项目..。将它们混合在一起,这样就可以将MIDI文件转换为原始PCM数据缓冲区.进展得还不太好。
midi库(1)使用实时侦听器读取MIDI文件,并将事件发送给Midi驱动器(2),Midi驱动程序(2)播放由车载合成器生成的原始PCM数据。
(注意:对驱动程序做了一些调整,以便存储整个缓冲区,并且只在MIDI读取器完成后返回。这也意味着整个过程需要相当于歌曲长度的时间来转换它,因为我们正在实时地“聆听”。)
我还没有如我所希望的那样使它发挥作用。我希望保持这一点尽可能简单,如果可能的话,我更愿意使用开源项目。如果它不依赖实时侦听器就能做到这一点,那就更好了。
我一直在考虑的一些其他库和工具(但可能有些过分):
更多的竞争者(还没有做多少研究):
jFugue/timidity/audacity/fluidSynth/cSound/jMusic/JSyn/Gervill/Softonic/Caustic/LibGDX/JetPlayer/OpenSL-ES
我的问题是:
我的希望是我完全错过了一件让这件事变得微不足道的事情.我的假设是,这将需要一些严重的黑客和JNI功夫。
如果需要的话,我愿意走一条艰难的道路。如有任何建议,我将不胜感激。
发布于 2015-06-08 04:46:51
我不是安卓用户,但我尝试了很多方法从MIDI生成WAV文件,我对这个任务更满意,使用FluidSynth,它似乎可以作为安卓的一个库,也是另一个StackOverflow问题的重点:使用Fluidsynth在Android上播放SoundFonts的音符。
你只需要知道声音字体(搜索网页很容易告诉你),并选择一个好的不是太大(否则,你可能有内存问题)。
还要检查声音字体覆盖所有你想要播放的乐器.
发布于 2022-02-20 11:14:34
如果您在JS或Node环境中运行,您应该能够使用mudcube的MIDI.js (或我的ES6端口作为midicube)使用Player对象将MIDI转换为web音频输出并轻松播放。或者,如果您想保存它,可以捕获流并将其转换成任意数量的格式(可能包括mp3,但我从未尝试过)。如果时间不是转换中的本质,那么第二部分应该很容易,但是它需要MIDI的运行时间来转换。应该可以加快回放速度和样品的回放,使转换在2或4倍的速度,然后放慢文件,但我还没有尝试过。
如果您对库有较低级别的访问权限,那么@hibou57使用FluidSynth的建议是最好的。
无论哪种方式,你都需要一些声音字体。流体-GM良好的工作质量较低,但可接受的声音。
https://stackoverflow.com/questions/20336447
复制相似问题