change to newapi
This commit is contained in:
parent
e5b6b2eb0e
commit
9ff5539ccb
162
util.go
162
util.go
@ -1,16 +1,158 @@
|
||||
|
||||
package av
|
||||
|
||||
const (
|
||||
H264 = 1
|
||||
AAC = 2
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/nareix/codec/aacparser"
|
||||
"github.com/nareix/codec/h264parser"
|
||||
)
|
||||
|
||||
type Packet struct {
|
||||
Codec int
|
||||
Key bool
|
||||
Pos float32
|
||||
Data []byte
|
||||
Idx int
|
||||
type CodecType int
|
||||
|
||||
const (
|
||||
H264 = CodecType(1)
|
||||
AAC = CodecType(2)
|
||||
)
|
||||
|
||||
func (self CodecType) String() string {
|
||||
switch self {
|
||||
case H264:
|
||||
return "H264"
|
||||
case AAC:
|
||||
return "AAC"
|
||||
}
|
||||
return "?"
|
||||
}
|
||||
|
||||
func (self CodecType) IsAudio() bool {
|
||||
return self == AAC
|
||||
}
|
||||
|
||||
func (self CodecType) IsVideo() bool {
|
||||
return self == H264
|
||||
}
|
||||
|
||||
type Stream interface {
|
||||
IsVideo() bool
|
||||
IsAudio() bool
|
||||
Type() CodecType
|
||||
SetType(CodecType)
|
||||
CodecData() []byte
|
||||
SetCodecData([]byte) error
|
||||
SampleRate() int
|
||||
ChannelCount() int
|
||||
Width() int
|
||||
Height() int
|
||||
String() string
|
||||
FillParamsByStream(Stream) error
|
||||
}
|
||||
|
||||
type StreamCommon struct {
|
||||
codecType CodecType
|
||||
codecData []byte
|
||||
H264CodecInfo h264parser.CodecInfo
|
||||
AACCodecInfo aacparser.CodecInfo
|
||||
}
|
||||
|
||||
type Muxer interface {
|
||||
NewStream() Stream
|
||||
WriteHeader() error
|
||||
WriteTrailer() error
|
||||
WritePacket(int, Packet) error
|
||||
SetTime(float64)
|
||||
}
|
||||
|
||||
type Demuxer interface {
|
||||
ReadHeader() error
|
||||
ReadPacket() (int, Packet, error)
|
||||
Streams() []Stream
|
||||
Time() float64
|
||||
}
|
||||
|
||||
type SeekableDemuxer interface {
|
||||
Demuxer
|
||||
SeekToTime(float64) error
|
||||
}
|
||||
|
||||
type Packet struct {
|
||||
IsKeyFrame bool
|
||||
Data []byte
|
||||
Duration float64
|
||||
CompositionTime float64
|
||||
}
|
||||
|
||||
func (self *StreamCommon) Type() CodecType {
|
||||
return self.codecType
|
||||
}
|
||||
|
||||
func (self *StreamCommon) SetType(CodecType CodecType) {
|
||||
self.codecType = CodecType
|
||||
}
|
||||
|
||||
func (self *StreamCommon) String() string {
|
||||
str := self.codecType.String()
|
||||
if self.IsAudio() {
|
||||
str += fmt.Sprintf(" %dHz %dch", self.SampleRate(), self.ChannelCount())
|
||||
} else if self.IsVideo() {
|
||||
str += fmt.Sprintf(" %dx%d", self.Width(), self.Height())
|
||||
}
|
||||
return str
|
||||
}
|
||||
|
||||
func (self *StreamCommon) SetCodecData(data []byte) (err error) {
|
||||
if self.codecType == H264 {
|
||||
if self.H264CodecInfo, err = h264parser.ParseCodecData(data); err != nil {
|
||||
return
|
||||
}
|
||||
} else if self.codecType == AAC {
|
||||
if self.AACCodecInfo, err = aacparser.ParseCodecData(data); err != nil {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
err = fmt.Errorf("unknown codec type=%d", self.codecType)
|
||||
}
|
||||
self.codecData = data
|
||||
return
|
||||
}
|
||||
|
||||
func (self *StreamCommon) CodecData() (data []byte) {
|
||||
return self.codecData
|
||||
}
|
||||
|
||||
func (self *StreamCommon) ChannelCount() int {
|
||||
return self.AACCodecInfo.ChannelCount
|
||||
}
|
||||
|
||||
func (self *StreamCommon) SampleRate() int {
|
||||
return self.AACCodecInfo.SampleRate
|
||||
}
|
||||
|
||||
func (self *StreamCommon) Width() int {
|
||||
return int(self.H264CodecInfo.SPSInfo.Width)
|
||||
}
|
||||
|
||||
func (self *StreamCommon) Height() int {
|
||||
return int(self.H264CodecInfo.SPSInfo.Height)
|
||||
}
|
||||
|
||||
func (self *StreamCommon) IsVideo() bool {
|
||||
if self.codecType == H264 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (self *StreamCommon) IsAudio() bool {
|
||||
if self.codecType == AAC {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (self *StreamCommon) FillParamsByStream(other Stream) (err error) {
|
||||
self.codecType = other.Type()
|
||||
if err = self.SetCodecData(other.CodecData()); err != nil {
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user