HomeArtTechHackBlockchain

Basic music streaming with go fiber

By Khomkrid Lerdprasert
Published in Technology
October 08, 2021
1 min read
Basic music streaming with go fiber

Basic music streaming with go fiber

โจทย์มีอยู่ว่าให้ทำ 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 main
import (
"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


Tags

#golang#go-fiber#ffmpeg

Share

Previous Article
Gatsbyjs with cookie consent
Khomkrid Lerdprasert

Khomkrid Lerdprasert

Full Stack Life

Related Posts

Docker compose ทำ mongodb มาเชื่อมต่อ กับ golang
March 05, 2022
1 min
© 2024, All Rights Reserved.
Powered By

Quick Links

Author

Social Media