live video streaming server in golang
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

68 lines
1.3 KiB

package parser
import (
"errors"
"io"
"github.com/gwuhaolin/livego/parser/mp3"
"github.com/gwuhaolin/livego/parser/aac"
"github.com/gwuhaolin/livego/av"
"github.com/gwuhaolin/livego/parser/h264"
)
var (
errNoAudio = errors.New("demuxer no audio")
)
type CodecParser struct {
aac *aac.Parser
mp3 *mp3.Parser
h264 *h264.Parser
}
func NewCodecParser() *CodecParser {
return &CodecParser{}
}
func (self *CodecParser) SampleRate() (int, error) {
if self.aac == nil && self.mp3 == nil {
return 0, errNoAudio
}
if self.aac != nil {
return self.aac.SampleRate(), nil
}
return self.mp3.SampleRate(), nil
}
func (self *CodecParser) Parse(p *av.Packet, w io.Writer) (err error) {
switch p.IsVideo {
case true:
f, ok := p.Header.(av.VideoPacketHeader)
if ok {
if f.CodecID() == av.VIDEO_H264 {
if self.h264 == nil {
self.h264 = h264.NewParser()
}
err = self.h264.Parse(p.Data, f.IsSeq(), w)
}
}
case false:
f, ok := p.Header.(av.AudioPacketHeader)
if ok {
switch f.SoundFormat() {
case av.SOUND_AAC:
if self.aac == nil {
self.aac = aac.NewParser()
}
err = self.aac.Parse(p.Data, f.AACPacketType(), w)
case av.SOUND_MP3:
if self.mp3 == nil {
self.mp3 = mp3.NewParser()
}
err = self.mp3.Parse(p.Data)
}
}
}
return
}