Работа с Ogg Vorbis - PullRequest
       13

Работа с Ogg Vorbis

5 голосов
/ 16 ноября 2011

У меня есть файл ogg vorbis, и я должен выполнить с ним две операции:

  1. вырезать часть файла из одной позиции в другую
  2. объединить другой файл с существующимone

Как я могу реализовать эти две операции в C #?

Ответы [ 2 ]

5 голосов
/ 02 февраля 2012

Вы можете сделать это с помощью libzplay http://libzplay.sourceforge.net/ Шаги, необходимые для выполнения того, о чем спрашивают:

  1. OpenFile
  2. Ищи
  3. SetWaveOutFile (это поддерживает экспорт .ogg, а также другие форматы)
  4. StartPlayback
  5. StopPlayback (в нужное время)

Все очень хорошо документировано на связанном сайте для нескольких языков, включая c #.
Этот ответ предназначен для всех остальных людей, которые часами искали и не помогли в предыдущих ответах. Это не очень эффективное решение проблемы здесь, но во время поиска этот вопрос возникал много раз, и это может быть полезно для других. :)

5 голосов
/ 16 ноября 2011

Я бы посмотрел документацию по c для libogg и выяснил, как это сделать с помощью c. А затем напишите почти такой же код на C #, используя оболочку над libogg.

Я создал низкоуровневую оболочку для libogg и libvorbis с помощью помощника по взаимодействию: https://github.com/CodesInChaos/Xiph/blob/master/LowLevel.cs

Этот проект также содержит некоторые конструкции более высокого уровня, но я не думаю, что они будут полезны для того, что вы делаете.

Кстати, если идентификаторы потоков между файлами различаются, вы можете просто добавить файл в другой файл, создав действительный файл, который воспроизводит оба потока последовательно.

Возможно, вам необходимо прочитать пакет входных файлов с помощью API декодирования, а затем записать объединенные данные из пакета. Возможно замена идентификатора потока и гранулепо между ними.

StreamID - это целое число, которое идентифицирует подпотоки в файле ogg. Чтобы добавить несколько таких подпотоков, вы можете просто убедиться, что они имеют другой идентификатор, а затем записать данные.

Разделение немного более раздражает, так как granulepos является зависимой от кодека меткой времени, и я не помню, как она определена для vorbis. Другая проблема в том, что вы не можете просто разбить середину пакета без перекодирования.

...