Files
lkm/stream/transcode_track.go
2025-07-03 17:27:45 +08:00

75 lines
1.6 KiB
Go

package stream
import (
"github.com/lkmio/avformat"
"github.com/lkmio/avformat/collections"
"github.com/lkmio/lkm/transcode"
"sync"
)
var (
AudioPacketDataPool = sync.Pool{
New: func() interface{} {
return make([]byte, 48000)
},
}
)
type TranscodeTrack struct {
track *Track
packets *collections.Queue[*avformat.AVPacket]
transcoder transcode.Transcoder
result []*avformat.AVPacket
dst int64
pts int64
}
func (t *TranscodeTrack) Input(packet *avformat.AVPacket) []*avformat.AVPacket {
t.result = t.result[:0]
_, _ = t.transcoder.Transcode(packet, func(bytes []byte, duration int) {
dstPkt := avformat.PacketPool.Get().(*avformat.AVPacket)
*dstPkt = *packet
data := AudioPacketDataPool.Get().([]byte)
copy(data, bytes)
dstPkt.Data = data[:len(bytes)]
dstPkt.Timebase = 1000
dstPkt.Pts = t.pts
dstPkt.Dts = t.pts
dstPkt.Duration = int64(duration)
dstPkt.CodecID = t.track.Stream.CodecID
dstPkt.Index = t.track.Stream.Index
t.pts += dstPkt.Duration
t.dst += dstPkt.Duration
t.packets.Push(dstPkt)
t.result = append(t.result, dstPkt)
})
return t.result
}
func (t *TranscodeTrack) Clear() {
for t.packets.Size() > 0 {
packet := t.packets.Pop()
AudioPacketDataPool.Put(packet.Data[:cap(packet.Data)])
avformat.FreePacket(packet)
}
}
func (t *TranscodeTrack) Close() {
t.transcoder.Close()
t.Clear()
}
func NewTranscodeTrack(track *Track, transcoder transcode.Transcoder) *TranscodeTrack {
return &TranscodeTrack{
track: track,
transcoder: transcoder,
packets: collections.NewQueue[*avformat.AVPacket](128),
}
}