Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Non-monotonically increasing PTS, frame index # #312

Closed
alllexx88 opened this issue Jun 14, 2023 · 4 comments
Closed

Non-monotonically increasing PTS, frame index # #312

alllexx88 opened this issue Jun 14, 2023 · 4 comments

Comments

@alllexx88
Copy link

Hello! I made this code mix from server-h264-save-to-disk and client-read-format-h264-convert-to-jpeg to implement an RTSP server that converts input h264 stream into images (comments not updated):

package main

import (
	"fmt"
	"image"
	"image/jpeg"
	"log"
	"os"
	"strconv"
	"sync"
	"time"

	"github.com/pion/rtp"

	"github.com/bluenviron/gortsplib/v3"
	"github.com/bluenviron/gortsplib/v3/pkg/base"
	"github.com/bluenviron/gortsplib/v3/pkg/formats"
	"github.com/bluenviron/gortsplib/v3/pkg/formats/rtph264"
	"github.com/bluenviron/gortsplib/v3/pkg/media"
)

func saveToFile(img image.Image) error {
	// create file
	fname := strconv.FormatInt(time.Now().UnixNano()/int64(time.Millisecond), 10) + ".jpg"
	f, err := os.Create(fname)
	if err != nil {
		panic(err)
	}
	defer f.Close()

	log.Println("saving", fname)

	// convert to jpeg
	return jpeg.Encode(f, img, &jpeg.Options{
		Quality: 60,
	})
}

// This example shows how to
// 1. create a RTSP server which accepts plain connections
// 2. allow a single client to publish a stream, containing a H264 media, with TCP or UDP
// 3. save the content of the H264 media into a file in MPEG-TS format

type serverHandler struct {
	mutex      sync.Mutex
	publisher  *gortsplib.ServerSession
	media      *media.Media
	format     *formats.H264
	rtpDec     *rtph264.Decoder
	h264RawDec *h264Decoder
}

// called when a connection is opened.
func (sh *serverHandler) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) {
	log.Printf("conn opened")
}

// called when a connection is closed.
func (sh *serverHandler) OnConnClose(ctx *gortsplib.ServerHandlerOnConnCloseCtx) {
	log.Printf("conn closed (%v)", ctx.Error)
}

// called when a session is opened.
func (sh *serverHandler) OnSessionOpen(ctx *gortsplib.ServerHandlerOnSessionOpenCtx) {
	log.Printf("session opened")
}

// called when a session is closed.
func (sh *serverHandler) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionCloseCtx) {
	log.Printf("session closed")

	sh.mutex.Lock()
	defer sh.mutex.Unlock()

	sh.publisher = nil
	sh.h264RawDec.close()
}

// called when receiving an ANNOUNCE request.
func (sh *serverHandler) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) (*base.Response, error) {
	log.Printf("announce request")

	sh.mutex.Lock()
	defer sh.mutex.Unlock()

	if sh.publisher != nil {
		sh.publisher.Close()
		sh.h264RawDec.close()
	}

	// find the H264 media and format
	var forma *formats.H264
	medi := ctx.Medias.FindFormat(&forma)
	if medi == nil {
		return &base.Response{
			StatusCode: base.StatusBadRequest,
		}, fmt.Errorf("H264 media not found")
	}

	// setup RTP/H264 -> H264 decoder
	rtpDec, err := forma.CreateDecoder2()
	if err != nil {
		panic(err)
	}

	// setup H264 -> MPEGTS muxer
	h264RawDec, err := newH264Decoder()
	if forma.SPS != nil {
		h264RawDec.decode(forma.SPS)
	}
	if forma.PPS != nil {
		h264RawDec.decode(forma.PPS)
	}
	if err != nil {
		return &base.Response{
			StatusCode: base.StatusBadRequest,
		}, err
	}

	sh.publisher = ctx.Session
	sh.media = medi
	sh.format = forma
	sh.rtpDec = rtpDec
	sh.h264RawDec = h264RawDec

	return &base.Response{
		StatusCode: base.StatusOK,
	}, nil
}

// OnSetup called when receiving a SETUP request.
func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
	log.Printf("setup request %s", ctx.Path)

	return &base.Response{
		StatusCode: base.StatusOK,
	}, nil, nil
}

