add AMFECMAArray and some sound format defines
This commit is contained in:
parent
3e28c20850
commit
51acceb6ba
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user