Example project how-to build HLS-streaming server using oat++ (AKA oatpp) Async API.
Live stream is tested with Safari-Browser and VLC-player
See more:
Server generates infinite .m3u8 playlist from the pre-generated
playlist_live.m3u8
file in the video
folder.
File video/playlist_live.m3u8
together with video chunks is generated using ffmpeg
.
Server is built using oat++ Async-Api and has following endpoints:
("GET", "/", Root)
- Starting html-page aka index.html("GET", "video/*", Video)
- Embedded video html-page("GET", "media/live", Live)
- Infinite HLS playlist for live-stream describing video chunks("GET", "media/*", Static)
- Endpoint serving media files with range requests support
|- CMakeLists.txt // projects CMakeLists.txt
|- src/ // source folder
|- test/ // test folder
|- utility/install-oatpp-modules.sh // utility script to install required oatpp-modules.
|
|- video/ // media files and playlists here
|- generate_pls.sh // example how to use ```ffmpeg``` to generate initial playlist and video chunks
|- playlist_live.m3u8 // playlist used to generate infinite playlist for http-live-streaming
- src/
|
|- controller/ // Folder containing UserController where all endpoints are declared
|- hls/ // Playlist generator is here
|- Utils.hpp // Utils
|- AppComponent.hpp // Service config
|- App.cpp // main() is here
Requires
oatpp
module installed. You may runutility/install-oatpp-modules.sh
script to install required oatpp modules.
$ mkdir build && cd build
$ cmake ..
$ make
$ ./hls-example-exe # - run application.
$ docker build -t example-hls .
$ docker run -p 8000:8000 -t example-hls
- localhost:8000 - Index page
- localhost:8000/media/live - Live stream made from {repo}/video/video1.mp4 and {repo}/video/video2.mp4 played in the loop
- {repo}/video/playlist_live.m3u8 - playlist used for live HLS streaming
- {repo}/video/generate_pls.sh - example script used to generate sub-playlists and video fragmets using ffmpeg tool. #EXTINF sections of sub-playlists then have to be manualy moved to playlist_live.m3u8.
If app can't find playlist of video files then specify full-file-paths for {repo}/video/playlist_live.m3u8 file and {repo}/video folder in AppComponent.hpp