func (handler *ServerHandler) OnStreamCreated(conn rtmp.InboundConn, stream rtmp.InboundStream) { fmt.Printf("Stream created: %d\n", stream.ID()) stream.Attach(handler) }
func (handler *ServerHandler) OnStreamClosed(conn rtmp.InboundConn, stream rtmp.InboundStream) { fmt.Printf("Stream closed: %d\n", stream.ID()) }
func publish(stream rtmp.InboundStream) { var err error flvFile, err = flv.OpenFile(*flvFileName) if err != nil { fmt.Println("Open FLV dump file error:", err) return } defer flvFile.Close() startTs := uint32(0) startAt := time.Now().UnixNano() preTs := uint32(0) for { if status, _ = g_ibConn.Status(); status != rtmp.INBOUND_CONN_STATUS_CREATE_STREAM_OK { break } if flvFile.IsFinished() { fmt.Println("@@@@@@@@@@@@@@File finished") flvFile.LoopBack() startAt = time.Now().UnixNano() startTs = uint32(0) preTs = uint32(0) } header, data, err := flvFile.ReadTag() if err != nil { fmt.Println("flvFile.ReadTag() error:", err) break } switch header.TagType { case flv.VIDEO_TAG: videoDataSize += int64(len(data)) case flv.AUDIO_TAG: audioDataSize += int64(len(data)) } if startTs == uint32(0) { startTs = header.Timestamp } diff1 := uint32(0) // deltaTs := uint32(0) if header.Timestamp > startTs { diff1 = header.Timestamp - startTs } else { fmt.Println("@@@@@@@@@@@@@@diff1") } if diff1 > preTs { // deltaTs = diff1 - preTs preTs = diff1 } if err = stream.SendData(header.TagType, data, diff1); err != nil { fmt.Println("PublishData() error:", err) break } diff2 := uint32((time.Now().UnixNano() - startAt) / 1000000) // fmt.Printf("diff1: %d, diff2: %d\n", diff1, diff2) if diff1 > diff2+100 { // fmt.Printf("header.Timestamp: %d, now: %d\n", header.Timestamp, time.Now().UnixNano()) time.Sleep(time.Millisecond * time.Duration(diff1-diff2)) } } }