61 lines
1 KiB
Go
61 lines
1 KiB
Go
package packetizer
|
|
|
|
import (
|
|
"bufio"
|
|
mp3parser "github.com/sssgun/mp3"
|
|
"io"
|
|
)
|
|
|
|
type Mp3Packetizer struct {
|
|
decoder *mp3parser.Decoder
|
|
samples int64
|
|
}
|
|
|
|
type Mp3Packet struct {
|
|
SampleNumber int64
|
|
Frame mp3parser.Frame
|
|
}
|
|
|
|
func (p *Mp3Packet) KeepMode() KeepMode {
|
|
return Discard
|
|
}
|
|
|
|
func (p *Mp3Packet) GetStartSampleNumber() int64 {
|
|
return p.SampleNumber
|
|
}
|
|
|
|
func (p *Mp3Packet) GetEndSampleNumber() int64 {
|
|
return p.SampleNumber + int64(p.Frame.Samples())
|
|
}
|
|
|
|
func (p *Mp3Packet) Category() int64 {
|
|
return 0
|
|
}
|
|
|
|
func (p *Mp3Packet) GetData() []byte {
|
|
return p.Frame.Bytes()
|
|
}
|
|
|
|
func (p *Mp3Packet) GetDataOffset(_ int64) []byte {
|
|
return p.GetData()
|
|
}
|
|
|
|
func NewMp3Packetizer(reader io.Reader) *Mp3Packetizer {
|
|
return &Mp3Packetizer{decoder: mp3parser.NewDecoder(bufio.NewReader(reader))}
|
|
}
|
|
|
|
func (o *Mp3Packetizer) GetPacket() Packet {
|
|
packet := &Mp3Packet{}
|
|
|
|
var skipped int
|
|
|
|
if err := o.decoder.Decode(&packet.Frame, &skipped); err != nil {
|
|
return nil
|
|
}
|
|
|
|
packet.SampleNumber = o.samples
|
|
o.samples += int64(packet.Frame.Samples())
|
|
|
|
return packet
|
|
}
|