jamrtc - Livebrits for Live Musicians

2021-03-19 03:48:52

这是一种尝试使用WebRTC作为一种技术来创建一个简单的原型,以便使用WebRTC作为一种技术,特别是为了目的,利用Janus作为开源WebRTC服务器。这项努力使用Janus而不是P2P或另一台服务器的主要原因只是我的主要作者,即Janus本身的主作者,所以'我最熟悉的是什么:你'当然可以自由地尝试并提出使用不同后果的不同尝试,或者根本没有后端(我们越多使用WebRTC来帮助音乐,更好!)。

它'非常早期的阶段,并且主要是为了作为一个游乐场,享受有兴趣的开发人员,音乐家和更多的迂回者,来实验它是否是一个可行的道路和第39条。

在2021年,我在Fosdem提出了一个叫做的歌词WebRTC帮助音乐家?,试图通过一些常见的基于音乐的场景,以及WebRTC在需要实时通信时如何在互联网上实现它们,特别是在光线下影响Covid Pandemic在音乐界的影响。该演示文稿主要是概述,并且可能询问更多的问题,而不是回答的问题,但它确实包含一个关于Jam会话的一节,因为考虑到技术的实时性质,我们可以帮助。

它始于几个假设,它们最重要的是那个浏览器(通常是WebRTC应用程序的主要目标)不是参与JAM会话的好装置:事实上,他们实施的音频管道呈现出一些障碍物,就像太多障碍滋补他们捕获的音频(AGC,AEC),太多延迟(集成缓冲区和同步机制),无法轻松捕获通用设备(为通用麦克风,主要是通用麦克风),并且无法与下延迟音频系统交互在操作系统上(例如,插孔音频连接套件)。因此,这个想法是尝试和提出本机应用,以便尝试克服上面的障碍。这就是这个repro试图为之提供的基础。

这种努力不是试图替换任何东西,更不用说众所周知的应用程序:例如,我从未使用过它,我很清楚jamulus在音乐家中普遍存在,每天都会使用它。哎呀,我甚至想到这个项目" Jamus" (如在Janus的果酱中)然后改变了我的想法,因为它听起来像Jamulus本身一样! 😁该项目的唯一目的是试验WebRTC(其他工具未建立)还可以帮助建立在要求方面可比的东西,特别是考虑到WebRTC作为其中的一部分堆栈在这样的场景中:如果它增长进入那样的东西,那么很棒,而且那不是这一点。

如果你'重新寻找你可以立即使用的东西,并且已知工作很大,那么Jamulus或类似的应用程序确实是你应该使用的!如果你'对WebRTC和音乐的好奇,那么这是一个实验的好地方,知道它并不多于现在的玩具。

为什么不? 😁笑话分开,主要原因是,作为技术,WebRTC应该适合这份工作,因为它主要目的是实时交换实时音频/视频/数据流。虽然它和#39; s大多用于传统用例,如会议,流媒体和类似的东西,这些工具在那里在&#34中做某事;创意"部门也是如此。

除此之外,使用WebRTC为工作有一些其他优势。如果音乐流'重新交换是基于WebRTC的,例如,通过像Janus VideoOom或其他人这样的SFU,那么它很容易分发与&#34的相同的流。端点以及浏览器,移动端点或其他端点。这意味着您可以构建一个简单的Web应用程序,以服务于小型或更大的受众,例如,其对超低延迟的要求不会与所涉及的玩家的要求不同。同时,WebRTC流易于在其他框架中集成以进行进一步处理,例如,用于混合,处理,转码或广播目的,这使其成为其他要求和用例的有用工具:您可以找到一些示例我在ClueCon TGI2021(幻灯片)做了Janus Workshop。

由于预期,这项努力背后的主要思想是尝试编写本机WebRTC应用程序以尽可能优化该过程,尤其是涉及延迟的地方。我决定在@gstreamer和#39; s webrtcbin上基于一些原因:

我已经有了一点经验,在其他项目中简单地使用它;

它比较容易在GStreamer' S构建块上构建一个GUI(我在这里使用GTK + 3.0)。

与此同时,我想使用Janus作为参与会话中的所有端点的参考服务器。这导致了你可以看到的图表:

简而言之,这个想法是将基于GStreamer的本机应用程序加入Janus VideoOom,然后:

通过同一服务器订阅来自其他参与者(例如,鼓和低音播放器)的媒体。

我构思了应用程序,不仅允许您分享乐器,而且还有一个并行频道与其他参与者互动。因此,默认情况下,启动jamrtc时它将创建两个WebRTC PEERConnections:一个要发送您的网络摄像头+麦克风,另一个用于将乐器发送为仅音频流;当然,您可以选择是否要发布所有内容,只为某种东西或根本没有。当其他参与者加入会话时,构思该工具以自动订阅它们'重新分享:然后在非常简单(和超级丑陋)UI中呈现所有馈送,其中音频流通过波臂可视化。

