bugfix and add probepkts

This commit is contained in:
nareix 2016-06-28 15:52:50 +08:00
parent 51acceb6ba
commit ee9cad71e7

24
flv.go
View File

@ -120,6 +120,7 @@ type Demuxer struct {
videostreamidx int videostreamidx int
audiostreamidx int audiostreamidx int
pr *pio.Reader pr *pio.Reader
probepkts []flvio.Tag
} }
func Open(r io.Reader) (demuxer *Demuxer, err error) { func Open(r io.Reader) (demuxer *Demuxer, err error) {
@ -153,7 +154,8 @@ func (self *Demuxer) ReadHeader() (err error) {
case *flvio.Videodata: case *flvio.Videodata:
switch tag.CodecID { switch tag.CodecID {
case flvio.VIDEO_H264: case flvio.VIDEO_H264:
if tag.AVCPacketType == flvio.AVC_SEQHDR { switch tag.AVCPacketType {
case flvio.AVC_SEQHDR:
var codec h264parser.CodecData var codec h264parser.CodecData
if codec, err = h264parser.NewCodecDataFromAVCDecoderConfRecord(tag.Data); err != nil { if codec, err = h264parser.NewCodecDataFromAVCDecoderConfRecord(tag.Data); err != nil {
err = fmt.Errorf("flv: h264 seqhdr invalid") err = fmt.Errorf("flv: h264 seqhdr invalid")
@ -162,6 +164,9 @@ func (self *Demuxer) ReadHeader() (err error) {
self.videostreamidx = len(self.streams) self.videostreamidx = len(self.streams)
self.streams = append(self.streams, &flvStream{CodecData: codec}) self.streams = append(self.streams, &flvStream{CodecData: codec})
got |= flvio.FILE_HAS_VIDEO got |= flvio.FILE_HAS_VIDEO
case flvio.AVC_NALU:
self.probepkts = append(self.probepkts, tag)
} }
default: default:
@ -172,7 +177,8 @@ func (self *Demuxer) ReadHeader() (err error) {
case *flvio.Audiodata: case *flvio.Audiodata:
switch tag.SoundFormat { switch tag.SoundFormat {
case flvio.SOUND_AAC: case flvio.SOUND_AAC:
if tag.AACPacketType == flvio.AAC_SEQHDR { switch tag.AACPacketType {
case flvio.AAC_SEQHDR:
var codec aacparser.CodecData var codec aacparser.CodecData
if codec, err = aacparser.NewCodecDataFromMPEG4AudioConfigBytes(tag.Data); err != nil { if codec, err = aacparser.NewCodecDataFromMPEG4AudioConfigBytes(tag.Data); err != nil {
err = fmt.Errorf("flv: aac seqhdr invalid") err = fmt.Errorf("flv: aac seqhdr invalid")
@ -181,6 +187,9 @@ func (self *Demuxer) ReadHeader() (err error) {
self.audiostreamidx = len(self.streams) self.audiostreamidx = len(self.streams)
self.streams = append(self.streams, &flvStream{CodecData: codec}) self.streams = append(self.streams, &flvStream{CodecData: codec})
got |= flvio.FILE_HAS_AUDIO got |= flvio.FILE_HAS_AUDIO
case flvio.AAC_RAW:
self.probepkts = append(self.probepkts, tag)
} }
default: default:
@ -218,8 +227,13 @@ func (self *Demuxer) ReadPacket() (pkt av.Packet, err error) {
loop: for { loop: for {
var _tag flvio.Tag var _tag flvio.Tag
if _tag, timestamp, err = flvio.ReadTag(self.pr); err != nil { if len(self.probepkts) > 0 {
return _tag = self.probepkts[0]
self.probepkts = self.probepkts[1:]
} else {
if _tag, timestamp, err = flvio.ReadTag(self.pr); err != nil {
return
}
} }
switch tag := _tag.(type) { switch tag := _tag.(type) {
@ -228,7 +242,7 @@ func (self *Demuxer) ReadPacket() (pkt av.Packet, err error) {
stream = self.streams[self.videostreamidx] stream = self.streams[self.videostreamidx]
pkt.Idx = int8(self.videostreamidx) pkt.Idx = int8(self.videostreamidx)
pkt.CompositionTime = tsToTime(tag.CompositionTime) pkt.CompositionTime = tsToTime(tag.CompositionTime)
pkt.IsKeyFrame = true pkt.IsKeyFrame = tag.FrameType == flvio.FRAME_KEY
pkt.Data = tag.Data pkt.Data = tag.Data
break loop break loop
} }