Fesor
@Fesor
Full-stack developer (Symfony, Angular)

Транскодер аудио как декоратор для стримов: какие еще есть идеи красивого и удобного враппера?

Начал писать биндинг libavcodec+libavformat (поддержка только аудио форматов) для D, так же реализую биндинг для libmpg123. low-level биндинги работают, но я хочу сделать красивый и удобный враппер для кодирования/декодирования аудио. К сожалению проблема банальна: моих знаний и опыта работы с подобными штуками явно не хватает что бы оценить плюсы и минусы отдельных подходов.

Исходя из своих задач, ради которых все это и затевалось, требуется независимость враппера от источника данных, то есть по хорошему мы должны завязать декодеры и энкодеры на интерфейсы InputStream и OutputStream соответственно (как профит, возможность добавлять буферизацию IO простым декорированием). Плюсы стримов очевидны: это может быть и файл, и HTTP стрим (точнее мы можем инкапсулировать в стрим любую логику по работе с данными, скажем быстро добавить возможность декодирования HTTP-стрима)... Так же (хотя не понятно кто станет заниматься подобным), файл может уже находиться в памяти.

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

Последние пару часо голову отчайно мучает мысль использовать декодер как декоратор над стримами. По сути мы имеем стрим-транскодер. Мы записываем в стрим например mp3 и считываем из него данные уже в другом формате (или просто PCM, в зависимости от настроек). Но пока остановился на варианте

Проблема которую я пока вижу - невозможность получить информацию о декодированных фреймах "красиво". Например:

// работает автоопределение формата контейнера, но можно задавать отдельно параметры декодирования
auto input = new Decoder(new File("in.mp3")); 
auto output = new Encoder(new File("out.ogg")); // настройки можно задавать отдельно...
foreach (ubyte[] buffer; input) {
    // делаем с PCM что-либо полезное
    // и сохраняем в новом формате
    output.write(buffer);
}


я пока не могу придумать "красивый" способ получать информацию о фреймах. Ну и не особо уверен что такой вариант будет удобен.

Словом... я уже слабо соображаю и прошу подсказать, может кто видел и пользовался удобной реализацией API для кодирования/декодирования аудио? Это может быть реализация на любом языке программирования, важна именно идея.
  • Вопрос задан
  • 3010 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы