给定一些音频文件(例如,* .wav),我希望通过命令行方式将这些文件混合为具有单独卷的音轨,并定义全局循环点,以便音频混合无缝循环。
有人可以建议其他替代方案吗?
提前致谢,
干杯!
实际上,使用melt
下面的文件几乎可以实现“命令行循环器” - 问题是:循环并不是真正无缝的(有可听见的咔嗒声);我看不出混合两个以上通道的方法;尽管-audio-track | -hide-video
在命令行上添加了开关,但仍然显示空白屏幕。(关于循环的更多内容请参见melt
此处:回复:[Mlt-devel] 生产者循环)
必须使用此命令才能melt
以“循环”模式调用:
melt eof=loop loop.mlt
... 而loop.mlt
文件(调用音频文件test.wav
和test2.wav
)是这样的(循环播放时总共会有 70 帧长):
<mlt>
<producer id="producer0">
<property name="aspect_ratio">0.000000</property>
<property name="resource">test.wav</property>
<property name="audio_index">0</property>
<property name="video_index">-1</property>
<property name="global_feed">1</property>
</producer>
<producer id="producer1">
<property name="aspect_ratio">0.000000</property>
<property name="resource">test2.wav</property>
<property name="audio_index">0</property>
<property name="video_index">-1</property>
<property name="global_feed">1</property>
</producer>
<playlist id="playlist0">
<entry producer="producer0" in="0" out="30"/>
<blank length="10"/>
<entry producer="producer0" in="0" out="30"/>
</playlist>
<playlist id="playlist1">
<blank length="30"/>
<entry producer="producer1" in="0" out="10"/>
</playlist>
<tractor id="tractor0" title="loop.mlt" global_feed="1" in="0" out="71">
<multitrack id="multitrack0">
<track producer="playlist0" hide="video"/>
<track producer="playlist1" hide="video"/>
</multitrack>
<transition id="transition1" in="0" out="71">
<property name="a_track">0</property>
<property name="b_track">1</property>
<property name="mlt_service">mix</property>
<property name="start">0.5</property>
<property name="end">0.5</property>
<property name="combine">1</property>
<property name="always_active">1</property>
</transition>
</tractor>
</mlt>
答案1
好吧,我想我找到了 Linux 命令行多轨音频循环器的解决方案 - 那就是使用ChucK => 强定时、即时音频编程语言脚本。
首先,ChucK
可以通过 Debian/Ubuntu 安装sudo apt-get install chuck
。但是,安装后,尝试在终端中输入chuck
,然后TAB输入以下内容:
$ chuck
chuck chuck.alsa chuck.oss
...也就是说 - 请注意三 ChucK
可执行文件;每个文件用于单独的 Linux 音频后端 - 请注意,默认的可执行文件chuck
实际上是指 JACK(其他可执行文件显然是指 ALSA 和 OSS)。
由于大多数典型的 Linux 用户(包括我自己)实际上并没有jack
安装 - 运行chuck
可执行文件可能会导致失望,因为它不会产生声音(假设jack
系统中不存在声音);例如,参见:
您可能想要运行并查看不同后端的报告内容 -如果 JACK 不存在且正在运行,chuck --probe
则会出现投诉,但应该通过:chuck
chuck.alsa
$ chuck --probe
[chuck]: (via rtaudio): no devices found for compiled audio APIs!
[chuck]:
# .....
$ chuck.alsa --probe
[chuck]: found 4 device(s) ...
[chuck]: ------( chuck -- dac1 )---------------
[chuck]: device name = "hw:SB,0"
[chuck]: probe [success] ...
[chuck]: # output channels = 6
[chuck]: # input channels = 2
[chuck]: # duplex Channels = 2
# .....
那么,对于大多数用户来说,运行chuck.alsa
应该可以解决问题 - 但请注意,这可能会直接占用音频设备(看起来似乎没有chuck
意识到pulseaudio
) - 然后您将无法同时运行其他音频生成程序(如vlc
),也无法将两个应用程序的声音混合在一起(另一个应用程序基本上保持静音)。
但注意到这一点后,我们现在可以继续ChucK
执行循环脚本。
其中一个很棒的事情ChucK
是,我们可以定义一个脚本来处理一个声音的播放和循环 - 然后调用该脚本的多个实例在平行下- 有效创建多轨音频循环器!
经过一些示例的调整后ChucK
,请参阅:
...我设法编写了自己的脚本 - 主要基于以下示例:缓存文件和价值评估- 我称之为loopsndbuf.ck:
// sound file
// initialize empty string variable for filename
"" => string filename;
// set a default filename to be loaded
"/path/to/freesound.org/100391__dobroide__20100627-creek.wav" => filename;
// if arguments are passed to the script,
// use the first argument as filename instead
if( me.args() ) me.arg(0) => filename;
0.5 => float myvolume;
if( me.args() ) if (me.arg(1) != "") Std.atof(me.arg(1)) => myvolume;
<<< "myvolume: " + myvolume >>>;
SndBuf buf;
filename => buf.read;
myvolume => buf.gain;
1.0 => buf.rate;
// time loop
Impulse i => dac;
while( true )
{
int pos;
repeat( buf.samples() )
{
buf.valueAt( pos ) => i.next;
pos++;
1::samp => now;
}
}
(更多评论请参见在线版本)
保存了这个脚本后,我们现在可以用chuck
解释器调用它:
chuck.alsa loopsndbuf.ck
... 它将开始按默认设置加载声音并循环播放。或者,我们可以用参数调用脚本 - 请注意,将参数与脚本分隔开的字符chuck
是冒号 ( :
):
chuck.alsa loopsndbuf.ck:/path/to/freesound.org/23222__erdie__thunderstorm2.wav:0.4
...或者,最后,我们可以调用loopsndbuf.ck
脚本的多个实例,这些实例chuck
将并行运行。为此,我宁愿将所有内容放在 bash 脚本中,我们称之为loopchuck.sh
:
set -x
PTH="/path/to/freesound.org"
chuck.alsa \
loopsndbuf.ck:$PTH/15528__ch0cchi__domestic-cat-purr.wav:1.0 \
loopsndbuf.ck:$PTH/100391__dobroide__20100627-creek.wav:0.05 \
loopsndbuf.ck:$PTH/23222__erdie__thunderstorm2.wav:0.4 \
loopsndbuf.ck:$PTH/2519__rhumphries__rbh-rain-01.wav:0.4 \
loopsndbuf.ck:$PTH/18766__reinsamba__chimney-fire.wav:0.4 \
loopsndbuf.ck:$PTH/53380__eric5335__meadow-ambience.wav:0.4
运行这个脚本基本上应该加载脚本的单独实例,每个实例都有自己的文件和音量 -chuck
然后首先将所有音频加载到内存中,将类似这样的内容吐到标准输出:
$ ./loopchuck.sh
++ PTH=/path/to/freesound.org
++ chuck.alsa loopsndbuf.ck:/path/to ....
"myvolume: 1.0000" : (string)
"myvolume: 0.0500" : (string)
"myvolume: 0.4000" : (string)
"myvolume: 0.4000" : (string)
"myvolume: 0.4000" : (string)
"myvolume: 0.4000" : (string)
...然后,它将让所有脚本同时启动 - 然后它将根据文件长度以样本精度单独循环所有声音 - 在结束时分别包装每个文件的循环。换句话说,循环的阶段是独立的(类似于 GUI 程序终结者X默认处理循环) - 那就是确切地我正在寻找的:)
!请注意,您可能必须按两次CTRL+C才能完全停止loopchuck.sh
脚本。(是的,使用的音频样本来自自由声音网)
但请注意,在chuck
将所有这些文件加载到内存中时,它会使用相当多的 CPU 来重现和混合这些循环 - 因此,如果操作系统必须处理一些繁重的操作(例如 GUI,例如在浏览器中滚动网页时),音频可能会出现下降。为了避免这种情况,我猜jack
必须使用设置 - 但随后必须参与 Linux 实时优先级等(这不一定是一个简单的过程)。
好吧,我想我现在很高兴——因为这就是我想要的一切(我只是希望我可以将此音频输出与来自完成,请查看其他答案)vlc
YouTube 的音频输出混合在一起firefox
-:)
;希望它也能帮助其他人,
干杯!
答案2
可能有点晚了,但我在寻找 chuck looper,所以我正在写一个。欢迎任何帮助。https://github.com/rodolfoap/chucklooper 这个想法是模仿 Boss RC-50 LoopStation。我想,用 chuck 做起来并不难。
答案3
好吧,我终于让 Linuxchuck
和 PulseAudio 一起工作了——现在转到让 ALSA 程序 (ChucK) 与 Pulseaudio 协同工作?- 另请参阅接受的答案这里...