이제 거의 막바지에 다다랐다.

 

지속적으로 스트리밍을 하도록 하려면 m3u8파일이 계속해서 바뀌게 되는데, 이거를 위해서 manifest 파일도 계층구조를 좀 가져야 했다.

 

playlist라는 manifest가 기본적으로 있고 이녀석은 chunkData라는 녀석을 보라고 한다.

 

그리고 chunkData는 스트리밍이 됨에 따라서 ts파일이 계속 슬라이딩 윈도우 마냥 진행되면, HLS 클라이언트는

 

이를 알고 알아서 지속으로 chunkData를 업데이트 하면서 ts파일들을 버퍼링해서 재생을 시킨다.

 

 

요녀석을 구현하기 위해서 했던 짓들을 커밋 이력을 보면서 다시 복습을 했는데, 이걸 잘 몰라서 삽질을 한번 했던 것 같다.

 

m3u8라는 Nodejs 모듈에서 m3u8 파싱 기능을 제공한다. 이를 이용해서 직접 m3u8 파일을 한땀한땀 변경하면서 작업을 했던 것 같은데, 아마 ffmpeg에서 이것 또한 잘 해주는 그런 기능이 있었던 것 같다.

 

 

그리고 나서 테스트를 했다가, 클라이언트 단에서 재생이 자꾸 끊기는 현상이 있었는데,

 

이유를 당최 몰라서 해메다가 hls-client javascript 코드를 한번 까보면서 알게 되었다.

 

기승전 코드까보기..ㅠㅠ

 

코드중에 logger와 같은 객체가 있었는데 안에 모두 빈 함수가 있었었다.

 

그 함수들을 console.log와 같은 함수로 바꿔치기를 한 뒤 실행을 해 보니, 브라우저에서 콘솔로 warning들이 떳었다.

 

 

 

그 원인은 즉슨, 클라이언트에서 몇초마다 새로운 음악파일을 서버로 보내고, 서버에서는 각각을 ffmpeg으로 가공을 했다.

 

그런데 다시 hls client에서는 다른 파일에 대한  ffmpeg-ts가 들어오니, 음악의 흐름이 끊긴줄 알게 된 것이다.

 

 

그래서 이러한 현상을 해결하기위해서 ffmpeg에서 가공할 때 omit_endlist 라는 옵션(오래되서 가물가물하긴 한데 아마 맞을 것이다)을 추가해서 이러한 현상을 해결했던 것 같다.

 

 

어쨋든 이런식으로 해결을 하다보니 지금 상태의 코드가 되었다.

 

음질이라던지 내부적으로 부족한점이 매우 많지만, 그래도 어쨋든 대충이라도 동작은 하기는 했다.

 

중간에 삽질도 많았지만 여러모로 배우기도 했다.

 

더 이상 까먹기 전에 블로그에 정리를 했으니, 이 내용은 이만 당분간 묻어두도록 하겠다.

 

 

최종 코드 스냅샷이다.

 

https://github.com/Einstrasse/hls-service/tree/d92a3f6abb378cf0947c3ba928f9d8b57d3a8118

 

Einstrasse/hls-service

Nodejs base hls server. Contribute to Einstrasse/hls-service development by creating an account on GitHub.

github.com

 

+ Recent posts