mirror of
https://github.com/Monibuca/engine.git
synced 2025-10-05 08:36:56 +08:00
63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package engine
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/yapingcat/gomedia/go-mp4"
|
|
"go.uber.org/zap"
|
|
"m7s.live/engine/v4/track"
|
|
"m7s.live/engine/v4/util"
|
|
)
|
|
|
|
type MP4Publisher struct {
|
|
Publisher
|
|
*mp4.MovDemuxer `json:"-" yaml:"-"`
|
|
}
|
|
|
|
// Start reading the MP4 file
|
|
func (p *MP4Publisher) ReadMP4Data(source io.ReadSeeker) error {
|
|
defer p.Stop()
|
|
p.MovDemuxer = mp4.CreateMp4Demuxer(source)
|
|
if tracks, err := p.ReadHead(); err != nil {
|
|
if err == io.EOF {
|
|
p.Info("Reached end of MP4 file")
|
|
return nil
|
|
}
|
|
p.Error("Error reading MP4 header", zap.Error(err))
|
|
return err
|
|
} else {
|
|
info := p.GetMp4Info()
|
|
p.Info("MP4 info", zap.Any("info", info))
|
|
for _, t := range tracks {
|
|
p.Info("MP4 track", zap.Any("track", t))
|
|
switch t.Cid {
|
|
case mp4.MP4_CODEC_H264:
|
|
p.VideoTrack = track.NewH264(p)
|
|
case mp4.MP4_CODEC_H265:
|
|
p.VideoTrack = track.NewH265(p)
|
|
case mp4.MP4_CODEC_AAC:
|
|
p.AudioTrack = track.NewAAC(p)
|
|
case mp4.MP4_CODEC_G711A:
|
|
p.AudioTrack = track.NewG711(p, true)
|
|
case mp4.MP4_CODEC_G711U:
|
|
p.AudioTrack = track.NewG711(p, false)
|
|
}
|
|
}
|
|
for {
|
|
pkg, err := p.ReadPacket()
|
|
if err != nil {
|
|
p.Error("Error reading MP4 packet", zap.Error(err))
|
|
return err
|
|
}
|
|
switch pkg.Cid {
|
|
case mp4.MP4_CODEC_H264, mp4.MP4_CODEC_H265:
|
|
p.VideoTrack.WriteAnnexB(uint32(pkg.Pts*90), uint32(pkg.Dts*90), pkg.Data)
|
|
case mp4.MP4_CODEC_AAC:
|
|
p.AudioTrack.WriteADTS(uint32(pkg.Pts*90), util.Buffer(pkg.Data))
|
|
case mp4.MP4_CODEC_G711A, mp4.MP4_CODEC_G711U:
|
|
p.AudioTrack.WriteRawBytes(uint32(pkg.Pts*90), util.Buffer(pkg.Data))
|
|
}
|
|
}
|
|
}
|
|
}
|