// OnRecord called when receiving a RECORD request.
func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*base.Response, error) {
	log.Printf("record request %s", ctx.Path)

	// called when receiving an RTP packet
	ctx.Session.OnPacketRTP(sh.media, sh.format, func(pkt *rtp.Packet) {
		nalus, pts, err := sh.rtpDec.Decode(pkt)
		if err != nil {
			return
		}

		// encode H264 NALUs into MPEG-TS
		for _, nalu := range nalus {
			// convert NALUs into RGBA frames
			img, err := sh.h264RawDec.decode(nalu)
			if err != nil {
				panic(err)
			}

			// wait for a frame
			if img == nil {
				continue
			}

			log.Printf("Image pts: %s", pts)

			// convert frame to JPEG and save to file
			//err = saveToFile(img)
			//if err != nil {
			//	panic(err)
			//}

			//saveCount++
			//if saveCount == 5 {
			//	log.Printf("saved 5 images, exiting")
			//	os.Exit(1)
			//}
		}
	})

	return &base.Response{
		StatusCode: base.StatusOK,
	}, nil
}

func main() {
	// configure the server
	s := &gortsplib.Server{
		Handler:           &serverHandler{},
		RTSPAddress:       ":8554",
		UDPRTPAddress:     ":8000",
		UDPRTCPAddress:    ":8001",
		MulticastIPRange:  "224.1.0.0/16",
		MulticastRTPPort:  8002,
		MulticastRTCPPort: 8003,
	}

	// start server and wait until a fatal error
	log.Printf("server is ready")
	panic(s.StartAndWait())
}

If I uncomment the err = saveToFile(img) part in OnRecord(), I do get frames saved as pictures. What confuses me is that pts don't seem to grow monotonically, I get something like this:

