Linux

Linux有沒有一種方法可以等待創建文件以建立符號連結

  • April 2, 2021

這個問題看起來很奇怪,請花點時間閱讀

1-我有一個 .sh 包含一個 ffmpeg 命令(這個命令有效,這裡一切正常)

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 not found….如果我手動等待 .mp4 然後執行相同的命令 => 它可以工作。

所以在這種奇怪的情況下,我發現在創建符號連結之前睡眠 x 秒是有風險的,而且不是很好的做法……有沒有辦法通過 linux 命令循環直到文件到達符號連結它?

——– 編輯 1 —————-

上下文:SERVER1 => 網站 SERVER2 => openvidu 與 docker 一起執行

-1- 使用者創建一個聊天室(SERVER2) -2- SERVER2 向 SERVER1 發送一個 webhook,告訴會話開始 -3- 然後,一個 API 呼叫:SERVER1 告訴 SERVER2 記錄並觸發了composer.sh —- ALSO: 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 秒後生成……它會產生問題用於播放流。

我不得不承認我沒有閱讀你的整個問題,但從標題來看這應該有效:

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

您可以使用inotifywait等到在父目錄中創建文件:

inotifywait -e create /path/to/parent

引用自:https://unix.stackexchange.com/questions/643159