From 0caff8518287393f8a0fcfabea13755fb8538938 Mon Sep 17 00:00:00 2001 From: mask-pp Date: Fri, 14 Aug 2020 11:04:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0metadata=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 91 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/main.go b/main.go index 22de47e..b3617b3 100644 --- a/main.go +++ b/main.go @@ -39,51 +39,54 @@ func HDLHandler(w http.ResponseWriter, r *http.Request) { if strings.HasSuffix(stringPath, ".flv") { stringPath = strings.TrimRight(stringPath, ".flv") } - if s := FindStream(stringPath); s != nil { - //atomic.AddInt32(&hdlId, 1) - w.Header().Set("Access-Control-Allow-Origin", "*") - w.Header().Set("Transfer-Encoding", "chunked") - w.Header().Set("Content-Type", "video/x-flv") - w.Write(avformat.FLVHeader) - var metadata avformat.SendPacket - metadata.AVPacket = new(avformat.AVPacket) - metadata.Type = avformat.FLV_TAG_TYPE_SCRIPT - var buffer bytes.Buffer - amf.WriteString(&buffer, "onMetaData") - WriteEcmaArray(&buffer, amf.Object{ - "MetaDataCreator": "monibuca", - "hasVideo": true, - "hasAudio": true, - "hasMatadata": true, - "canSeekToEnd": false, - "duration": 0, - "hasKeyFrames": 0, - "videocodecid": int(s.VideoInfo.CodecID), - "framerate": 0, - "videodatarate": 0, - "audiocodecid": int(s.AudioInfo.SoundFormat), - "filesize": 0, - "width": s.VideoInfo.SPSInfo.Width, - "height": s.VideoInfo.SPSInfo.Height, - "audiosamplerate": s.AudioInfo.SoundRate, - "audiosamplesize": int(s.AudioInfo.SoundSize), - "stereo": s.AudioInfo.SoundType == 1, - }) - metadata.Payload = buffer.Bytes() - avformat.WriteFLVTag(w, &metadata) - p := Subscriber{ - Sign: sign, - OnData: func(packet *avformat.SendPacket) error { - return avformat.WriteFLVTag(w, packet) - }, - SubscriberInfo: SubscriberInfo{ - ID: r.RemoteAddr, Type: "FLV", - }, - } - p.Subscribe(stringPath) - } else { - w.WriteHeader(404) + //atomic.AddInt32(&hdlId, 1) + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Transfer-Encoding", "chunked") + w.Header().Set("Content-Type", "video/x-flv") + w.Write(avformat.FLVHeader) + p := Subscriber{ + Sign: sign, + OnData: func(packet *avformat.SendPacket) error { + return avformat.WriteFLVTag(w, packet) + }, + MetaData: func(stream *Stream) error { + var metadata avformat.SendPacket + metadata.AVPacket = new(avformat.AVPacket) + metadata.Type = avformat.FLV_TAG_TYPE_SCRIPT + var buffer bytes.Buffer + if _, err := amf.WriteString(&buffer, "onMetaData"); err != nil { + return err + } + + if _, err := WriteEcmaArray(&buffer, amf.Object{ + "MetaDataCreator": "monibuca", + "hasVideo": true, + "hasAudio": stream.AudioInfo.SoundFormat > 0, + "hasMatadata": true, + "canSeekToEnd": false, + "duration": 0, + "hasKeyFrames": 0, + "videocodecid": int(stream.VideoInfo.CodecID), + "framerate": 0, + "videodatarate": 0, + "audiocodecid": int(stream.AudioInfo.SoundFormat), + "filesize": 0, + "width": stream.VideoInfo.SPSInfo.Width, + "height": stream.VideoInfo.SPSInfo.Height, + "audiosamplerate": stream.AudioInfo.SoundRate, + "audiosamplesize": int(stream.AudioInfo.SoundSize), + "stereo": stream.AudioInfo.SoundType == 1, + }); err != nil { + return err + } + metadata.Payload = buffer.Bytes() + return avformat.WriteFLVTag(w, &metadata) + }, + SubscriberInfo: SubscriberInfo{ + ID: r.RemoteAddr, Type: "FLV", + }, } + p.Subscribe(stringPath) } func WriteEcmaArray(w amf.Writer, o amf.Object) (n int, err error) { n, err = amf.WriteMarker(w, amf.AMF0_ECMA_ARRAY_MARKER)