LINUX.ORG.RU

clave - интерфейс к FFmpeg для Common Lisp

 , , ,


0

4

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)))))))))))


★★★

Последнее исправление: lovesan (всего исправлений: 3)
Ответ на: комментарий от anonymous

Скобочки считать замучаешься.

В нормальных лисп средах скобочки считают и расставляют за тебя. не проблема ВООБЩЕ.

Oxdeadbeef ★★★
()
Ответ на: комментарий от Oxdeadbeef

Наверное, проблема не в том, чтобы правильно расставить скобочки, а в читабельности кода для людей с разной степенью подготовки в лиспе. Отголосок тех времен, породивших write only языки, когда программисты тратили уйму времени на рутинные операции ввода-вывода в машину, а код писался одним человеком в белом халате.

anonymous
()
Ответ на: комментарий от anonymous

Какие еще рутинные операции? Common Lisp самый высокоуровневый практичный язык из всех существующих.

anonymous
()
Ответ на: комментарий от anonymous

Common Lisp самый высокоуровневый практичный язык из всех существующих.

Тогда почему его так не любят галеры?

anonymous
()

Очередная обертка на лиспе. Уныло, барышни, учитесь у растовцев, которые пилят много своего нового и интересно.

anonymous
()
Ответ на: комментарий от Harald

На си он будет сильно длиннее, с кучей проверок возвращаемых значений, дублирования кода, в отдельных случаях с конверсиями кодировок, итд. Так что нет.

lovesan ★★★
() автор топика
Ответ на: комментарий от Harald

на Си явно красивее тот же код будет

там наверху написано же, что это низкоуровневая портянка.

Вот в Corman Lisp можно сишный и ассемблерный код прямо в лиспокод вставлять:

http://www.cormanlisp.com/features.html

http://www.cormanlisp.com/CormanLisp/CormanLisp.pdf

Oxdeadbeef ★★★
()
Ответ на: комментарий от anonymous

Тогда почему его так не любят галеры?

Потому что синтаксис не Си-подобный.

anonymous
()
Ответ на: комментарий от anonymous

А ты не смотри на скобочки. Ты смотри на отступы. Тогда лисповый код очень легко читается. Разность в восприятии кода опытными лисперами и новичками. У того же Пола Грэма есть замечание на эту тему

dave ★★★★★
()

А у меня плеер на лиспе, в котором нет ни одного вызова C, кроме системных вызовов. Так что я не впечатлен

anonymous
()
Ответ на: комментарий от RazrFalcon

Это и есть неймспейс.

Сейчас считается хорошим тоном - по типу как в С++, не импортировать весь неймспейс, а делать имена короткими, и обращаться к символам через префикс.

lovesan ★★★
() автор топика
Ответ на: комментарий от anonymous

Common Lisp самый высокоуровневый

Отсчасти это правда — например работа с числами, программисту не нужно думать об ограничениях размера числа.

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

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

взятый сам по себе, очень низкоуровневый

Рубям с питонами до изкоробочного Common Lisp как раком до луны.

anonymous
()
Ответ на: комментарий от dave

А ты не смотри на скобочки. Ты смотри на отступы.

Жаль что выкинуть скобочки лисперы при этом не догадались.

anonymous
()

Человеку, который считает это понятнее и лучше чем исходники FFmepg предлагаю сделать харакири

Pro100User
()
Ответ на: комментарий от Harald

Протри глаза. Там многословная нечитаемая низкоуровневая каша. Что впрочем обычно для си.

Если убрать комменты и функции обертки, получится вообще кромешный ад, как в других примерах, или как в ffmpeg-tutorial.

lovesan ★★★
() автор топика
Ответ на: комментарий от lovesan

Вот и выросло поколение красноглазых, который простейший язык, коим является С не могут освоить. Без обид, чувак, но это так.

Pro100User
()
Ответ на: комментарий от Pro100User

Я ни разу не фанбой лиспа, но по ссылке реально ужас. Для С нормально, конечно, но даже на C++/Rust будет в разы меньше кода.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Pro100User

Вот и выросло поколение, которое про лисп знают только «много скобочек»...

yyk ★★★★★
()
Ответ на: комментарий от Oxdeadbeef

CormanLisp: скачать бесплатно без CМС

правильная ссылка (Updated 11 days ago)

Вот в Corman Lisp можно сишный и ассемблерный код прямо в лиспокод вставлять:

в picolisp, кстати тоже можно:

https://picolisp.com/wiki/?src64

https://software-lab.de/doc64/asm

https://software-lab.de/doc64/structures

там даже OpenGL треугольник можно нарисовать (специально для лавсана): https://folk.uio.no/jkleiser/pico/gl/

и круг[/ur] (special 4 для anoniмус) через canvas с жабоскриптом{/url]

anonymous
()
Ответ на: комментарий от lovesan

повторяется слишком часто, затрудняет читаемость. имхо, без префикса с импортом читается проще.

anonymous
()
Ответ на: комментарий от Oxdeadbeef

самым полезным там ,по видимому, является парсер сишных врапперов, чтобы обвёртки генерировать полуавтоматически.

в picolisp правда, асм не полноценный, а виртуалки. транслятор полноценного в байткод — as excercise for the reader.

есть врапперы к сишке (из коробки, пример те же OpenGL привязки), к java, к javascript

anonymous
()
Ответ на: комментарий от anonymous

транслятор полноценного в байткод — as excercise for the reader.

хотя, прозреваю: проще fasm.dll использовать, и сишные врапперы к ней

в fasmg, кстати, судя по мануалу и примерам, кстати, довольно навороченный макроассемблер.

даже метаассемблер, я б сказал: различные конкретные асмы на нём реализованы как DSL.

то есть, транслятор в байткод того де picolisp-а (или там elisp-а) вполне себе просто на нём сделать.

занятно, из примеров под винду:

есть вызовы COM, импорт DLL, ресурсы и прочее.

то есть, лавсанов треугольник из DOORS тут нарисовать будет зело проще =)))

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.