因为 soluna 支持写 app 应用,而我最近正好打算为我父母和妻子编写一个抖音直播录制工具 app,想要试试。不过这有个问题,就是录制部分需要使用 ffmpeg 来进行,而 ltask 虽然可以 N:M 调度 lua 虚拟机,但是如果像 ffmpeg 这种阻塞调用,就会导致线程阻塞了。
当然,解决方法也是有的,比如引入事件循环,将 fork 的进程挂载到事件循环上,比如使用 bee.lua 就是个不错的选择。不过这意味着需要修改 soluna 的源码,在虚拟机注入 bee.lua。但我又不太想修改源码。首先这个功能对于 soluna 本身没有什么必要,因此我倾向于不到上游提需求;其次,我也不想修改源码,方便后续同步上游最新更新。
这时候我突然理解了 C 语言的一个优点了。
ltask 预留了一个 -DLTASK_EXTERNAL_OPENLIBS 选项,soluna 本身的库就是通过 -DLTASK_EXTERNAL_OPENLIBS=soluna_openlibs 在编译时注入符号的。
这意味着,我只需要把 soluna 设置为我的子仓库依赖,然后创建一个例如 soluna_app.c 的文件。在这个文件里面我创建一个 soluna_app_openlibs 函数,它内部除了调用 soluna_openlibs 还注入 bee.lua。最后在编译时,我把定义改成 -DLTASK_EXTERNAL_OPENLIBS=soluna_app_openlibs 从而就可以实现不更改源码,增量编译增加功能
 
 
Back to Top