refactor: frame converter and mp4 track improvements

- Refactor frame converter implementation
- Update mp4 track to use ICodex
- General refactoring and code improvements

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
langhuihui
2025-08-04 09:17:12 +08:00
parent b6ee2843b0
commit 8a9fffb987
262 changed files with 20831 additions and 12141 deletions

View File

@@ -1,20 +0,0 @@
package transcode
import (
"m7s.live/v5"
"m7s.live/v5/pkg/task"
)
func NewPuller() m7s.IPuller {
return &Puller{}
}
type Puller struct {
task.Task
PullJob m7s.PullJob
}
func (p *Puller) GetPullJob() *m7s.PullJob {
return &p.PullJob
}

View File

@@ -30,7 +30,7 @@ const (
)
type (
TransMode string
TransMode = string
DecodeConfig struct {
Mode TransMode `default:"pipe" json:"mode" desc:"转码模式"` //转码模式
Codec string `json:"codec" desc:"解码器"`
@@ -169,14 +169,13 @@ func (t *Transformer) Start() (err error) {
t.ffmpeg.Stderr = os.Stderr
}
t.Info("start exec", "cmd", t.ffmpeg.String())
return t.ffmpeg.Start()
return
}
func (t *Transformer) Go() error {
t.SetDescription("pid", t.ffmpeg.Process.Pid)
if t.From.Mode == "pipe" {
rBuf := make(chan []byte, 100)
t.ffmpeg.Stdin = util.NewBufReaderChan(rBuf)
bufReader := util.NewBufReaderChan(100)
t.ffmpeg.Stdin = bufReader
var live flv.Live
live.Subscriber = t.TransformJob.Subscriber
var bufferFull time.Time
@@ -185,10 +184,9 @@ func (t *Transformer) Go() error {
for _, b := range flv {
buffer = append(buffer, b...)
}
select {
case rBuf <- buffer:
if bufReader.Feed(buffer) {
bufferFull = time.Now()
default:
} else {
t.Warn("pipe input buffer full")
if time.Since(bufferFull) > time.Second*5 {
t.Stop(bufio.ErrBufferFull)
@@ -196,9 +194,19 @@ func (t *Transformer) Go() error {
}
return
}
defer close(rBuf)
defer bufReader.Recycle()
err := t.ffmpeg.Start()
if err != nil {
return err
}
t.SetDescription("pid", t.ffmpeg.Process.Pid)
return live.Run()
} else {
err := t.ffmpeg.Start()
if err != nil {
return err
}
t.SetDescription("pid", t.ffmpeg.Process.Pid)
if err := t.ffmpeg.Wait(); err != nil {
return err
}