rtmp

package module
v0.0.0-...-f1cdb32 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 7, 2020 License: MIT Imports: 12 Imported by: 1

README

Simple RTMP Server

A lightweight rtmp/1.0 ingestion server implementation.

Compatibility

Support OBS, Wirecast and FFmpeg ingestion.

Installation

go get "github.com/junli1026/gortmp"

Example

The following example simply dump binary to flv file.

package main

import (
	"bufio"
	"fmt"
	"os"

	rtmp "github.com/junli1026/gortmp"
)

func main() {
	s := rtmp.NewServer()

	/* config log settings */
	s.ConfigLog(&rtmp.LogSetting{
		LogLevel:   rtmp.InfoLevel, //set loglevel, default value rtmp.DebugLevel
		Filename:   "./log.txt",    //set log file, default value empty, that is, logging to stderr
		MaxSize:    1,              //set log file size to 1 MB
		MaxBackups: 3,              //set maximum number of log files to 3
		MaxAge:     1,              //set maximum log file life to 1 day
	})

	c := make(chan int)

	f, _ := os.Create("./test.flv")
	defer f.Close()

	/* register handler for stream data */
	s.OnStreamData(func(meta *rtmp.StreamMeta, streamData *rtmp.StreamData) error {
		//header data only shows once, at the beginning of stream data
		if streamData.Type == rtmp.FlvHeader {
			fmt.Printf("    encoder: %v\n", meta.Encoder())
			fmt.Printf(" stream url: %v\n", meta.URL())
			fmt.Printf("stream name: %v\n", meta.StreamName())
			fmt.Printf("video codec: %v\n", meta.VideoCodec())
			fmt.Printf(" frame rate: %v\n", meta.FrameRate())
			fmt.Printf("      width: %v\n", meta.Width())
			fmt.Printf("     height: %v\n", meta.Height())
			fmt.Printf("audio codec: %v\n", meta.AudioCodec())
			fmt.Printf("   channels: %v\n", meta.AudioChannels())
			fmt.Printf(" samplerate: %v\n", meta.AudioSampleRate())
			fmt.Printf(" samplesize: %v\n", meta.AudioSampleSize())
			fmt.Printf("     stereo: %v\n", meta.Stereo())
		}

		// simply write binary to file
		f.Write(streamData.Data)
		return nil
	})

	s.OnStreamClose(func(meta *rtmp.StreamMeta, err error) {
		fmt.Printf("stream-'%v' name-'%v' closed for reason: %v\n",
			meta.URL(), meta.StreamName(), err)
	})

	go func() {
		if err := s.Run(":1936"); err != nil {
			panic(err)
		}
	}()

	/* create a goroutine listening to stdin, exit when received "q" */
	go func() {
		reader := bufio.NewReader(os.Stdin)
		for {
			b, err := reader.ReadByte()
			if err != nil {
				panic(err)
			}

			if b == 'q' {
				s.Stop() // stop the server
				c <- 0
			}
		}
	}()

	<-c
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type LogLevel

type LogLevel int
const (
	PanicLevel LogLevel = iota
	FatalLevel
	ErrorLevel
	WarnLevel
	InfoLevel
	DebugLevel
	TraceLevel
)

type LogSetting

type LogSetting struct {
	LogLevel   LogLevel
	Filename   string
	MaxSize    int
	MaxBackups int
	MaxAge     int
}

LogSetting is the setting for logger

type RtmpServer

type RtmpServer struct {
	// contains filtered or unexported fields
}

func NewServer

func NewServer() *RtmpServer

func (*RtmpServer) ConfigLog

func (s *RtmpServer) ConfigLog(setting *LogSetting)

func (*RtmpServer) OnStreamClose

func (s *RtmpServer) OnStreamClose(handler StreamCloseHandler)

func (*RtmpServer) OnStreamData

func (s *RtmpServer) OnStreamData(handler StreamDataHandler)

func (*RtmpServer) Run

func (s *RtmpServer) Run(addr string) error

func (*RtmpServer) Stop

func (s *RtmpServer) Stop()

type StreamCloseHandler

type StreamCloseHandler func(meta *StreamMeta, err error)

type StreamData

type StreamData struct {
	Type      StreamDataType
	Timestamp uint32
	Data      []byte
}

type StreamDataHandler

type StreamDataHandler func(meta *StreamMeta, data *StreamData) error

type StreamDataType

type StreamDataType int
const (
	FlvHeader StreamDataType = iota
	FlvScript
	FlvVideo
	FlvAudio
)

type StreamMeta

type StreamMeta struct {
	// contains filtered or unexported fields
}

StreamMeta describes stream metadata

func (*StreamMeta) AudioChannels

func (st *StreamMeta) AudioChannels() int

AudioChannels returns number of audio channels

func (*StreamMeta) AudioCodec

func (st *StreamMeta) AudioCodec() string

AudioCodec returns audio codec

func (*StreamMeta) AudioDataRate

func (st *StreamMeta) AudioDataRate() int

AudioDataRate return audio data rate

func (*StreamMeta) AudioSampleRate

func (st *StreamMeta) AudioSampleRate() int

AudioSampleRate returns audio sample rate

func (*StreamMeta) AudioSampleSize

func (st *StreamMeta) AudioSampleSize() int

AudioSampleSize returns audio sample size

func (*StreamMeta) Encoder

func (st *StreamMeta) Encoder() string

Encoder returns encoder name

func (*StreamMeta) FrameRate

func (st *StreamMeta) FrameRate() int

FrameRate returns video frame rate

func (*StreamMeta) Height

func (st *StreamMeta) Height() int

Height returns video height

func (*StreamMeta) Stereo

func (st *StreamMeta) Stereo() bool

Stereo returns boolean indicating whether the audio is stereo

func (*StreamMeta) StreamID

func (st *StreamMeta) StreamID() int

StreamID returns stream id

func (*StreamMeta) StreamName

func (st *StreamMeta) StreamName() string

StreamName returns stream name

func (*StreamMeta) URL

func (st *StreamMeta) URL() string

URL returns stream url

func (*StreamMeta) VideoCodec

func (st *StreamMeta) VideoCodec() string

VideoCodec returns video codec fourcc

func (*StreamMeta) VideoDataRate

func (st *StreamMeta) VideoDataRate() int

VideoDataRate returns video data rate

func (*StreamMeta) Width

func (st *StreamMeta) Width() int

Width returns video width

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL