HomeArtTechHackBlockchain
ONLINE ·
Index
/
Technology
/
Article

Basic music streaming with go fiber

Operator
Khomkrid Lerdprasert
Filed
October 08, 2021
Channel
Technology
Read
~1 min
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
Khomkrid Lerdprasert
Operator

Khomkrid Lerdprasert

Technical Lead — building AI-powered platforms, omni-channel chat systems, and telemedicine solutions with Go, Next.js & clean architecture. 20+ years shipping software from crypto wallets to e-learning systems. Bangkok-based. Writes code late at night, brews beer on weekends.

GithubInstagram
Previous · transmission
Gatsbyjs with cookie consent
Next · transmission
Aircrack Ng หารหัส wifi ที่บ้าน
Metadata
Channel
Technology
Filed
October 08, 2021
Read
~1 min
Language
TH / EN
Transmit

Related

สร้าง RAG Pipeline ด้วย Go + pgvector + Hexagonal Architecture
Khomkrid Lerdprasert
April 23, 2026
1 min
aofiee.dev
signal / noise / code · craft
© 2019 – 2026, Khomkrid Lerdprasert.
All transmissions logged.
No newsletter. No profiling. Cookies require consent.
PGP · 7F3D 2024 A21E B584 · 0x7F3D
Channels
  • Art & Culture
  • Technology
  • Hack 101
  • Blockchain 101
  • Archive / All posts
— END OF TRANSMISSION —
// powered by curiosity, coffee, & wuxia
BKK · 13°45′N · 100°30′E