2013-10-09 1 views
4

Задача состоит в том, чтобы удалить тишину по пороговому значению с начала и конца аудиозаписи. Я использую этот sox-порт для iOS. https://github.com/shieldlock/SoX-iPhone-Lib/Как использовать soxlib для iOS, чтобы удалить начальную и конечную тишину

Я обнаружил, что командная строка сокс инструмент делает мою задачу следующей командой:

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); 

Какие параметры мне нужно дать для выполнения этой задачи?

ответ

1

Поскольку 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 

создать два молчание эффектов в цепочке. После того, как эффект обрезает начало файла и передает обратную копию в пункт назначения temp, а следующий снимок начинается с начала темпа и возвращает его обратно в конечный пункт назначения.

Но какие аргументы необходимо принять (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); 
+0

Спасибо Я проверить это – kezi

+0

@kdogisthebest везения? – Thompson

+0

@ Тихий и обратный тимпсон - два независимых эффекта. См. Мой ответ ниже. Спасибо, в любом случае. – duleshi

0

Сокс беден. Я разделяю свое решение здесь.
Недостаток в примере может быть слишком низким для вас. При необходимости отрегулируйте параметры. (Убедитесь, что вы понимаете, параметры командной строки оболочки, прежде чем использовать 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