2023/06/14 21:15:42 server is ready
2023/06/14 21:15:45 conn opened
2023/06/14 21:15:45 session opened
2023/06/14 21:15:45 announce request
[h264 @ 0x7f0530000bc0] no frame!
[h264 @ 0x7f0530000bc0] no frame!
2023/06/14 21:15:45 setup request /live/stream
2023/06/14 21:15:45 record request /live/stream
[h264 @ 0x7f0530000bc0] no frame!
2023/06/14 21:15:47 Image pts: 40ms
2023/06/14 21:15:47 Image pts: 80ms
2023/06/14 21:15:47 Image pts: 280ms
2023/06/14 21:15:47 Image pts: 200ms
2023/06/14 21:15:47 Image pts: 160ms
2023/06/14 21:15:47 Image pts: 240ms
2023/06/14 21:15:47 Image pts: 440ms
2023/06/14 21:15:47 Image pts: 360ms
2023/06/14 21:15:47 Image pts: 320ms
2023/06/14 21:15:47 Image pts: 400ms
2023/06/14 21:15:48 Image pts: 600ms
2023/06/14 21:15:48 Image pts: 520ms
2023/06/14 21:15:48 Image pts: 480ms
2023/06/14 21:15:48 Image pts: 560ms
2023/06/14 21:15:48 Image pts: 760ms
2023/06/14 21:15:48 Image pts: 680ms
2023/06/14 21:15:48 Image pts: 640ms
2023/06/14 21:15:48 Image pts: 720ms
2023/06/14 21:15:48 Image pts: 920ms
2023/06/14 21:15:48 Image pts: 840ms
2023/06/14 21:15:48 Image pts: 800ms
2023/06/14 21:15:48 Image pts: 880ms
2023/06/14 21:15:48 Image pts: 960ms
2023/06/14 21:15:48 Image pts: 1.12s
2023/06/14 21:15:48 Image pts: 1.04s
2023/06/14 21:15:48 Image pts: 1s
2023/06/14 21:15:48 Image pts: 1.08s
2023/06/14 21:15:48 Image pts: 1.2s
2023/06/14 21:15:48 Image pts: 1.16s
2023/06/14 21:15:48 Image pts: 1.28s
2023/06/14 21:15:48 Image pts: 1.24s
2023/06/14 21:15:48 Image pts: 1.32s
2023/06/14 21:15:48 Image pts: 1.44s
2023/06/14 21:15:48 Image pts: 1.36s
2023/06/14 21:15:48 Image pts: 1.4s
2023/06/14 21:15:49 Image pts: 1.48s
2023/06/14 21:15:49 Image pts: 1.64s
2023/06/14 21:15:49 Image pts: 1.56s
2023/06/14 21:15:49 Image pts: 1.52s
2023/06/14 21:15:49 Image pts: 1.6s
2023/06/14 21:15:49 Image pts: 1.8s
2023/06/14 21:15:49 Image pts: 1.72s
2023/06/14 21:15:49 Image pts: 1.68s
2023/06/14 21:15:49 Image pts: 1.76s
2023/06/14 21:15:49 Image pts: 1.84s
2023/06/14 21:15:49 Image pts: 1.96s
2023/06/14 21:15:49 Image pts: 1.88s
2023/06/14 21:15:49 Image pts: 1.92s
2023/06/14 21:15:49 Image pts: 2s
2023/06/14 21:15:49 Image pts: 2.16s
2023/06/14 21:15:49 Image pts: 2.08s
2023/06/14 21:15:49 Image pts: 2.04s
2023/06/14 21:15:49 Image pts: 2.12s
2023/06/14 21:15:49 Image pts: 2.32s
2023/06/14 21:15:49 Image pts: 2.24s
2023/06/14 21:15:49 Image pts: 2.2s
2023/06/14 21:15:49 Image pts: 2.28s
2023/06/14 21:15:49 Image pts: 2.4s
2023/06/14 21:15:49 Image pts: 2.36s
2023/06/14 21:15:49 Image pts: 2.44s
2023/06/14 21:15:50 Image pts: 2.48s
2023/06/14 21:15:50 Image pts: 2.52s
2023/06/14 21:15:50 Image pts: 2.6s
2023/06/14 21:15:50 Image pts: 2.56s
2023/06/14 21:15:50 Image pts: 2.64s
2023/06/14 21:15:50 Image pts: 2.8s
2023/06/14 21:15:50 Image pts: 2.72s
2023/06/14 21:15:50 Image pts: 2.68s
2023/06/14 21:15:50 Image pts: 2.76s
2023/06/14 21:15:50 Image pts: 2.96s
2023/06/14 21:15:50 Image pts: 2.88s
2023/06/14 21:15:50 Image pts: 2.84s
2023/06/14 21:15:50 Image pts: 2.92s
2023/06/14 21:15:50 Image pts: 3s
2023/06/14 21:15:50 Image pts: 3.04s
2023/06/14 21:15:50 Image pts: 3.08s
2023/06/14 21:15:50 Image pts: 3.24s
2023/06/14 21:15:50 Image pts: 3.16s
2023/06/14 21:15:50 Image pts: 3.12s
2023/06/14 21:15:50 Image pts: 3.2s
2023/06/14 21:15:50 Image pts: 3.4s
2023/06/14 21:15:50 Image pts: 3.32s
2023/06/14 21:15:50 Image pts: 3.28s
2023/06/14 21:15:50 Image pts: 3.36s
2023/06/14 21:15:50 Image pts: 3.56s
2023/06/14 21:15:51 Image pts: 3.48s
2023/06/14 21:15:51 Image pts: 3.44s
2023/06/14 21:15:51 Image pts: 3.52s
2023/06/14 21:15:51 Image pts: 3.6s
2023/06/14 21:15:51 Image pts: 3.76s
2023/06/14 21:15:51 Image pts: 3.68s
2023/06/14 21:15:51 Image pts: 3.64s
2023/06/14 21:15:51 Image pts: 3.72s
2023/06/14 21:15:51 Image pts: 3.92s
2023/06/14 21:15:51 Image pts: 3.84s
2023/06/14 21:15:51 Image pts: 3.8s
2023/06/14 21:15:51 Image pts: 3.88s
2023/06/14 21:15:51 Image pts: 4.08s
2023/06/14 21:15:51 Image pts: 4s
2023/06/14 21:15:51 Image pts: 3.96s
2023/06/14 21:15:51 Image pts: 4.04s
2023/06/14 21:15:51 Image pts: 4.24s
2023/06/14 21:15:51 Image pts: 4.16s
2023/06/14 21:15:51 Image pts: 4.12s
2023/06/14 21:15:51 Image pts: 4.2s
2023/06/14 21:15:51 Image pts: 4.36s
2023/06/14 21:15:51 Image pts: 4.28s
2023/06/14 21:15:51 Image pts: 4.32s
2023/06/14 21:15:51 Image pts: 4.4s
2023/06/14 21:15:51 Image pts: 4.44s
2023/06/14 21:15:52 Image pts: 4.52s
2023/06/14 21:15:52 Image pts: 4.48s
2023/06/14 21:15:52 Image pts: 4.56s
2023/06/14 21:15:52 Image pts: 4.64s
2023/06/14 21:15:52 Image pts: 4.6s
2023/06/14 21:15:52 Image pts: 4.68s
2023/06/14 21:15:52 Image pts: 4.76s
2023/06/14 21:15:52 Image pts: 4.72s
2023/06/14 21:15:52 Image pts: 4.92s
2023/06/14 21:15:52 Image pts: 4.84s
2023/06/14 21:15:52 Image pts: 4.8s
2023/06/14 21:15:52 Image pts: 4.88s
2023/06/14 21:15:52 Image pts: 5.08s
2023/06/14 21:15:52 Image pts: 5s
2023/06/14 21:15:52 Image pts: 4.96s
2023/06/14 21:15:52 Image pts: 5.04s
2023/06/14 21:15:52 Image pts: 5.24s
2023/06/14 21:15:52 Image pts: 5.16s
2023/06/14 21:15:52 Image pts: 5.12s
2023/06/14 21:15:52 Image pts: 5.2s
2023/06/14 21:15:52 Image pts: 5.4s
2023/06/14 21:15:52 Image pts: 5.32s
2023/06/14 21:15:52 Image pts: 5.28s
2023/06/14 21:15:52 Image pts: 5.36s
2023/06/14 21:15:52 Image pts: 5.56s
2023/06/14 21:15:53 Image pts: 5.48s
2023/06/14 21:15:53 Image pts: 5.44s
2023/06/14 21:15:53 Image pts: 5.52s
2023/06/14 21:15:53 Image pts: 5.68s
2023/06/14 21:15:53 Image pts: 5.6s
2023/06/14 21:15:53 Image pts: 5.64s
2023/06/14 21:15:53 Image pts: 5.84s
2023/06/14 21:15:53 Image pts: 5.76s
2023/06/14 21:15:53 Image pts: 5.72s
2023/06/14 21:15:53 Image pts: 5.8s
2023/06/14 21:15:53 Image pts: 6s
2023/06/14 21:15:53 Image pts: 5.92s
2023/06/14 21:15:53 Image pts: 5.88s
2023/06/14 21:15:53 Image pts: 5.96s
2023/06/14 21:15:53 Image pts: 6.16s
2023/06/14 21:15:53 Image pts: 6.08s
2023/06/14 21:15:53 Image pts: 6.04s
2023/06/14 21:15:53 Image pts: 6.12s
2023/06/14 21:15:53 Image pts: 6.32s
2023/06/14 21:15:53 Image pts: 6.24s
2023/06/14 21:15:53 Image pts: 6.2s
2023/06/14 21:15:53 Image pts: 6.28s
2023/06/14 21:15:53 Image pts: 6.36s
2023/06/14 21:15:53 Image pts: 6.4s
2023/06/14 21:15:53 Image pts: 6.44s
2023/06/14 21:15:54 Image pts: 6.48s
2023/06/14 21:15:54 Image pts: 6.52s
2023/06/14 21:15:54 Image pts: 6.6s
2023/06/14 21:15:54 Image pts: 6.56s
2023/06/14 21:15:54 Image pts: 6.64s
2023/06/14 21:15:54 Image pts: 6.68s
2023/06/14 21:15:54 Image pts: 6.84s
2023/06/14 21:15:54 Image pts: 6.76s
2023/06/14 21:15:54 Image pts: 6.72s
2023/06/14 21:15:54 Image pts: 6.8s
2023/06/14 21:15:54 Image pts: 7s
.
.
.
2023/06/14 21:16:14 Image pts: 27s
2023/06/14 21:16:14 Image pts: 27.08s
2023/06/14 21:16:14 Image pts: 27.28s
2023/06/14 21:16:14 Image pts: 27.2s
2023/06/14 21:16:14 Image pts: 27.16s
2023/06/14 21:16:14 Image pts: 27.24s
2023/06/14 21:16:14 Image pts: 27.44s
2023/06/14 21:16:14 Image pts: 27.36s
2023/06/14 21:16:14 Image pts: 27.32s
2023/06/14 21:16:14 Image pts: 27.4s
2023/06/14 21:16:14 Image pts: 27.6s
2023/06/14 21:16:14 Image pts: 27.52s
2023/06/14 21:16:14 Image pts: 27.48s
2023/06/14 21:16:14 Image pts: 27.56s
2023/06/14 21:16:14 Image pts: 27.76s
2023/06/14 21:16:14 Image pts: 27.68s
2023/06/14 21:16:14 Image pts: 27.64s
2023/06/14 21:16:14 Image pts: 27.72s
2023/06/14 21:16:14 Image pts: 27.92s
2023/06/14 21:16:14 Image pts: 27.84s
2023/06/14 21:16:14 Image pts: 27.8s
2023/06/14 21:16:14 Image pts: 27.88s
2023/06/14 21:16:14 Image pts: 28.08s
2023/06/14 21:16:14 Image pts: 28s
2023/06/14 21:16:14 Image pts: 27.96s
2023/06/14 21:16:14 Image pts: 28.04s
2023/06/14 21:16:15 Image pts: 28.24s
2023/06/14 21:16:15 Image pts: 28.16s
2023/06/14 21:16:15 Image pts: 28.12s
2023/06/14 21:16:15 Image pts: 28.2s
2023/06/14 21:16:15 Image pts: 28.4s
2023/06/14 21:16:15 Image pts: 28.32s
2023/06/14 21:16:15 Image pts: 28.28s
2023/06/14 21:16:15 Image pts: 28.36s
2023/06/14 21:16:15 Image pts: 28.56s
2023/06/14 21:16:15 Image pts: 28.48s
2023/06/14 21:16:15 Image pts: 28.44s
2023/06/14 21:16:15 Image pts: 28.52s
2023/06/14 21:16:15 Image pts: 28.72s
2023/06/14 21:16:15 Image pts: 28.64s
2023/06/14 21:16:15 Image pts: 28.6s
2023/06/14 21:16:15 Image pts: 28.68s
2023/06/14 21:16:15 Image pts: 28.88s
2023/06/14 21:16:15 Image pts: 28.8s
2023/06/14 21:16:15 Image pts: 28.76s
2023/06/14 21:16:15 Image pts: 28.84s
2023/06/14 21:16:15 Image pts: 28.96s
2023/06/14 21:16:15 Image pts: 28.92s
2023/06/14 21:16:15 Image pts: 29s
2023/06/14 21:16:15 Image pts: 29.04s
2023/06/14 21:16:15 Image pts: 29.12s
2023/06/14 21:16:15 Image pts: 29.08s
2023/06/14 21:16:15 Image pts: 29.2s
2023/06/14 21:16:15 Image pts: 29.16s
2023/06/14 21:16:15 Image pts: 29.28s
2023/06/14 21:16:15 Image pts: 29.24s
2023/06/14 21:16:15 Image pts: 29.36s
2023/06/14 21:16:15 Image pts: 29.32s
2023/06/14 21:16:15 Image pts: 29.44s
2023/06/14 21:16:15 Image pts: 29.4s
2023/06/14 21:16:15 Image pts: 29.52s
2023/06/14 21:16:15 Image pts: 29.48s
2023/06/14 21:16:15 Image pts: 29.6s
2023/06/14 21:16:15 Image pts: 29.56s
2023/06/14 21:16:15 Image pts: 29.68s
2023/06/14 21:16:15 Image pts: 29.64s
2023/06/14 21:16:15 Image pts: 29.8s
2023/06/14 21:16:15 Image pts: 29.72s
2023/06/14 21:16:15 Image pts: 29.76s
2023/06/14 21:16:15 Image pts: 29.88s
2023/06/14 21:16:15 Image pts: 29.84s
2023/06/14 21:16:15 Image pts: 30.04s
2023/06/14 21:16:15 Image pts: 29.96s
2023/06/14 21:16:15 Image pts: 29.92s
2023/06/14 21:16:15 Image pts: 30s
2023/06/14 21:16:15 Image pts: 30.12s
2023/06/14 21:16:15 Image pts: 30.08s
2023/06/14 21:16:15 session closed
2023/06/14 21:16:15 conn closed (EOF)

