Files
xTeVe/src/struct-buffer.go
2019-09-27 19:24:31 +02:00

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)
}
}
*/