Add FFMpeg-based filters in video track

This commit is contained in:
Kalit Inani
2024-10-28 21:03:41 -04:00
parent 26adcb73ec
commit d9bb654e4e
2 changed files with 71 additions and 3 deletions

View File

@@ -35,7 +35,7 @@ func openCameraFeed(peerConnection *webrtc.PeerConnection, videoTrack *webrtc.Tr
fmt.Println("Writing to tracks")
vp := NewVideoProcessor()
go vp.writeH264ToTrackAR(videoTrack)
go vp.writeH264ToTrackFFmpegFilters(videoTrack)
return nil
}
@@ -114,3 +114,73 @@ func (vp *VideoProcessor) writeH264ToTrackAR(track *webrtc.TrackLocalStaticSampl
}
}
}
func (vp *VideoProcessor) writeH264ToTrackFFmpegFilters(track *webrtc.TrackLocalStaticSample) {
defer vp.freeVideoCoding()
vp.initFilters()
var err error
ticker := time.NewTicker(h264FrameDuration)
for ; true; <-ticker.C {
if err = vp.inputFormatContext.ReadFrame(vp.decodePacket); err != nil {
if errors.Is(err, astiav.ErrEof) {
break
}
panic(err)
}
vp.decodePacket.RescaleTs(vp.videoStream.TimeBase(), vp.decodeCodecContext.TimeBase())
if err = vp.decodeCodecContext.SendPacket(vp.decodePacket); err != nil {
panic(err)
}
for {
if err = vp.decodeCodecContext.ReceiveFrame(vp.decodeFrame); err != nil {
if errors.Is(err, astiav.ErrEof) || errors.Is(err, astiav.ErrEagain) {
fmt.Println("Error while receiving decoded framed: ", err)
break
}
panic(err)
}
if err = vp.buffersrcContext.AddFrame(vp.decodeFrame, astiav.NewBuffersrcFlags(astiav.BuffersrcFlagKeepRef)); err != nil {
err = fmt.Errorf("main: adding frame failed: %w", err)
return
}
for{
vp.filterFrame.Unref()
if err = vp.buffersinkContext.GetFrame(vp.filterFrame, astiav.NewBuffersinkFlags()); err != nil {
if errors.Is(err, astiav.ErrEof) || errors.Is(err, astiav.ErrEagain) {
break
}
panic(err)
}
vp.pts++
vp.filterFrame.SetPts(vp.pts)
if err = vp.encodeCodecContext.SendFrame(vp.filterFrame); err != nil {
panic(err)
}
for {
// Read encoded packets
vp.encodePacket = astiav.AllocPacket()
if err = vp.encodeCodecContext.ReceivePacket(vp.encodePacket); err != nil {
if errors.Is(err, astiav.ErrEof) || errors.Is(err, astiav.ErrEagain) {
break
}
panic(err)
}
// Write H264 to track
if err = track.WriteSample(media.Sample{Data: vp.encodePacket.Data(), Duration: h264FrameDuration}); err != nil {
panic(err)
}
}
}
}
}
}

2
go.sum
View File

@@ -1,5 +1,3 @@
github.com/asticode/go-astiav v0.20.0 h1:Puf++04KDWjhf71Y70zcnu0Nw6SQTVTQdLadT7Gquqs=
github.com/asticode/go-astiav v0.20.0/go.mod h1:K7D8UC6GeQt85FUxk2KVwYxHnotrxuEnp5evkkudc2s=
github.com/asticode/go-astiav v0.24.0 h1:qckxt/spFcLYof5kZkLSjlcTYFGcm+luJ5b0zkAGAEM=
github.com/asticode/go-astiav v0.24.0/go.mod h1:K7D8UC6GeQt85FUxk2KVwYxHnotrxuEnp5evkkudc2s=
github.com/asticode/go-astikit v0.42.0 h1:pnir/2KLUSr0527Tv908iAH6EGYYrYta132vvjXsH5w=