I'm sending RTSP stream with ffmpeg:

ffmpeg -re -i video.mp4 -c:v libx264 -an -f rtsp -rtsp_transport tcp rtsp://localhost:8554/live/stream

Is this behavior normal? I need to process frames in the correct order to apply a Computer Vision algorithm.

As a side note, is there a way to get the frame number? Or I should compute it from pts and fps?

Thanks!

@alllexx88
Copy link
Author

I think I understand what is happening here. The RTP packets are being sent in monotonically increasing DTS order, the order in which frames are decoded. And this differs from PTS order when there're B-frames present. When I disable B-frames in the ffmpeg command, the PTS are in the right order:

ffmpeg -re -i video.mp4 -an -c:v libx264 -bf 0 -f rtsp -rtsp_transport tcp rtsp://localhost:8554/live/stream

Probably when we have a real live stream, B-frames aren't used anyways, so this shouldn't be a problem.

The second question persists though: how do I get the frame number? Is there a proper way to do this via the API?

Thanks!

@alllexx88
Copy link
Author

Looks like we can store frame index # in userdata field in the session:

type MyUserData struct {
	Index int64
	Path  string
}
//.....................................................................................................................................................................................
func (sh *serverHandler) OnSetup(ctx *gortsplib.ServerHandlerOnSetupCtx) (*base.Response, *gortsplib.ServerStream, error) {
	log.Printf("setup request %s", ctx.Path)
	ctx.Session.SetUserData(MyUserData{Path: ctx.Path, Index: 0})

	return &base.Response{
		StatusCode: base.StatusOK,
	}, nil, nil
}
//.....................................................................................................................................................................................
func (sh *serverHandler) OnRecord(ctx *gortsplib.ServerHandlerOnRecordCtx) (*base.Response, error) {
	log.Printf("record request %s", ctx.Path)

	userData := ctx.Session.UserData().(MyUserData)

	// called when receiving an RTP packet
	ctx.Session.OnPacketRTP(sh.media, sh.format, func(pkt *rtp.Packet) {
		nalus, pts, err := sh.rtpDec.Decode(pkt)
		if err != nil {
			return
		}

		// decode H264 NALUs into image.Image
		for _, nalu := range nalus {
			// convert NALUs into RGBA frames
			img, err := sh.h264RawDec.decode(nalu)
			if err != nil {
				panic(err)
			}

			// wait for a frame
			if img == nil {
				continue
			}

			log.Printf("Image session_path: %s, index: %d, pts: %s", userData.Path, userData.Index, pts)

			userData.Index = userData.Index + 1

			// convert frame to JPEG and save to file
			//err = saveToFile(img)
			//if err != nil {
			//	panic(err)
			//}

			//saveCount++
			//if saveCount == 5 {
			//	log.Printf("saved 5 images, exiting")
			//	os.Exit(1)
			//}
		}
	})

	return &base.Response{
		StatusCode: base.StatusOK,
	}, nil
}

I just don't know if it's the best way 😅

@alllexx88 alllexx88 changed the title Non-monotonically increasing PTS Non-monotonically increasing PTS, frame index # Jun 15, 2023
@aler9
Copy link
Member

aler9 commented Jul 6, 2023

Hello, video streams have two timestamps: PTS (presentation time stamp) and DTS (decode time stamp).

PTS can be unordered when there are B-frames, while DTS is ordered.

There's an utility that allows to convert PTS into DTS that is h264.NewDTSExtractor(), its usage is shown here:

https://github.com/bluenviron/gortsplib/blob/main/examples/client-read-format-h264-save-to-disk/mpegtsmuxer.go

@aler9 aler9 closed this as not planned Won't fix, can't repro, duplicate, stale Jul 6, 2023
Copy link

github-actions bot commented Jan 9, 2024

This issue is being locked automatically because it has been closed for more than 6 months.
Please open a new issue in case you encounter a similar problem.

@github-actions github-actions bot locked and limited conversation to collaborators Jan 9, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants