255 lines
4.9 KiB
Go
255 lines
4.9 KiB
Go
package src
|
|
|
|
import "time"
|
|
|
|
// Playlist : Enthält allen Playlistinformationen, die der Buffer benötigr
|
|
type Playlist struct {
|
|
Folder string
|
|
PlaylistID string
|
|
PlaylistName string
|
|
Tuner int
|
|
|
|
Clients map[int]ThisClient
|
|
Streams map[int]ThisStream
|
|
}
|
|
|
|
// ThisClient : Clientinfos
|
|
type ThisClient struct {
|
|
Connection int
|
|
}
|
|
|
|
// ThisStream : Enthält Informationen zu dem abzuspielenden Stream einer Playlist
|
|
type ThisStream struct {
|
|
ChannelName string
|
|
Error string
|
|
Folder string
|
|
MD5 string
|
|
NetworkBandwidth int
|
|
PlaylistID string
|
|
PlaylistName string
|
|
Status bool
|
|
URL string
|
|
|
|
Segment []Segment
|
|
|
|
// Serverinformationen
|
|
Location string
|
|
URLFile string
|
|
URLHost string
|
|
URLPath string
|
|
URLRedirect string
|
|
URLScheme string
|
|
URLStreamingServer string
|
|
|
|
// Wird nur für HLS / M3U8 verwendet
|
|
Body string
|
|
Difference float64
|
|
Duration float64
|
|
DynamicBandwidth bool
|
|
FirstSequence int64
|
|
HLS bool
|
|
LastSequence int64
|
|
M3U8URL string
|
|
NewSegCount int
|
|
OldSegCount int
|
|
Sequence int64
|
|
TimeDiff float64
|
|
TimeEnd time.Time
|
|
TimeSegDuration float64
|
|
TimeStart time.Time
|
|
Version int
|
|
Wait float64
|
|
|
|
DynamicStream map[int]DynamicStream
|
|
|
|
// Lokale Temp Datein
|
|
OldSegments []string
|
|
}
|
|
|
|
// Segment : URL Segmente (HLS / M3U8)
|
|
type Segment struct {
|
|
Duration float64
|
|
Info bool
|
|
PlaylistType string
|
|
Sequence int64
|
|
URL string
|
|
Version int
|
|
Wait float64
|
|
|
|
StreamInf struct {
|
|
AverageBandwidth int
|
|
Bandwidth int
|
|
Framerate float64
|
|
Resolution string
|
|
SegmentURL string
|
|
}
|
|
}
|
|
|
|
// DynamicStream : Streaminformationen bei dynamischer Bandbreite
|
|
type DynamicStream struct {
|
|
AverageBandwidth int
|
|
Bandwidth int
|
|
Framerate float64
|
|
Resolution string
|
|
URL string
|
|
}
|
|
|
|
// ClientConnection : Client Verbindungen
|
|
type ClientConnection struct {
|
|
Connection int
|
|
Error error
|
|
}
|
|
|
|
// BandwidthCalculation : Bandbreitenberechnung für den Stream
|
|
type BandwidthCalculation struct {
|
|
NetworkBandwidth int
|
|
Size int
|
|
Start time.Time
|
|
Stop time.Time
|
|
TimeDiff float64
|
|
}
|
|
|
|
/*
|
|
var args = "-hide_banner -loglevel panic -re -i " + url + " -codec copy -f mpegts pipe:1"
|
|
//var args = "-re -i " + url + " -codec copy -f mpegts pipe:1"
|
|
cmd := exec.Command("/usr/local/bin/ffmpeg", strings.Split(args, " ")...)
|
|
|
|
//run := exec.Command("/usr/local/bin/ffmpeg", "-hide_banner", "-loglevel", "panic", "-re", "-i", url, "-codec", "copy", "-f", "mpegts", "pipe:1")
|
|
//run := exec.Command("/usr/local/bin/ffmpeg", "-re", "-i", url, "-codec", "copy", "-f", "mpegts", "pipe:1")
|
|
|
|
stderr, _ := cmd.StderrPipe()
|
|
cmd.Start()
|
|
|
|
scanner := bufio.NewScanner(stderr)
|
|
scanner.Split(bufio.ScanLines)
|
|
for scanner.Scan() {
|
|
m := scanner.Text()
|
|
fmt.Println(m)
|
|
}
|
|
cmd.Wait()
|
|
|
|
os.Exit(0)
|
|
*/
|
|
|
|
/*
|
|
|
|
ffmpegOut, _ := run.StderrPipe()
|
|
//run.Start()
|
|
|
|
scanner = bufio.NewScanner(ffmpegOut)
|
|
scanner.Split(bufio.ScanLines)
|
|
for scanner.Scan() {
|
|
m := scanner.Text()
|
|
fmt.Println(m)
|
|
}
|
|
|
|
ffmpegOut, err = run.StdoutPipe()
|
|
if err != nil {
|
|
ShowError(err, 0)
|
|
return
|
|
}
|
|
|
|
stderr, stderrErr := run.StderrPipe()
|
|
if stderrErr != nil {
|
|
fmt.Println(stderrErr)
|
|
}
|
|
|
|
_ = stderr
|
|
|
|
if startErr := run.Start(); startErr != nil {
|
|
fmt.Println(startErr)
|
|
|
|
return
|
|
}
|
|
|
|
n, err := ffmpegOut.Read(buffer)
|
|
_ = n
|
|
_ = stream
|
|
_ = fileSize
|
|
|
|
if err != nil && err != io.EOF {
|
|
|
|
ShowError(err, 0)
|
|
addErrorToStream(err)
|
|
return
|
|
|
|
}
|
|
|
|
defer bufferFile.Close()
|
|
|
|
scanner = bufio.NewScanner(ffmpegOut)
|
|
|
|
for scanner.Scan() {
|
|
//fmt.Printf("%s\n", scanner.Text())
|
|
//fmt.Println(scanner)
|
|
thisLine := scanner.Text()
|
|
line := make([]byte, len(thisLine))
|
|
|
|
buffer = append(buffer, line...)
|
|
|
|
fmt.Println(len(buffer))
|
|
|
|
if len(buffer) > tmpFileSize {
|
|
|
|
if _, err := bufferFile.Write(buffer[:]); err != nil {
|
|
|
|
ShowError(err, 0)
|
|
addErrorToStream(err)
|
|
run.Process.Kill()
|
|
return
|
|
|
|
}
|
|
|
|
buffer = make([]byte, 1024*Settings.BufferSize*2)
|
|
|
|
debug = fmt.Sprintf("Buffer Status:Done (%s)", tmpFile)
|
|
showDebug(debug, 2)
|
|
|
|
bufferFile.Close()
|
|
|
|
stream.Status = true
|
|
playlist.Streams[streamID] = stream
|
|
BufferInformation.Store(playlistID, playlist)
|
|
|
|
tmpSegment++
|
|
|
|
tmpFile = fmt.Sprintf("%s%d.ts", tmpFolder, tmpSegment)
|
|
|
|
if clientConnection(stream) == false {
|
|
|
|
bufferFile.Close()
|
|
run.Process.Kill()
|
|
|
|
err = os.RemoveAll(stream.Folder)
|
|
if err != nil {
|
|
ShowError(err, 4005)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
bufferFile, err = os.Create(tmpFile)
|
|
if err != nil {
|
|
addErrorToStream(err)
|
|
run.Process.Kill()
|
|
return
|
|
}
|
|
|
|
fileSize = 0
|
|
|
|
if n == 0 {
|
|
bufferFile.Close()
|
|
run.Process.Kill()
|
|
break
|
|
}
|
|
|
|
os.Exit(0)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
*/
|