FOSDEM 2023 | Liquidsoap与FFmpeg的高级编程使用方法

自上次Liquidsoap演示以来的三年中,我们的社区发生了很大的变化。本次我们将:提供有关大流行期间社区发展的最新情况,并回顾我们在两次 liquidshop 活动中学到的东西,这些活动将技术演示与实际用户项目演示相结合;其演讲介绍Liquidsoap语言的一些最新进展,以及如何使用它们来利用出色的编程语言思想来创建功能强大,丰富和安全的媒体项目脚本;展示与 FFmpeg 的新集成,以及 Liquidsoap 如何灵活和高级地使用出色的 FFmpeg 功能和各种API。

题目:Advanced programmable use of Liquidsoap with FFmpeg
演讲人:Romain Beauxis
来源:FOSDEM 2023 | Open Media devroom
链接:https://fosdem.org/2023/schedule/event/om_liquidsoap/
内容整理:胡玥麟

背景介绍:什么是Liquidsoap

Liquidsoap是一种编程语言。从技术上讲,它是一种脚本语言。Liquidsoap类似于TypeScript,但你不需要写类型,这里的所有东西都是字符串和整数。Liquidsoap允许你创建在线流,它不是一个低层次的工具。我们会把Liquidsoap委托给别人,目前的目标是授权用户继续使用该工具,这才是这个语言真正擅长的地方:编程逻辑与商业逻辑等。

图片
图片

这是一个完整代码的例子,我们可以用它来运行。其根据播放列表、文件、请求列表和来自HTTP的输入等各种内容制作了一个很好的playlist。

图片
  • 我们之前与法国广播电台合作。这就是我们2020年来的原因:liquidsoap是许多新工作的起点,因为它确实爆发了新的工作和兴趣周期。
  • 我们有很多社区增长,我们在股票的第一部分反映了这一点。
  • 然后我们做了很多新功能
  • 我们在这方面做了很多工作,最后我想谈谈未来的发展和我们预见的未来挑战

社区增长

图片

首先,社区发生了什么?所以我开始回顾过去3年的统计数据,它的增长相当稳定,除了我们做liquidsoap2.0的时候这里有一个小凸起,它是线性增长的。我们是一个让人们能够在线交流的项目。这是人们想要去的地方之一,与人们交流,并试图接触,建立联系,保持联系。所以我们有很多人向你推销,比如我想做一个在线流媒体。用户想把朋友的音乐放进去听等。

图片

第二个影响是我们有很多人和时间。但我们很忙。我们做的其中一件事也是因为我们没有那种面对面的会议。该项目的另一位共同开发者决定,我们应该做一个在线研讨会,这是一样的。这真的很好,因为它真正让我们认识了我们的社区。

我认为这个项目非常好的一点是,它既是一个技术项目,但我们的许多用户实际上并不是技术人员。或者我们有一些可爱的项目,比如最好的一个是巴塞罗那的社区广播网络,他们在线报告城市里发生的事情。下面一个是另一个匈牙利社区电台。所以很高兴能见到他们。我认为我们非常重视这一点。我们有许多工业行业的用户,但这也是我们项目的核心动机之一。

图片

最后,我们花了很多时间写了一本编程书,专门研究音频流、媒体流以及如何使用 Liquidsoap。它在很多层面上都非常有用。其中之一是,它迫使我们重新思考我们的IPI并对其进行重组。中让我们做一个很好的模块,可以很容易地做到这一点。它也让用户更加自信。因为正如我所说,我们的大多数用户都不是程序员。所以他们来到这里,他们就像从来没有接触过一行代码。我该怎么做?所以这本书是一个很好的起点,让人们对这个项目更感兴趣,更有信心。

新功能

首先,我们做了很多语言上的改变,因为很长一段时间,或者更多地专注于功能,只会有很多输出。但是当你开始想要实现更复杂的东西时,你还需要强大的语言,工具箱的扩展。我们还做了大量的FFMpeg integration。这就是我接下来要讲的两件事。首先,语言变得更具表现力。你想让你的用户写的代码是好的,可读的,他们可以理解,这是强大的,但它不一定要有一百万行来做一个简单的事情。

图片

像这样简单的事情:念出一份名单。你有一个列表,你想得到第一个元素,最后一个元素。我们以前可以这样做,但你将使用函数,这很复杂。这真的可以帮助用户将代码视觉化,就像这样,我明白这是在做什么,我有更少的行来写它。我们实现了很多我们缺少的类型,例如,一个空变量,很多都是有意义的,像JavaScript或其他动态脚本语言。

