Linux 有一种方法可以等待文件创建来创建符号链接

Linux 有一种方法可以等待文件创建来创建符号链接

这个问题看起来很奇怪,请花点时间阅读

1-我有一个包含 ffmpeg 命令的 .sh (这个命令有效,这里一切正常)

2-我通过 API 调用触发 .sh 来开始录制(这里也很好)

3- ffmpeg开始生成.mp4

4-我想将.mp4符号链接到.m3u8(因为safari不会将.mp4读取为清单)

** 您可能想知道:为什么不直接更改 .sh 中的 ffmpeg 来输出 .m3u8

*****我确实尝试过但由于未知原因,该脚本不喜欢除 .mp4 之外的任何扩展名

***** 如果我输出 .mov .mkv .m3u8 => 我不知道为什么,但它在 10 秒后停止:(

***** 我找到的解决方案是让 ffmpeg 创建 .mp4,然后创建到 .m3u8 的符号链接,以便 hls.js 可以使其在所有浏览器(包括 safari)中播放...

我正在寻找一种方法来等待此 .mp4 存在,然后再创建符号链接。

我之前测试过创建符号链接,ln -s fileThatDontExistsYet.mp4 NewFile.m3u8但是当尝试访问 NewFile.m3u8 时,结果出现 404 未找到...如果我手动等待 .mp4,然后执行相同的命令 => 它可以起作用。

所以在这种奇怪的情况下,我发现在创建符号链接之前睡眠 x 秒是有风险的,而且不是很好的做法...有没有办法通过 linux 命令循环,直到文件到达符号链接为止?

-------- 编辑 1 ----------------

上下文:SERVER1 => 网站 SERVER2 => 使用 docker 运行的 openvidu

-1- 用户创建聊天室 (SERVER2) -2- SERVER2 向 SERVER1 发送 Webhook,告知会话开始 -3- 然后,API 调用:SERVER1 告诉 SERVER2 进行记录并触发composed.sh ---- 另外: SERVER1 等待 x 秒并远程 ssh 创建符号链接 -4- .sh 启动 ffmpeg -5- ffmpeg 在聊天进行时创建 .mp4 -6- 我的修改(见下文)是生成 HLS 格式流-7- 其他用户通过浏览器访问 .m3u8(页面有 hls.js 来播放 .m3u8){SERVER1} -8- 我可以实现 4 秒的流延迟,这还不错;)

查看完整原始 .sh 的链接如下:https://raw.githubusercontent.com/OpenVidu/openvidu/master/openvidu-server/docker/openvidu-recording/scripts/composed.sh

****** 第 79 行 ****** 我已更换

-c:a aac -c:v libx264 -preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p

有了这个

-c:a aac -c:v libx264 -movflags +dash 
-preset ultrafast -crf 28 -refs 4 -qmin 4 -pix_fmt yuv420p 
-tune zerolatency -c:a aac -ac 2 -profile:v main 
-flags -global_header -bufsize 969k 
-hls_time 1 -hls_list_size 0 -g 30 
-start_number 0 -streaming 1 -hls_playlist 1 
-lhls 1 -hls_playlist_type event -f hls

这看起来很奇怪,但它有效...我唯一担心的是“等待 x 秒”来创建符号链接...服务器非常繁忙并且 .mp4 在 x 秒后生成...这会产生问题用于播放流。

答案1

我必须承认我没有阅读你的整个问题,但从标题来看这应该有效:

while [ ! -f /tmp/originalfile ] ; do sleep 1 ; done ; ln -s /tmp/originalfile /tmp/symlink

答案2

您可以使用inotifywait等待父目录中创建文件:

inotifywait -e create /path/to/parent

相关内容