重要的是要指出,当使用千斤顶作为音频后端时,jamrtc会设想,不要自动选择要捕获的设备:这取决于您手动创建所需的连接。我稍后再回到这一点,当解释如何测试目前的目前'那里。

确保安装了库的相关开发版本,然后在尝试构建jamrtc之前,保持事物简单的makefile实际上是非常原始的和天真的:它使用pkg-config来检测库的安装位置,但如果有些不可用它仍然会尝试继续(并且可能会失败,可能会误导错误消息)。所有图书馆都应该在大多数REPOS中提供(它们肯定是在Fedora上,这是我每天使用的,以及我的知识Ubuntu)。

一旦安装了依赖项,您需要做的就是构建jamrtc即可键入:

这将创建一个jamrtc可执行文件。尝试启动没有参数的启动应该显示一个帮助部分:

[lminiero @ lminiero jamrtc] $ ./jamrtcusage:jamrtc [选项?] - 与Janus的Jam会话!帮助选项:-h,--help show optionsApplication选项:-w,-ws -ws的Janus Websockets后端地址(例如,WS:// localhost:8188;需要)-R, - 高级空间加入(例如,1234;必填)-d, - display显示名称用于房间(例如,lorenzo;需要)-m ,--no-mic don' t添加了本地麦克风的音频源(默认值:启用音频聊天)-w,--no-webcam don' t为本地网络摄像头添加一个视频源(默认值:启用视频聊天)-V, - 视频设备视频设备用于视频聊天(默认:/ dev / video0)-i, - 仪器的 - 仪器描述(例如,吉他;默认:未知)-s, - 立体仪器是否是立体声或单声道(默认:单声道)-I,--no-internirmon don' t为本地仪器添加一个源(默认值:启用仪器)-b,--jitter-buffer抖动缓冲区用于RTP,以毫秒为单位(默认值:0,无缓冲)-c,--src-opts自定义预防rties添加到jackaudiosrc(仅限本地乐器)-s,--stun-server stun服务器使用,如果有的话(hostname:port)-t,--turn-server转动服务器使用,如果有的话(用户名:密码@主机:端口)-L,--log级日志记录级别(0 =禁用日志记录,7 =最大日志级别;默认值:4)-j,--no-jack用于测试目的,使用autoAudiosrc / autoAudiosink(默认:使用插孔)

目前,您只能通过命令行参数自定义jamrtc在启动时的行为,因为GUI或参数中没有可视设置,您可以动态调整。这意味着有一些必需的参数来启动工具,即:

所有其他参数都是可选的,并允许您自定义要操作的操作方式。例如,预期,默认情况下,该工具将尝试捕获网络摄像头和麦克风(用于与其他参与者的视觉交互)和本地仪器:您可以使用可用参数禁用其中的任何一个,只能发布您想要的发送。其他论点也应该是非常自我解释的。

注意!一个重要的选项是-j(或--no-jack)。默认情况下,jamrtc将假设插孔运行,因此将尝试将其用作捕获并呈现音频流:如果您只想在没有杰克的情况下测试此标志,那么通过此标志将使Jamrtc使用AutoAudioSRC和AutoAudioSink,而不是音频从而在理论上选择了无论你在系统中使用什么。考虑到这将限制您对捕获设备的控制(AutoAudiosrc如何选择它想要的并且可能不是您的吉他😁)的控制,并且延迟也可能更高。

连接到1234室的当地Janus实例,如" Lorenzo"并通过杰克发布所有内容,呼叫仪器"吉他"

请注意,1234房间是我们在线演示的默认房间,所以您' ll在它中找到随机的人,这只是通过他们的浏览器加入。因此,它'除非你知道,除非你知道除了你和你想测试之外的其他人,否则它是一个糟糕的想法。您可能希望部署自己的Janus实例进行测试。

连接到1234室的当地Janus实例,如" Lorenzo"并发布所有内容,但使用不同的视频设备

连接到1234室的当地Janus实例,如" Lorenzo"并且只发布网络摄像头和仪器(无麦克风)

连接到1234室的当地Janus实例,如" Lorenzo"并且只发布您的乐器(无麦克风/网络摄像头)作为立体声

与Janus Repo中的默认videoroomtest.html演示页面的修补程序,或为此目的写自己的Web应用程序。

注意:如果您计划编写自己的基于Web的前端,它的值得指出jamrtc"滥用行为"录像室API的显示字段以关联多个馈送。事实上,由于默认情况下,默认情况下,默认情况下发布了两个单独的PEERConnections,一个用于网络摄像头+ MIC,另一个用于仪器:为了允许其他参与者来自您,Jamrtc实际上使用序列化的JSON对象序列化为字符串作为所使用的显示器对于每个发布者流。在设计基于Web的应用程序时,应考虑到这一点,因为否则来自同一参与者的不同的PEERConnection将被呈现为单独的参与者(这是默认的视频演示确实做的)。

坦率地坦率地,在所有自我贬低的诚实中,没有什么可以写回家的,但作为一个人的开始(以及对GUI发展的非常少的人)它'不是那个可怕的......

假设你和#39;重新分享一切,你' ll在顶部看到你的视频,然后是麦克风的视觉表示,最后是您乐器的视觉表示。如果其中任何未分享,他们刚刚赢得' t在那里,相关标签将相应更新。

当别人加入会话时,将出现一个新列,媒体将显示它们'重新分享:

我勾勒出目前的窗帘,目前它只适应四个参与者,无论是活动还是只有与会者,他们是'当时参与者加入的那一刻,他们的媒体是独立的,在单独的浮动窗口中独立呈现。希望后来可以做出更具活力和自适应的,但这不是我现在真正关心的。

如预期的那样,GUI目前是被动的,意思是那里的被动,没有互动组件:没有菜单,没有菜单,没有按钮,你可以在那样调整或任何东西,你所看到的是你所看到的。自从我' m非常新的GUI开发,特别是GTK,这是​​我可以提出的最好的:此外,代码本身可能不是很好"分离"在逻辑与渲染方面,因此重构UI可能不是那么容易。无论如何,来自世界卫生组织的反馈'在这个部门的智慧肯定会有助于使未来更加有用,当时媒体本身比今天更好!

注意:有时,当人们加入一些媒体时,没有立即渲染,您必须尽量减少应用程序并再次引入它:这可能与我的差的UI编码技能有关,因为它感觉像在某处丢失的信息一样一些东西。

如预期的那样,当使用千斤顶来处理音频时,jamrtc会自动将订阅者连接到扬声器,但不会自动连接输入:那样,您可以做到,因为您可能希望实际分享您的特定于某些特定的东西设置(例如,吉他与吉他的原始输入与吉他是什么)。

假设你'重新要求jamrtc分享麦克风(用于音频/视频聊天)和仪器,这就是您在杰克中所看到的:

如您所见,有两个插孔输入节点,两者都没有从任何源接收输入。您可能想要做的第一件事是馈送仪器节点(称为" jamrtc guitar"这里)在此图片中:在这个例子中,在这个例子中连接吉他,这是从我的原始吉他饲料FOMETRITE SOCECARD;为了听到我的' m播放,我也将吉他连接到扬声器。重要的是,我们开始喂养仪器节点的那一刻,它将通过WebRTC发送到服务器,依此类别的参与者:

由于我们希望分享我们的麦克风来与其他参与者聊天,我们可能需要一个应用程序来帮助:在这种情况下,实际上,捕获设备是我的焦点声卡,这不是我的麦克风的位置。具体而言,我想使用我的笔记本电脑的麦克风,所以我可以使用像Zita-A2J这样的工具,将ALSA设备添加为额外的捕获设备,例如:

此时,我可以将其连接到jamrtc聊天节点(调用" jamrtc mic"),这将开始通过WebRTC发送我们的声音:

当其他参与者加入时,jamrtc通过将相关的jack笔记连接到扬声器,而不是它的主要目的是主要目的:

考虑到杰克如何工作,你当然是免费的(也)将输出连接到别的东西,例如,DAW。

这应该非常多被认为是一个alpha,就像它"作品",我仍然不满意。主要问题显然是,尽管我试图减少它,即使在当地环境中也仍然过高。我仍然试图弄清楚这个问题的地方,因为它可以是GStreamer管道中的东西(WebRTC堆栈?缓冲区?队列?队列?杰克集成?),在Janus(在那里添加延迟?)或WebRTC本身。我不知道GStreamer内部人士知道什么是可以改进的GStreamer内部,我已经禁用了WebRTCBIN抖动缓冲区,但不确定它有很多帮助),所以希望通过分享这项努力并让更多的人分享并让更多的人与之玩,特别是那些拥有任何不同技术的知识,我们可以提出可以真正用在那里的东西。

请注意,一个其他已知的限制是,出于框中,此目前仅适用于Linux:这是因为我们显式使用可能只在那里提供的一些GStreamer元素(例如,jackaudiosrc,xvimagesink,xvimagesink,xvimagesink)。这是非常简单的,因为Linux是我每天使用的,我熟悉的东西:除了我知道杰克允许Linux上的低延迟,我不知道其他操作系统上通常使用什么目的。您是否希望在其他系统上尝试并在其他系统上建立它,您可能需要调整代码:当然,如果您在Windows和/或Mac OS上运行,i' d很高兴有变化有助于回购!

除了这些更基本的方面,还有其他东西我' d想早晚添加到工具中,在与可用性相关的粒子中,例如:

目前'没有组,聊天或邮寄列表,现在:我不会在短期内预测需要一个,但如果足够的人表现出兴趣,我们就可以解决问题(也许是矩阵上的房间,为FOSDEM工作了很好。与此同时,如果您有想法或反馈,请随时打开他们可以讨论的问题,如果您修复了一些出色的错误(其中有很多,i' m确定),请执行提交拉请求。在Linuxmusicians上的一个线程讨论了在线播放音乐的线程:LinuxMusicians本身可能是一般讨论该工具的另一个地点,也许是在专用线程中。