diff --git a/example/file/main.go b/example/file/main.go new file mode 100644 index 0000000..d2ca5f3 --- /dev/null +++ b/example/file/main.go @@ -0,0 +1,43 @@ +package main + +import ( + "net/http" + + "github.com/Danile71/go-logger" + "github.com/Danile71/go-rtsp" + "github.com/gorilla/mux" + "github.com/mattn/go-mjpeg" +) + +const uri = "./sample.mp4" + +func main() { + s := mjpeg.NewStream() + + stream, err := rtsp.Open(uri) + if logger.OnError(err) { + return + } + + go func() { + for { + pkt, err := stream.ReadPacket() + if logger.OnError(err) { + continue + } + + if pkt.IsVideo() { + s.Update(pkt.Data()) + } + } + }() + + streamHandler := func(w http.ResponseWriter, r *http.Request) { + s.ServeHTTP(w, r) + } + + router := mux.NewRouter() + router.HandleFunc("/stream", streamHandler) + http.Handle("/", router) + http.ListenAndServe(":8181", nil) +} diff --git a/example/file/sample.mp4 b/example/file/sample.mp4 new file mode 100644 index 0000000..24b738c Binary files /dev/null and b/example/file/sample.mp4 differ diff --git a/ffmpeg.go b/ffmpeg.go index 3a5b230..669a789 100644 --- a/ffmpeg.go +++ b/ffmpeg.go @@ -6,6 +6,7 @@ package rtsp */ import "C" +// Init old version's ffmpeg func init() { C.ffmpeginit() } diff --git a/pkt.go b/pkt.go index 6b70f26..06fbd51 100644 --- a/pkt.go +++ b/pkt.go @@ -7,26 +7,33 @@ type Packet struct { streamIndex int codecType int data []byte - width int - height int + + // only image + width int + height int } +// Height if image or 0 if audio func (pkt *Packet) Height() int { return pkt.height } +// Width if image or 0 if audio func (pkt *Packet) Width() int { return pkt.width } +// Data encoded jpeg if image or wav if audio func (pkt *Packet) Data() []byte { return pkt.data } +// IsAudio packet func (pkt *Packet) IsAudio() bool { return pkt.codecType == C.AVMEDIA_TYPE_AUDIO } +// IsVideo packet func (pkt *Packet) IsVideo() bool { return pkt.codecType == C.AVMEDIA_TYPE_VIDEO } diff --git a/rtsp.go b/rtsp.go index f7e7ef5..18994fa 100644 --- a/rtsp.go +++ b/rtsp.go @@ -1,5 +1,6 @@ package rtsp +// Open rtsp stream of file func Open(url string) (*Stream, error) { stream := New(url) return stream, stream.Setup(Auto) diff --git a/stream.go b/stream.go index 0fbef01..aebfde9 100644 --- a/stream.go +++ b/stream.go @@ -6,6 +6,7 @@ package rtsp import "C" import ( "fmt" + "io" "runtime" "sync" "unsafe" @@ -138,7 +139,11 @@ func (stream *Stream) ReadPacket() (pkt *Packet, err error) { defer C.av_packet_unref(&packet) if cerr := C.av_read_frame(stream.formatCtx, &packet); int(cerr) != 0 { - err = fmt.Errorf("ffmpeg: av_read_frame failed: %d", cerr) + if cerr == C.AVERROR_EOF { + err = io.EOF + } else { + err = fmt.Errorf("ffmpeg: av_read_frame failed: %d", cerr) + } return }