add AMFECMAArray and some sound format defines

This commit is contained in:
nareix 2016-06-28 15:52:33 +08:00
parent 3e28c20850
commit 51acceb6ba
2 changed files with 47 additions and 9 deletions

View File

@ -9,6 +9,7 @@ import (
type AMFMap map[string]interface{} type AMFMap map[string]interface{}
type AMFArray []interface{} type AMFArray []interface{}
type AMFECMAArray map[string]interface{}
func readBEFloat64(r *pio.Reader) (f float64, err error) { func readBEFloat64(r *pio.Reader) (f float64, err error) {
var u uint64 var u uint64
@ -127,6 +128,28 @@ func WriteAMF0Val(w *pio.Writer, _val interface{}) (err error) {
return 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: case AMFMap:
if err = w.WriteU8(objectmarker); err != nil { if err = w.WriteU8(objectmarker); err != nil {
return return
@ -282,7 +305,7 @@ func ReadAMF0Val(r *pio.Reader) (val interface{}, err error) {
} }
obj[okey] = oval obj[okey] = oval
} }
if _, err = r.ReadU8(); err != nil { if _, err = r.Discard(3); err != nil {
return return
} }
val = obj val = obj

View File

@ -48,7 +48,14 @@ func (self *Scriptdata) Unmarshal(r *pio.Reader) (err error) {
} }
const ( 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_AAC = 10
SOUND_SPEEX = 11
SOUND_5_5Khz = 0 SOUND_5_5Khz = 0
SOUND_11Khz = 1 SOUND_11Khz = 1
@ -97,7 +104,9 @@ type Audiodata struct {
4 = Nellymoser 16-kHz mono 4 = Nellymoser 16-kHz mono
5 = Nellymoser 8-kHz mono 5 = Nellymoser 8-kHz mono
6 = Nellymoser 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 10 = AAC
11 = Speex 11 = Speex
14 = MP3 8-Khz 14 = MP3 8-Khz
@ -172,7 +181,7 @@ func (self Audiodata) Marshal(w *pio.Writer) (err error) {
return return
} }
} else { } 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
} }
return return
@ -187,7 +196,9 @@ func (self *Audiodata) Unmarshal(r *pio.Reader) (err error) {
self.SoundRate = (flags >> 2) & 0x3 self.SoundRate = (flags >> 2) & 0x3
self.SoundSize = (flags >> 1) & 0x1 self.SoundSize = (flags >> 1) & 0x1
self.SoundType = flags & 0x1 self.SoundType = flags & 0x1
if self.SoundFormat == SOUND_AAC {
switch self.SoundFormat {
case SOUND_AAC:
if self.AACPacketType, err = r.ReadU8(); err != nil { if self.AACPacketType, err = r.ReadU8(); err != nil {
return return
} }
@ -195,10 +206,14 @@ func (self *Audiodata) Unmarshal(r *pio.Reader) (err error) {
if _, err = io.ReadFull(r, self.Data); err != nil { if _, err = io.ReadFull(r, self.Data); err != nil {
return return
} }
} else {
err = fmt.Errorf("flv: Audiodata.Unmarshal: unsupported SoundFormat=%d", self.SoundFormat) default:
return self.Data = make([]byte, r.N)
if _, err = io.ReadFull(r, self.Data); err != nil {
return
}
} }
return return
} }
@ -311,7 +326,7 @@ func ReadFileHeader(r *pio.Reader) (flags uint8, err error) {
return return
} }
if cc3 != 0x464c56 { // 'FLV' if cc3 != 0x464c56 { // 'FLV'
err = fmt.Errorf("flv: file header cc3 invalid") err = fmt.Errorf("flvio: file header cc3 invalid")
return return
} }
@ -355,7 +370,7 @@ func ReadTag(r *pio.Reader) (tag Tag, timestamp int32, err error) {
tag = &Scriptdata{} tag = &Scriptdata{}
default: default:
err = fmt.Errorf("flv: ReadTag tagtype=%d invalid", tagtype) err = fmt.Errorf("flvio: ReadTag tagtype=%d invalid", tagtype)
return return
} }