Я бы посмотрел документацию по c для libogg и выяснил, как это сделать с помощью c. А затем напишите почти такой же код на C #, используя оболочку над libogg.
Я создал низкоуровневую оболочку для libogg и libvorbis с помощью помощника по взаимодействию:
https://github.com/CodesInChaos/Xiph/blob/master/LowLevel.cs
Этот проект также содержит некоторые конструкции более высокого уровня, но я не думаю, что они будут полезны для того, что вы делаете.
Кстати, если идентификаторы потоков между файлами различаются, вы можете просто добавить файл в другой файл, создав действительный файл, который воспроизводит оба потока последовательно.
Возможно, вам необходимо прочитать пакет входных файлов с помощью API декодирования, а затем записать объединенные данные из пакета. Возможно замена идентификатора потока и гранулепо между ними.
StreamID - это целое число, которое идентифицирует подпотоки в файле ogg. Чтобы добавить несколько таких подпотоков, вы можете просто убедиться, что они имеют другой идентификатор, а затем записать данные.
Разделение немного более раздражает, так как granulepos является зависимой от кодека меткой времени, и я не помню, как она определена для vorbis. Другая проблема в том, что вы не можете просто разбить середину пакета без перекодирования.