질문이 이상한 것 같습니다. 잠시 시간을 내어 읽어보시기 바랍니다.
1-ffmpeg 명령이 포함된 .sh가 있습니다(이 명령은 작동하며 여기에서는 모든 것이 정상입니다).
2- 녹음을 시작하기 위해 API 호출을 통해 .sh를 트리거합니다(여기서도 잘 작동함).
3- ffmpeg가 .mp4 생성을 시작합니다.
4- .mp4를 .m3u8로 심볼릭 링크하고 싶습니다(Safari는 .mp4를 매니페스트로 읽지 않기 때문에).
** 궁금하실 수도 있습니다. .sh의 ffmpeg를 변경하여 .m3u8을 출력하면 어떨까요?
*****나는 노력했다그러나 알 수 없는 이유로 스크립트는 .mp4를 제외한 모든 확장자를 좋아하지 않습니다.
***** .mov .mkv .m3u8을 출력하면 => 이유는 모르겠지만 10초 후에 멈춥니다 :(
***** 내가 찾은 해결책은 ffmpeg가 .mp4를 생성한 다음 hls.js가 사파리를 포함한 모든 브라우저에서 재생할 수 있도록 .m3u8에 대한 심볼릭 링크를 생성하는 것이었습니다...
나는 심볼릭 링크를 생성하기 전에 이 .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에게composite.sh를 기록하고 트리거하도록 지시합니다. ---- 추가로 : SERVER1은 x초 동안 대기하고 원격으로 SSH를 통해 심볼릭 링크를 생성합니다. -4- .sh가 ffmpeg를 시작합니다. -5- ffmpeg가 채팅이 진행되는 동안 .mp4를 생성합니다. -6- 내 수정 사항(아래 참조)은 HLS 형식 스트림을 생성하는 것입니다. -7- 다른 사용자가 브라우저를 통해 .m3u8에 액세스할 수 있도록 합니다. (페이지에는 .m3u8을 재생하기 위한 hls.js가 있습니다.) {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초를 기다리는 것"입니다... 서버가 매우 바쁘고 x초 후에 .mp4가 생성됩니다... 이로 인해 재생 문제가 발생합니다. 흐름.
답변1
귀하의 질문 전체를 읽지 않았다는 것을 인정해야하지만 제목으로 판단하면 다음과 같습니다.
while [ ! -f /tmp/originalfile ] ; do sleep 1 ; done ; ln -s /tmp/originalfile /tmp/symlink
답변2
당신은 그것을 사용할 수 있습니다inotifywait
상위 디렉터리에 파일이 생성될 때까지 기다립니다.
inotifywait -e create /path/to/parent