55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
"github.com/nareix/joy4/format"
|
|
"github.com/nareix/joy4/av/avutil"
|
|
"github.com/nareix/joy4/av/pktque"
|
|
"github.com/nareix/joy4/av/pubsub"
|
|
"github.com/nareix/joy4/format/rtmp"
|
|
)
|
|
|
|
func init() {
|
|
format.RegisterAll()
|
|
}
|
|
|
|
func main() {
|
|
server := &rtmp.Server{}
|
|
|
|
var que *pubsub.Queue
|
|
|
|
go func() {
|
|
file, _ := avutil.Open("projectindex.flv")
|
|
streams, _ := file.Streams()
|
|
que = pubsub.NewQueue(streams)
|
|
demuxer := &pktque.FilterDemuxer{Demuxer: file, Filter: &pktque.Walltime{}}
|
|
avutil.CopyPackets(que, demuxer)
|
|
file.Close()
|
|
que.Close()
|
|
}()
|
|
|
|
server.HandlePlay = func(conn *rtmp.Conn) {
|
|
cursor := que.Latest()
|
|
query := conn.URL.Query()
|
|
if q := query.Get("delaygop"); q != "" {
|
|
n := 0
|
|
fmt.Sscanf(q, "%d", &n)
|
|
cursor = que.DelayedGopCount(n)
|
|
} else if q := query.Get("delaytime"); q != "" {
|
|
dur, _ := time.ParseDuration(q)
|
|
cursor = que.DelayedTime(dur)
|
|
}
|
|
demuxer := &pktque.FilterDemuxer{Demuxer: cursor, Filter: &pktque.WaitKeyFrame{}}
|
|
avutil.CopyFile(conn, demuxer)
|
|
}
|
|
|
|
server.ListenAndServe()
|
|
|
|
// ffplay rtmp://localhost/test.flv
|
|
// ffplay rtmp://localhost/test.flv?delaygop=2
|
|
// ffplay rtmp://localhost/test.flv?delaytime=3s
|
|
// ffplay rtmp://localhost/test.flv?delaytime=10s
|
|
}
|
|
|