Начал писать биндинг 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 для кодирования/декодирования аудио? Это может быть реализация на любом языке программирования, важна именно идея.