使用 FMOD 保存输出而不播放
Posted
技术标签:
【中文标题】使用 FMOD 保存输出而不播放【英文标题】:Saving output using FMOD without playback 【发布时间】:2011-09-29 12:49:25 【问题描述】:我需要在 N 个通道中实现单独的音频文件的播放,文件可以顺序播放或并行播放。我需要在 android 上实现它。
时间线:
|文件 a...|文件 d....|文件 b...|......|文件 k|....
|.....|文件 g|文件 c..|文件 p.|....
我正在考虑两种选择,一种是 FMOD 来解压缩文件并同时播放它们。我已经研究过,FMOD 似乎比使用 AudioTrack 手动播放更合适,也更容易。但是,我不明白 FMOD 是否允许我们在不播放的情况下保存整个合并的输出。
我知道使用解决方案here 我们可以将输出重定向到 wav 文件,但是是否可以立即创建最终输出并使用 FMOD 保存它?还是我必须手动将 PCMS 合并到一个流中..
谢谢。
【问题讨论】:
【参考方案1】:这里的一个重要问题是为什么您需要保存文件,如果可以离线执行此操作,那么它会简单得多。如果您必须记录多个文件的串联(包括其他并行播放的文件),使用 FMOD 是完全可能的。
一种方法是使用 wave-writer-nrt 输出模式,它允许您以比实时更快的速度输出基于 FMOD playsound 调用的 wav 文件。
另一种方法是使用自定义 DSP 在任何子混音播放时访问其数据流,如果您希望同时播放其他声音,这很有用。
另一种方法是简单地创建声音对象,然后使用 Sound::lock 访问 PCM 数据,您可以将这些数据连接到目的地。请记住,所有声音都需要具有相同的采样率和通道,否则您需要进行处理。另请注意,除非您想自己混合音频,否则无法对并行声音执行此操作。
【讨论】:
谢谢你,马修。我会试试这个。 关于第一个问题 - 我需要能够从结果混音中输出结果文件而不播放它,我正在寻找一种最佳方法。我知道 FMOD 非常适合播放,但不知道它是否适合保存应用程序指定的任意文件的混合。 由于 FMOD 是为播放而设计的,您需要加载声音,然后使用 FMOD 播放它们。如果您想避免听到结果,请使用无声音或 wav-writer 输出模式。如果您需要比实时播放速度更快,请使用这些输出模式的“nrt”版本。 谢谢马修。 OUTPUTMODE_WAVWRITER_NRT 确实是我需要的。如果我非常频繁地更新并开始在其他通道中播放其他并行声音,我会得到我想要的。不过,太糟糕了 FMOD 没有全局记录时间跟踪设施,我只能在当前播放的声音中获得位置,但在我的情况下,这没关系。 其实你可以使用 System::getDSPClock 获得一个全局时间,这个时钟值随着系统产生的每个样本而递增。它增加输出样本的数量。因此,如果系统以 Android 的默认速率 24000 运行,则时钟每秒都会增加该数量。以上是关于使用 FMOD 保存输出而不播放的主要内容,如果未能解决你的问题,请参考以下文章
Fmod函数显然输出一个预期的double,但是if(fmod == expected double)不能评估为true [duplicate]