mirror of
https://github.com/cnotch/ipchub.git
synced 2025-09-27 11:52:15 +08:00
reducing switch
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
package media
|
package media
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -20,11 +21,10 @@ import (
|
|||||||
type flvMuxer struct {
|
type flvMuxer struct {
|
||||||
videoMeta av.VideoMeta
|
videoMeta av.VideoMeta
|
||||||
audioMeta av.AudioMeta
|
audioMeta av.AudioMeta
|
||||||
hasAudio bool
|
typeFlags byte
|
||||||
audioDataTemplate *flv.AudioData
|
audioDataTemplate *flv.AudioData
|
||||||
recvQueue *cache.PackQueue
|
recvQueue *cache.PackQueue
|
||||||
h264Extractor rtp.FrameExtractor
|
extractFuncs [4]func(packet *rtp.Packet) error
|
||||||
mpesExtractor rtp.FrameExtractor
|
|
||||||
tagWriter flv.TagWriter
|
tagWriter flv.TagWriter
|
||||||
closed bool
|
closed bool
|
||||||
spsMuxed bool
|
spsMuxed bool
|
||||||
@@ -33,21 +33,29 @@ type flvMuxer struct {
|
|||||||
logger *xlog.Logger // 日志对象
|
logger *xlog.Logger // 日志对象
|
||||||
}
|
}
|
||||||
|
|
||||||
func newRtp2Flv(videoMeta av.VideoMeta, audioMeta av.AudioMeta, tagWriter flv.TagWriter, logger *xlog.Logger) *flvMuxer {
|
func newFlvMuxer(videoMeta av.VideoMeta, audioMeta av.AudioMeta, tagWriter flv.TagWriter, logger *xlog.Logger) FlvMuxer {
|
||||||
muxer := &flvMuxer{
|
muxer := &flvMuxer{
|
||||||
recvQueue: cache.NewPackQueue(),
|
recvQueue: cache.NewPackQueue(),
|
||||||
videoMeta: videoMeta,
|
videoMeta: videoMeta,
|
||||||
audioMeta: audioMeta,
|
audioMeta: audioMeta,
|
||||||
hasAudio: audioMeta.Codec == "AAC",
|
typeFlags: byte(flv.TypeFlagsVideo),
|
||||||
tagWriter: tagWriter,
|
tagWriter: tagWriter,
|
||||||
closed: false,
|
closed: false,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
}
|
}
|
||||||
|
|
||||||
muxer.h264Extractor = rtp.NewH264FrameExtractor(muxer)
|
h264Extractor := rtp.NewH264FrameExtractor(muxer)
|
||||||
if muxer.hasAudio {
|
muxer.extractFuncs[rtp.ChannelVideo] = h264Extractor.Extract
|
||||||
muxer.mpesExtractor = rtp.NewMPESFrameExtractor(muxer, audioMeta.SampleRate)
|
muxer.extractFuncs[rtp.ChannelVideoControl] = h264Extractor.Control
|
||||||
|
if audioMeta.Codec == "AAC" {
|
||||||
|
muxer.typeFlags |= flv.TypeFlagsAudio
|
||||||
|
mpesExtractor := rtp.NewMPESFrameExtractor(muxer, audioMeta.SampleRate)
|
||||||
|
muxer.extractFuncs[rtp.ChannelAudio] = mpesExtractor.Extract
|
||||||
|
muxer.extractFuncs[rtp.ChannelAudioControl] = mpesExtractor.Control
|
||||||
muxer.prepareTemplate()
|
muxer.prepareTemplate()
|
||||||
|
} else {
|
||||||
|
muxer.extractFuncs[rtp.ChannelAudio] = func(*rtp.Packet) error { return nil }
|
||||||
|
muxer.extractFuncs[rtp.ChannelAudioControl] = func(*rtp.Packet) error { return nil }
|
||||||
}
|
}
|
||||||
|
|
||||||
go muxer.consume()
|
go muxer.consume()
|
||||||
@@ -165,7 +173,7 @@ func (muxer *flvMuxer) muxAudioTag(frame *rtp.Frame) error {
|
|||||||
func (muxer *flvMuxer) muxMetadataTag() error {
|
func (muxer *flvMuxer) muxMetadataTag() error {
|
||||||
properties := make(amf.EcmaArray, 0, 12)
|
properties := make(amf.EcmaArray, 0, 12)
|
||||||
|
|
||||||
if muxer.hasAudio {
|
if muxer.typeFlags&flv.TypeFlagsAudio > 0 {
|
||||||
properties = append(properties,
|
properties = append(properties,
|
||||||
amf.ObjectProperty{
|
amf.ObjectProperty{
|
||||||
Name: flv.MetaDataAudioCodecID,
|
Name: flv.MetaDataAudioCodecID,
|
||||||
@@ -277,7 +285,7 @@ func (muxer *flvMuxer) muxSequenceHeaderTag() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (muxer *flvMuxer) muxAudioSequenceHeaderTag() error {
|
func (muxer *flvMuxer) muxAudioSequenceHeaderTag() error {
|
||||||
if !muxer.hasAudio {
|
if muxer.typeFlags&flv.TypeFlagsAudio > 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -323,30 +331,9 @@ func (muxer *flvMuxer) consume() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
packet := pack.(*rtp.Packet)
|
packet := pack.(*rtp.Packet)
|
||||||
if muxer.hasAudio {
|
if err := muxer.extractFuncs[int(packet.Channel)](packet); err != nil {
|
||||||
switch packet.Channel {
|
muxer.logger.Errorf("flvmuxer: extract rtp frame error :%s", err.Error())
|
||||||
case rtp.ChannelAudio:
|
// break
|
||||||
if err := muxer.mpesExtractor.Extract(packet); err != nil {
|
|
||||||
muxer.logger.Errorf("extract aac error :%s", err.Error())
|
|
||||||
}
|
|
||||||
case rtp.ChannelVideo:
|
|
||||||
if err := muxer.h264Extractor.Extract(packet); err != nil {
|
|
||||||
muxer.logger.Errorf("extract h264 error :%s", err.Error())
|
|
||||||
}
|
|
||||||
case rtp.ChannelVideoControl:
|
|
||||||
muxer.h264Extractor.Control(packet)
|
|
||||||
case rtp.ChannelAudioControl:
|
|
||||||
muxer.mpesExtractor.Control(packet)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch packet.Channel {
|
|
||||||
case rtp.ChannelVideo:
|
|
||||||
if err := muxer.h264Extractor.Extract(packet); err != nil {
|
|
||||||
muxer.logger.Errorf("extract h264 error :%s", err.Error())
|
|
||||||
}
|
|
||||||
case rtp.ChannelVideoControl:
|
|
||||||
muxer.h264Extractor.Control(packet)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -367,9 +354,17 @@ func (muxer *flvMuxer) WritePacket(packet *rtp.Packet) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (muxer *flvMuxer) TypeFlags() byte {
|
func (muxer *flvMuxer) TypeFlags() byte {
|
||||||
typeFlags := byte(flv.TypeFlagsVideo)
|
return muxer.typeFlags
|
||||||
if muxer.hasAudio {
|
|
||||||
typeFlags |= byte(flv.TypeFlagsAudio)
|
|
||||||
}
|
|
||||||
return typeFlags
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type FlvMuxer interface {
|
||||||
|
TypeFlags() byte
|
||||||
|
rtp.PacketWriter
|
||||||
|
io.Closer
|
||||||
|
}
|
||||||
|
|
||||||
|
type emptyFlvMuxer struct{}
|
||||||
|
|
||||||
|
func (emptyFlvMuxer) TypeFlags() byte { return 0 }
|
||||||
|
func (emptyFlvMuxer) WritePacket(packet *rtp.Packet) error { return nil }
|
||||||
|
func (emptyFlvMuxer) Close() error { return nil }
|
||||||
|
Reference in New Issue
Block a user