diff --git a/flvio/amf0.go b/flvio/amf0.go index 8530512..f648af4 100644 --- a/flvio/amf0.go +++ b/flvio/amf0.go @@ -9,6 +9,7 @@ import ( type AMFMap map[string]interface{} type AMFArray []interface{} +type AMFECMAArray map[string]interface{} func readBEFloat64(r *pio.Reader) (f float64, err error) { var u uint64 @@ -127,6 +128,28 @@ func WriteAMF0Val(w *pio.Writer, _val interface{}) (err error) { return } + case AMFECMAArray: + if err = w.WriteU8(ecmaarraymarker); err != nil { + return + } + if err = w.WriteU32BE(uint32(len(val))); err != nil { + return + } + for k, v := range val { + if err = w.WriteU16BE(uint16(len(k))); err != nil { + return + } + if _, err = w.Write([]byte(k)); err != nil { + return + } + if err = WriteAMF0Val(w, v); err != nil { + return + } + } + if err = w.WriteU24BE(0x000009); err != nil { + return + } + case AMFMap: if err = w.WriteU8(objectmarker); err != nil { return @@ -282,7 +305,7 @@ func ReadAMF0Val(r *pio.Reader) (val interface{}, err error) { } obj[okey] = oval } - if _, err = r.ReadU8(); err != nil { + if _, err = r.Discard(3); err != nil { return } val = obj diff --git a/flvio/flvio.go b/flvio/flvio.go index 19f6f7a..60a06e8 100644 --- a/flvio/flvio.go +++ b/flvio/flvio.go @@ -48,7 +48,14 @@ func (self *Scriptdata) Unmarshal(r *pio.Reader) (err error) { } const ( + SOUND_MP3 = 2 + SOUND_NELLYMOSER_16KHZ_MONO = 4 + SOUND_NELLYMOSER_8KHZ_MONO = 5 + SOUND_NELLYMOSER = 6 + SOUND_ALAW = 7 + SOUND_MULAW = 8 SOUND_AAC = 10 + SOUND_SPEEX = 11 SOUND_5_5Khz = 0 SOUND_11Khz = 1 @@ -97,7 +104,9 @@ type Audiodata struct { 4 = Nellymoser 16-kHz mono 5 = Nellymoser 8-kHz mono 6 = Nellymoser - 7 = G.711 A-law logarithmic PCM 8 = G.711 mu-law logarithmic PCM 9 = reserved + 7 = G.711 A-law logarithmic PCM + 8 = G.711 mu-law logarithmic PCM + 9 = reserved 10 = AAC 11 = Speex 14 = MP3 8-Khz @@ -172,7 +181,7 @@ func (self Audiodata) Marshal(w *pio.Writer) (err error) { return } } else { - err = fmt.Errorf("flv: Audiodata.Marshal: unsupported SoundFormat=%d", self.SoundFormat) + err = fmt.Errorf("flvio: Audiodata.Marshal: unsupported SoundFormat=%d", self.SoundFormat) return } return @@ -187,7 +196,9 @@ func (self *Audiodata) Unmarshal(r *pio.Reader) (err error) { self.SoundRate = (flags >> 2) & 0x3 self.SoundSize = (flags >> 1) & 0x1 self.SoundType = flags & 0x1 - if self.SoundFormat == SOUND_AAC { + + switch self.SoundFormat { + case SOUND_AAC: if self.AACPacketType, err = r.ReadU8(); err != nil { return } @@ -195,10 +206,14 @@ func (self *Audiodata) Unmarshal(r *pio.Reader) (err error) { if _, err = io.ReadFull(r, self.Data); err != nil { return } - } else { - err = fmt.Errorf("flv: Audiodata.Unmarshal: unsupported SoundFormat=%d", self.SoundFormat) - return + + default: + self.Data = make([]byte, r.N) + if _, err = io.ReadFull(r, self.Data); err != nil { + return + } } + return } @@ -311,7 +326,7 @@ func ReadFileHeader(r *pio.Reader) (flags uint8, err error) { return } if cc3 != 0x464c56 { // 'FLV' - err = fmt.Errorf("flv: file header cc3 invalid") + err = fmt.Errorf("flvio: file header cc3 invalid") return } @@ -355,7 +370,7 @@ func ReadTag(r *pio.Reader) (tag Tag, timestamp int32, err error) { tag = &Scriptdata{} default: - err = fmt.Errorf("flv: ReadTag tagtype=%d invalid", tagtype) + err = fmt.Errorf("flvio: ReadTag tagtype=%d invalid", tagtype) return }