Задача состоит в том, чтобы убрать тишину по порогу с начала и конца записи звука.
Я использую этот сокс-порт для iOS.
https://github.com/shieldlock/SoX-iPhone-Lib/
Я обнаружил, что инструмент командной строки sox выполняет мою задачу с помощью следующей команды:
sox in.wav out.wav silence 1 0.1 1% reverse silence 1 0.1 1% reverse
(взято отсюда: http://digitalcardboard.com/blog/2009/08/25/the-sox-of-silence/)
но я не могу перевести его в формат iOS lib следующим образом:
sox_create_effect(sox_find_effect("silence"));
args[0] = "2000", assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
какие параметры мне нужно дать для выполнения этой задачи?
поскольку sox in.wav out.wav silence 1 0.1 1% reverse silence 1 0.1 1% reverse
это объединение двух разных командных строк:
sox in.wav temp.wav silence 1 0.1 1% reverse
sox temp.wav out.wav silence 1 0.1 1% reverse
создать два эффекта тишины в вашей цепочке. Как только эффект обрезает начало файла и направляет обратную копию к временному получателю, а следующий обрезает начало начала временного и возвращает его обратно к конечному месту назначения.
Но какие аргументы передать (args
)? ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: У меня мало опыта и я не могу проверить это, но я считаю, что это должны быть следующие строки:
args[1] = "1";
args[2] = "0.1";
args[3] = "1%";
args[4] = "reverse";
e = sox_create_effect(sox_find_effect("silence"));
args[0] = "2000", assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &inFile->signal, &tempFile->signal) == SOX_SUCCESS);
free(e);
e = sox_create_effect(sox_find_effect("silence"));
args[0] = "2000", assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
assert(sox_add_effect(chain, e, &tempFile->signal, &outFile->signal) == SOX_SUCCESS);
free(e);
sox_flow_effects(chain, NULL, NULL);
Документация Сокса плохая. Я поделюсь своим решением здесь.
Порог в примере может быть слишком низким для вас. Отрегулируйте параметры соответствующим образом. (Убедитесь, что вы понимаете параметры командной строки оболочки, прежде чем использовать C / C ++ API.)
char *options[10];
// input effect. See sox's documentaton for details.
// equivalent to 'silence 1 0.3 0.1% reverse silence 1 0.3 0.1% reverse'
options[0] = const_cast<char*>("1");
options[1] = const_cast<char*>("0.3");
options[2] = const_cast<char*>("0.1%");
for(int i = 0; i < 2; ++i) {
// silence 1 0.3 0.1%
e = sox_create_effect(sox_find_effect("silence"));
if(sox_effect_options(e, 3, options) != SOX_SUCCESS) {
on_error("silence1 effect options error!");
}
if(sox_add_effect(chain, e, &in->signal, &in->signal) != SOX_SUCCESS) {
on_error("add effect error!");
}
free(e);
// reverse
e = sox_create_effect(sox_find_effect("reverse"));
if(sox_effect_options(e, 0, NULL) != SOX_SUCCESS) {
on_error("silence1 effect options error!");
}
if(sox_add_effect(chain, e, &in->signal, &in->signal) != SOX_SUCCESS) {
on_error("add effect error!");
}
free(e);
}
// output effect