https://github.com/Lovesan/clave
Такое. Красивый и удобный лисповый интерфейс к библиотекам FFmpeg. В процессе, но кое-что работает уже. Пока не хватает swresample и swscale, но скоро будет. Также, потом отдельной asdf-системой будет postroc, т.к. она загплена.
Еще с документацией пока проблемы, как впрочем и у самого ffmpeg.
Тестируется все на винде, под FFmpeg 3.2.4, собранный мной лично: https://static.lovesan.ru/ffmpeg/ffmpeg-3.2.4-win64-lgpl.zip
Но, в принципе, ничто не мешает работать и с линуксом, надеюсь я там правильные имена файлов so-шек вписал, в src/lib.lisp
UPD: Протестировал на ubuntu 16.04 с FFmpeg 3.3.2 (из ppa) - все отлично работает
Вот пример, типа, берем, и конвертируем любое медиа, поддерживаемое FFmpeg, и у которого есть звуковой поток, в mp3-файл.
(defun convert-audio-file (infile outfile)
(declare (type string infile outfile)
(optimize (speed 3) (space 0) (safety 0)))
(clave:with-input-context (input infile)
(clave:find-stream-info input)
(clave:dump-format input :url infile)
(multiple-value-bind
(stream-index codecpar)
(loop :for i :from 0
:for stream :in (clave:format-context-streams input)
:for codecpar = (clave:media-stream-codecpar stream)
:when (eq :audio (clave:codecpar-codec-type codecpar))
:do (return (values i codecpar))
:finally (error "No audio stream found"))
(let ((decoder (clave:find-decoder (clave:codecpar-codec-id codecpar)))
(encoder (clave:find-encoder :mp3)))
(clave:with-codec-context (inctx decoder codecpar)
(clave:open-codec-context inctx)
(clave:with-codec-context (outctx encoder)
(clave:with-codec-context-slots
(sample-format sample-rate channels channel-layout global-quality) outctx
(setf sample-format (clave:codecpar-format codecpar)
sample-rate (clave:codecpar-sample-rate codecpar)
channels (clave:codecpar-channels codecpar)
channel-layout (clave:codecpar-channel-layout codecpar)
global-quality 1))
(clave:open-codec-context outctx encoder)
(clave:with-output-context (output :filename outfile)
(let* ((outstream (clave:add-media-stream output encoder))
(outpar (clave:media-stream-codecpar outstream)))
(clave:parameters-from-context outpar outctx)
(clave:write-header output)
(clave:dump-format output :url outfile)
(clave:with-packet (packet)
(clave:with-frame (frame)
(loop :while (clave:read-frame input packet)
:when (= stream-index (clave:packet-stream-index packet)) :do
(clave:send-packet inctx packet)
(loop :while (clave:receive-frame inctx frame) :do
(clave:send-frame outctx frame)
(loop :while (clave:receive-packet outctx packet) :do
(clave:write-frame output packet))))
(clave:send-flush-frame outctx)
(loop :while (clave:receive-packet outctx packet) :do
(clave:write-frame output packet))
(clave:write-trailer output)))))))))))