这个问题看起来很奇怪,请花点时间阅读
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