func publish(stream rtmp.OutboundStream) { 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 status == rtmp.OUTBOUND_CONN_STATUS_CREATE_STREAM_OK { 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.PublishData(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)) } } }
func publish(stream rtmp.OutboundStream, input *Input) { startTs := uint32(0) startAt := time.Now().UnixNano() preTs := uint32(0) for status == rtmp.OUTBOUND_CONN_STATUS_CREATE_STREAM_OK { if input.file.IsFinished() { log.Println("Loading next file") input = input.nextInput() log.Println("next file loaded") startAt = time.Now().UnixNano() startTs = uint32(0) preTs = uint32(0) } header, data, err := input.file.ReadTag() if err != nil { log.Fatal("input.ReadTag() error:", err) break } input.curPos++ switch header.TagType { case flv.VIDEO_TAG: videoDataSize += int(len(data)) case flv.AUDIO_TAG: audioDataSize += int(len(data)) } if startTs == uint32(0) { startTs = header.Timestamp } diff1 := uint32(0) if header.Timestamp > startTs { diff1 = header.Timestamp - startTs } else { log.Println("syncing") } if diff1 > preTs { preTs = diff1 } if err = stream.PublishData(header.TagType, data, diff1); err != nil { log.Fatal("PublishData() error:", err) break } input.updatePos(input.curPos) diff2 := uint32((time.Now().UnixNano() - startAt) / 1000000) if diff1 > diff2+100 { time.Sleep(time.Millisecond * time.Duration(diff1-diff2)) } } }
func (handler *TestOutboundConnHandler) OnStreamCreated(conn rtmp.OutboundConn, stream rtmp.OutboundStream) { fmt.Printf("Stream created: %d\n", stream.ID()) createStreamChan <- stream }
func (handler *ConnHandler) OnStreamCreated(conn rtmp.OutboundConn, stream rtmp.OutboundStream) { log.Printf("rtmp stream created: %d\n", stream.ID()) createStreamChan <- stream }