Docker compose ทำ mongodb มาเชื่อมต่อ กับ golang
March 05, 2022
1 min
โจทย์มีอยู่ว่าให้ทำ Music streaming เพลง และ Podcast ซึ่งน่าจะมีความยาว 30 นาทีเป็นอย่างต่ำ ผมเลยทำการ convert mp3 ไปเป็น m4a เพื่อทำ HLS streaming ด้วย ffmpeg ด้วยการแบ่ง file เป็น 7 วินาที จะได้โหลดไวๆ
ffmpeg -y -i song.mp3 -c:a aac -b:a 128k -map 0:a -muxdelay 0 -f segment -sc_threshold 0 -segment_time 7 -segment_list "playlist.m3u8" -segment_format mpegts "file%d.m4a"
หลังจากนั้นจะใช้ go fiber ทำ streaming server เพื่อ serve ไฟล์ จาก m3u8 ทีละ segment
├── Readme.md├── go.mod├── go.sum├── main.go└── music├── 1└── 2
โดยเราจะเก็บไฟล์ เพ ลงตาม ID แยกตาม folder ไว้ตามนี้ และ code ของเราจะเป็นแบบนี้
package mainimport ("fmt""log""github.com/gofiber/fiber/v2")func main() {app := fiber.New()app.Get("/:id/stream/", streamHandler)app.Get("/:id/stream/file:segment.m4a", streamHandler)app.Listen(":3000")}func streamHandler(c *fiber.Ctx) error {musicID, err := c.ParamsInt("id")if err != nil {return err}if c.Params("segment") != "" {segment, err := c.ParamsInt("segment")if err != nil {return err}musicDir := getMusic(musicID)musicSegment := fmt.Sprintf("file%d.m4a", segment)log.Println("sending segment", musicDir+"/"+musicSegment)c.Set(fiber.HeaderContentType, "audio/m4a")return c.SendFile(musicDir + "/" + musicSegment)} else {musicDir := getMusic(musicID)m3u8 := fmt.Sprintf("music%d.m3u8", musicID)c.Set(fiber.HeaderContentType, "application/x-mpegURL")log.Println("music started ", musicDir+"/"+m3u8)return c.SendFile(musicDir + "/" + m3u8)}}func getMusic(musicID int) string {root := "music"return fmt.Sprintf("%s/%d", root, musicID)}
จากนั้นผมจะใช้ ngrok ในการ ทดสอบบนมือถือ ว่าโหลด m3u8 เราได้หรือไม่ เมื่อเรา run และลองเอา link ไป stream ทั้งบนมือถือ หรือ vlc จะพบว่า ทำงานได้ ราบรื่น เป็นอันจบ
โดย m3u8 ที่วิ่งผ่าน ngrok จะหน้าตาประมาณนี้
#EXTM3U#EXT-X-VERSION:3#EXT-X-MEDIA-SEQUENCE:0#EXT-X-ALLOW-CACHE:YES#EXT-X-TARGETDURATION:8#EXTINF:7.018667,http://8d1e-184-22-120-166.ngrok.io/1/stream/file0.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file1.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file2.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file3.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file4.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file5.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file6.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file7.m4a#EXTINF:7.018667,http://8d1e-184-22-120-166.ngrok.io/1/stream/file8.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file9.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file10.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file11.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file12.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file13.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file14.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file15.m4a#EXTINF:7.018667,http://8d1e-184-22-120-166.ngrok.io/1/stream/file16.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file17.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file18.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file19.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file20.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file21.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file22.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file23.m4a#EXTINF:7.018667,http://8d1e-184-22-120-166.ngrok.io/1/stream/file24.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file25.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file26.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file27.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file28.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file29.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file30.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file31.m4a#EXTINF:7.018667,http://8d1e-184-22-120-166.ngrok.io/1/stream/file32.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file33.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file34.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file35.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file36.m4a#EXTINF:6.997333,http://8d1e-184-22-120-166.ngrok.io/1/stream/file37.m4a#EXTINF:4.168567,http://8d1e-184-22-120-166.ngrok.io/1/stream/file38.m4a#EXT-X-ENDLIST
https://github.com/aofiee/Music-Streaming-HLS-Go-fiber.git
Quick Links
Legal Stuff