图片

当你开始编写实际可用的代码时,你需要这些东西,而且它们非常有用。你可以编写带有可选参数的函数,并且你可以确切地说用户没有传递参数。让我们来看看基本的编程语言特性。我们做的另一件非常有用的事情是一个新模块:语法。这基本上意味着语言中的任何值都可以附加方法或属性。所以这里你有一个字符串。字符串在这里有两个方法属性:持续时间、浮点数,BPM基本上是一个面向对象的ID,但不是真正的对象,我认为这更像是JavaScript哈希。这意味着您可以使用基础值将歌曲标题打印为字符串。这真的很有用,因为当你想为用户创建易于使用的东西时,你需要组织你的语言。你需要有模块,你需要有这些模块的功能。

图片

另一个典型案例是,现在你可以将事情专业化。你有不同功能的资源。所有源都有跳过功能,这意味着您可以转到流中的下一首曲目。您可能拥有具有特定功能的源。例如,您可以有一个源,它可以将我插入到使用此操作符创建的数据中。它将被添加一个新功能。让我们调用插入元数据。现在你可以用它了。而不是有10亿个基于API的通用调用,你可以真正开始将特定的使用附加到特定的变量上,然后使事情变得更紧凑,更专业,并且对清理你的API非常有用。

图片

我们在模块之后做的另一件事是,现在我们能够描述高层次的东西。所以在静态中,任何类型的语言都会传递Jason,这是非常痛苦的事情之一。为什么Jason可以是任何东西?我们确实想知道name是一个字符串。我们真的很想知道这个名字是一个版本。所以在像camel这样的语言中,你必须传递一个对象,遍历键,验证它是一个字符串。每一个分支你都需要考虑你在做什么。所以我们和我们的用户,而不是程序员。我们该怎么办?我们试图找到一个可读且易于使用的原语。你正在读一个解析语句,它说我想要解析,我想要得到模块,它将有一个名称,一个版本。另一个脚本属性本身是作为测试函数的模块。这是你在包判断和节点模块中得到的。这是一个类型和符号,我希望名称是一个字符串,版本是一个字符串,脚本是一个带有字符串测试的模块。

在运行时,我们将获取所有这些信息。我们试着暂停一下。我们要做两件事。如果我们在Jason有我们需要的东西,你可以继续做脚本。如果我们不这样做,我们提出一个错误,你可以抓住这个小时,并与它推理。但这确实使用户更容易解析Jason,这一点很重要,因为当您想要连接许多互连系统以进行流式传输时,您希望能够与Jason API进行对话,这非常有用。

FFmpeg integration

现在我想谈的另一个令人兴奋的部分是FFmpeg integration。这是在法国广播电台之后开始的,因为他们对它有强烈的需求。我们开始研究来自SFM PEG的APA.FFM PEG的API非常好。这是惊人的好。对我们来说,这在C语言中是非常低的水平,因为我没有提到,但Liquid Sub在更多的语言中实现。所以我们需要谈论低层次的实现才能真正高效。

图片
图片

Python和C语音对我们来说真的很简单,但它也非常抽象,这对我们很有帮助,因为我们想做我们擅长的事情,那就是编程语言方面,逻辑,类型,函数,但我们不是多媒体实现方面的专家。我们不想这么做。我们希望找到比我们做得更好的人,并与他们交流。这就是AFM PEG数据包的API,它是一小部分编码数据。它包含,一个MP三帧,一个视频A或B帧,所有我不想知道的抽象的东西。但他会告诉我两件事:你的数据和指向演示时间戳的指针。这里的东西告诉我,这是你想要在你的流中插入这个包的时间。这是数据。这就是我需要知道的。因为这样我们就可以用它建造一条stream。我们可以通过所有不同的运营商传递这个数据包。

图片

FFmpeg integration的另一件事,这就是我们开始做的原因。开始实现一个新的Ancholar,它基本上反映了你在FFA大公共线中看到的所有参数。我们认为,我们支持将其作为这些编码器中的一个选项。为什么我们认为这是?因为FFM PEG做得非常好的另一件事是描述他们的API。但这是AC结构,这里有H 264编码器的所有参数名称,描述类型,以及最小值和最大值,我们基本上需要为它编写一个接口。它也适用于filters。

图片

