android - 当某些其他声音插入到ffmpeg的混音中时,如何停止声音?

标签 android audio ffmpeg android-ffmpeg

我正在使用一个 ffmpeg 命令,它接收一组声音,将它们混合到一个文件中,并按一定的时间间隔将它们分开。
下面是我今天的命令。

ffmpeg -i 
close_hh.wav    -i \
crash_l.wav     -i \
crash_r.wav     -i \
floor.wav       -i \
kick_l.wav      -i \
kick_r.wav      -i \
open_hh.wav     -i \
ride.wav        -i \
snare.wav       -i \
splash.wav      -i \
tom_1.wav       -i \
tom_2.wav       -i \
  tom_3.wav  -filter_complex  " [6]adelay=0|0[note_0];  [0]adelay=360|360[note_1];  [6]adelay=1260|1260[note_2];  [0]adelay=1537|1537[note_3];  [6]adelay=2494|2494[note_4];  [5]adelay=2767|2767[note_5];  [0]adelay=2969|2969[note_6];  [6]adelay=3673|3673[note_7];  [5]adelay=3924|3924[note_8];  [0]adelay=4132|4132[note_9];  [0][note_0][note_1][note_2][note_3][note_4][note_5][note_6][note_7][note_8][note_9]amix=inputs=11:normalize=0" record.wav
这是此命令生成的结果音频:
ffmpg 记录.wav: https://drive.google.com/file/d/1LFV4ImLKLnRCqZRhZ7OqZy4Ecq5fwT3j/view?usp=sharing
目的是生成鼓录音,所以我想模拟踩镲声音的动态:演奏关闭的踩镲时,如果打开的踩镲还在发声,则会立即停止播放。任何其他声音都不会发生相同的行为。
让这更具挑战性的一点是,在打开踩镲和闭合踩镲之间也可以播放其他声音,理论上声音中断行为应该正常工作。
下面是一段录音,展示了预期的结果。 (我的应用已经在内部重现了我需要的声音结果,所以我只是用麦克风做了一个简单的录音来说明)
麦克风录音.wav https://drive.google.com/file/d/19x19Fd_URQVo-MMCmGEHIC1SjaQbpWrh/view?usp=sharing
请注意,在第一个音频 (ffmpeg record.wav) 中,第一个声音 (open hi-hat) 在播放第二个声音后继续播放。
在第二个音频 (mic record.wav) 中,第一个声音在播放第二个声音后立即停止。
ffmpeg 命令应该如何得到预期的结果?

最佳答案

虽然我不确定 FFmpeg 是合成音乐的正确工具,但这里有几种方法可以实现您的目标。首先,我建议一次“创作”一种乐器(在鼓组的情况下,一个鼓/钹),如下图所示,然后将所有乐器的音轨混合在一起。
现在,让我们使用前 3 个踩镲 fragment 来展示如何构建过滤器图来形成踩镲音轨。
(1) 将每个文件修剪到长度并连接所有流:

[0]atrim=duration=0.36[note_0]; \
[6]atrim=duration=0.9[note_1]; \
[0]atrim=duration=0.277[note_2]; \
[note_0][note_1][note_2]concat=3:0:1[aout]
虽然这很有效,但如果在修剪的那一刻有任何可听见的声音,您可能会听到声音的突然中断。这带来了替代...
(2)将每个文件修剪到长度+额外和交叉淡入淡出:
假设 10 ms 的重叠就足够了,那么您希望将每个段拉长 10 ms (0.01 s)。
[0]atrim=duration=0.37[note_0]; \
[6]atrim=duration=0.91[note_1]; \
[0]atrim=duration=0.277[note_2]; \ # last file remain same length
[note_0][note_1]acrossfade=d=0.01:c1=exp:c2=exp[notes_01] \
[note_01][note_2]acrossfade=d=0.01:c1=exp:c2=exp[notes_012]
这会变得非常长,所以你可以缩短一点
[0]atrim=duration=0.37[note_0]; \
[6]atrim=duration=0.91,[note_0]acrossfade=d=0.01:c1=exp:c2=exp[notes_01]; \
[0]atrim=duration=0.277,[note_01]acrossfade=d=0.01:c1=exp:c2=exp[notes_012];
c1c2是衰落曲线轮廓。 See this Wiki page for the available fade curves .
最后,我随意选择了 10 ms,可能太短了,所以尝试选择最佳的重叠持续时间。

关于android - 当某些其他声音插入到ffmpeg的混音中时,如何停止声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71714541/

相关文章:

android - GCM onRegistered 未调用

iphone - 使用超声波传输数据

ios - 考虑到拆分的持续时间,是否可以在 iOS 上将录制的 wav 文件拆分为多个 wav 文件?

c - 使用 libswresample 将音频从 48000 重新采样到 44100

python - 不和谐机器人在哪里可以找到 ffmpeg buildpack heroku

ffmpeg - 如何使用 ffmpeg 将一组 PPM 文件转换为单个 .mp4 视频

android - support 和 appcompat 支持库之间的区别

java - 替换android上可绘制文件夹中的文件

android - MediaCodec 创建输入表面

android - 合并两个 MP3 音频文件