Как микшировать аудиофайлы с помощью библиотеки SoX C

Микшировать аудиофайлы с SoX просто из командной строки с помощью «sox -m ...", но я пытаюсь найти то же самое с библиотекой C и нигде не могу найти, как это сделать. Это вообще возможно?


person Johnzo    schedule 24.08.2012    source источник
comment
Чего вы точно пытаетесь достичь? Прочитать n файлов, смешать их, а потом…? SoX кажется плохим выбором для библиотеки; очень недружественный API.   -  person Michał Górny    schedule 24.08.2012
comment
Прочитайте n файлов и смешайте их в выходной файл. Есть ли другие библиотеки, которые вы могли бы предложить?   -  person Johnzo    schedule 24.08.2012
comment
Мне все еще нужно знать больше. Поскольку вы практически выполняете операцию командной строки sox, почему вы встраиваете ее в C?   -  person Michał Górny    schedule 24.08.2012
comment
В SoX есть библиотека C (sox.sourceforge.net/libsox.html), которую мы тестируем. out в качестве альтернативы командной строке. Существует пример кода (example4.c, доступный в исходном дистрибутиве SoX), который объединяет два файла, но я не вижу способа изменить его, чтобы они смешались.   -  person Johnzo    schedule 24.08.2012
comment
Да, это я понимаю. Но я думаю о более широкой картине. Вы создаете какое-то более крупное приложение, одной из функций которого будет микширование звука?   -  person Michał Górny    schedule 24.08.2012
comment
Да, будет один или несколько файлов, каждый из которых прошел через цепочку эффектов, и их нужно смешать вместе в выходной файл.   -  person Johnzo    schedule 24.08.2012


Ответы (1)


Что ж, это возможно, но библиотека вам в этом не поможет.

Просматривая код sox.c, вы можете заметить, что фактический код микширования находится в функции static:

for (ws = 0; ws < olen; ++ws) { /* wide samples */
  if (combine_method == sox_mix || combine_method == sox_mix_power) {
    for (s = 0; s < effp->in_signal.channels; ++s, ++p) { /* sum samples */
      *p = 0;
      for (i = 0; i < input_count; ++i)
        if (ws < z->ilen[i] && s < files[i]->ft->signal.channels) {
          /* Cast to double prevents integer overflow */
          double sample = *p + (double)z->ibuf[i][ws * files[i]->ft->signal.channels + s];
          *p = SOX_ROUND_CLIP_COUNT(sample, mixing_clips);
        }
    }
/* [...] */

Итак, если вы действительно хотите использовать sox, вы можете использовать его для ввода/вывода файлов, но микширование вам нужно будет сделать самостоятельно.

person Michał Górny    schedule 24.08.2012
comment
И под «сделай сам» вы имеете в виду попробовать реализовать эти функции в моем собственном коде C? Звучит смешно! - person Johnzo; 24.08.2012
comment
Или найдите другую библиотеку для микширования. Но я думаю, что это должно быть достаточно просто, чтобы сделать это вручную, если только вы не ищете более изысканные методы. - person Michał Górny; 24.08.2012
comment
Хорошо, я не очень опытный программист, но я посмотрю, как я пойду. Спасибо за вашу помощь! - person Johnzo; 24.08.2012
comment
Если я что-то не упустил, используемый здесь алгоритм довольно прост: для каждой выборки i, output[i] = mean(input1[i], input2[i], …) (в псевдокоде). Однако я не специалист по звуку, поэтому могут быть методы получше. - person Michał Górny; 24.08.2012