它基本上是一个编程编程接口,你需要知道的信息是不可读的,然后我们可以做的是,这是一个在 Liquidsoap 中实现的FFM PEG过滤器。如果你能阅读,你会看到过滤器中的每个参数,比如速度,都是可选的浮点。它没有默认值。

图片

它允许我们做的一件事就是对影响原语(如过滤器)进行脚本操作。因此,我们采用一个源,我们想要定义一个滤波器,它是一个滤波器,后面是一个高通和一个输出。你需要一个图表。这只是CAPI的一部分,你需要一个消息来源。你从它创建一个新的输入。这是FFMPEG方面。这就是他们所说的音频输入。将其传递给带有参数的过滤器。

图片

这是另一个过滤器。它接收音频,将其分为两个源。其中一个会穿过flander。另一个是高通(high pass)。这是所需的一些转换。我们现在描述的是一个分支的图,进行两次过滤,然后再回到一起。这是一个简单的,但你可以用它来做。我不知道,比如多频压缩机。你可以在FFM PEG中这样做。它更结构化,可读性更强,而且类型较为安全。

图片

接下来,我想谈谈我们是如何在某个时候实现的。这是我们的时间表。从这里开始,我们一直走到这里。如果你发挥你的想象力,所有这些水平的小点都是来自FMP的音频包,垂直的是视频帧。这是你的数据流,你把它发送到任何东西。我们所做的是找到视频速率和音频速率之间的最小公分母。我们需要找到一小块时间来包含相同数量的音频和数据。大多数情况下,对于我们内部的参数,它将为0.04秒。这就是我们所说的框架。然后,流循环的想法是转移过去,并准备好所有的输入,每隔0.04秒重新创建一帧。

图片

这里有一个例子。我们有一个简单的脚本。他做两个输出。他想保存到一个文件并发送到一个不错的演员表服务器。后备是将采用第一个可用源的操作符。第一个是它是一个输入,它是一个港口,所以它是我们可以接收Ice Cast客户的运营商之一。假设你想让ADJ连接到你的收音机。您可以将它们定向到此输入。当我开始传输数据时,回退将立即传输数据。如果它不可用,我们有一个请求队列,你可以,假设你想花一段时间尝试发送一辆卡车,在下一辆之后立即播放。每隔一段时间,你可以在这里发送请求。否则,我们在目录中只有一个文件的播放列表。如果这不可行,我们有一些退路。

未来的发展与挑战

图片

基本上,在FFMPEG中,你有所谓的额外数据。如果您使用MP4介质,则解码所需的所有内容(如F MAN表)都在报头中,首先进行通信,然后所有数据包和之后的帧都没有它。但是如果你使用MPEC TS,因为MPEC团队没有全局标题,每一帧都会有该数据。这是一个问题,因为现在我们做了FFM PEG没有做的事情,即在两个不同的位流之间切换。

图片

我们必须在这里插入这些过滤器,以确保它们始终存在,这对我们来说是一个问题,因为这意味着用户必须考虑低级别的内容。这是其中一个问题的一部分,我想知道FFMPeg是否会找到一些美丽的抽象概念。我们有一个带有轨道的2点X版本。所以你可以操纵和评论不同的音轨,比如说,用法语、英语和意大利语做一个MKV,并以不同的格式包含它。

这个项目的一个问题是我们已经40岁了。在某些时候,我们需要考虑继续前进。所以到目前为止我们所做的是做了大量的自动化,这很强大。它可以让我们专注于代码,少做两件事。我们已经实现了自动化,我们每次都做CI来运行所有的测试。我们已经批准了我们所拥有的自动化测试的数量,以便我们能够非常快速地捕获所有内容,而不是依赖于大量的手动测试。但就挑战而言,考虑我们如何能够引入更多的开发人员。

问答环节

Q: “Liquidsoap能够使用外部自动化控制运行脚本吗”

我们有很多不同的选择。传统的方法是一个远程登录连接,但我们有一个功能齐全的HTTP服务器,所以你可以编写自己的API端点。基本上,因为每个源都有自己的方法,现在附加到它,您可以运行脚本。你基本上可以拿一个源代码,然后使用一个函数可以插入元数据。当然,我们有很多不同的选择。

Q: “能不能用一种Liquidsoap来做静态操作(static operations)”

答案是肯定的,你可以用它运行一个时钟,这不常被测试。当我重写流媒体时,这是我想带来更多的东西的一部分。大多数情况下,我们预计这需要一段时间,但当你想跑得非常非常快时,你会遇到非常不同的竞争条件,但它并没有经过很多测试。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论