2023-08-17 16:35:06 +05:00
|
|
|
package rtmp
|
|
|
|
|
|
|
|
import (
|
2023-08-18 12:48:05 +05:00
|
|
|
"stream_server/rtmp/flv"
|
2023-08-18 15:50:24 +05:00
|
|
|
"os"
|
2023-08-18 16:22:25 +05:00
|
|
|
"time"
|
|
|
|
"path/filepath"
|
2023-08-17 16:35:06 +05:00
|
|
|
)
|
|
|
|
|
|
|
|
func HandleDataLoop(chnk_wrp_ptr *ChunkWrapper) {
|
2023-08-18 16:22:25 +05:00
|
|
|
StreamCleanup(chnk_wrp_ptr.params.stream_key, 0)
|
2023-08-21 15:10:07 +05:00
|
|
|
file_writer, err := flv.NewFLVWriter(chnk_wrp_ptr.params.stream_key)
|
2023-08-18 13:24:54 +05:00
|
|
|
defer file_writer.Close()
|
2023-08-18 12:48:05 +05:00
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
2023-08-18 13:24:54 +05:00
|
|
|
if err = chnk_wrp_ptr.ReadMetadata(file_writer); err != nil {
|
|
|
|
return
|
|
|
|
}
|
2023-08-17 16:35:06 +05:00
|
|
|
for {
|
2023-08-18 14:43:52 +05:00
|
|
|
msg_ptr, err := chnk_wrp_ptr.ReadChunk()
|
2023-08-17 16:35:06 +05:00
|
|
|
if err != nil {
|
|
|
|
return
|
2023-08-18 14:43:52 +05:00
|
|
|
} else if msg_ptr == nil {
|
|
|
|
continue
|
2023-08-17 16:35:06 +05:00
|
|
|
}
|
2023-08-18 14:43:52 +05:00
|
|
|
switch msg_ptr.msg_type {
|
|
|
|
case 20:
|
|
|
|
return
|
|
|
|
case 8, 9:
|
|
|
|
if err = file_writer.WriteMediaTag(&(msg_ptr.data), msg_ptr.timestamp, msg_ptr.msg_type); err != nil {
|
|
|
|
return
|
|
|
|
}
|
2023-08-17 16:35:06 +05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-08-18 16:22:25 +05:00
|
|
|
|
|
|
|
func StreamCleanup(stream_key string, delay time.Duration) {
|
|
|
|
time.Sleep(delay * time.Second)
|
|
|
|
base_dir, _ := os.UserHomeDir()
|
|
|
|
stream_dir := base_dir + "/live/" + stream_key
|
|
|
|
|
|
|
|
leftover_files, _ := filepath.Glob(stream_dir + "/*")
|
|
|
|
for _, file := range leftover_files {
|
|
|
|
os.Remove(file)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|