mirror of
https://github.com/lkmio/lkm.git
synced 2025-09-27 03:26:01 +08:00
75 lines
1.6 KiB
Go
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),
|
|
}
|
|
}
|