STK90
STK90

Reputation: 321

Is there a way to serve the video part, providing start end seconds?

I am trying to use the backend to serve the video from the storage. I use Go + GIN It works but I need to implement video requests with start and end parameters. For example, I have a video with 10 mins duration and I want to request a fragment from 2 to 3 mins. Is it possible or are there examples somewhere?

This is what I have now:

accessKeyID := ""
secretAccessKey := ""
useSSL := false

ctx := context.Background()
endpoint := "127.0.0.1:9000"
bucketName := "mybucket"

// Initialize minio client object.
minioClient, err := minio.New(endpoint, &minio.Options{
    Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
    Secure: useSSL,
})
if err != nil {
    log.Fatalln(err)
}

// Get file
object, err := minioClient.GetObject(ctx, bucketName, "1.mp4", minio.GetObjectOptions{})
if err != nil {
    fmt.Println(err)
    return
}
objInfo, err := object.Stat()
if err != nil {
    return
}

buffer := make([]byte, objInfo.Size)
object.Read(buffer)

c.Writer.Header().Set("Content-Length", fmt.Sprintf("%d", objInfo.Size))
c.Writer.Header().Set("Content-Type", "video/mp4")
c.Writer.Header().Set("Connection", "keep-alive")
c.Writer.Header().Set("Content-Range", fmt.Sprintf("bytes 0-%d/%d", objInfo.Size, objInfo.Size))

//c.Writer.Write(buffer)
c.DataFromReader(200, objInfo.Size, "video/mp4", bytes.NewReader(buffer), nil)

Upvotes: 1

Views: 300

Answers (1)

Marcus Müller
Marcus Müller

Reputation: 36442

This will require your program to at least demux the media stream to get time information out of it, in case you're using a container that supports that, or to actually decode the video stream in case it doesn't - in general, you can't know how many bytes you need to seek into a video file to go to a specific location¹.

As the output again needs to be a valid media container so that whoever requested it can deal with it, there's going to be remixing into an output container.

So, pick yourself a library that can do that and read its documentation. Ffmpeg / avlib is the classical choice there, but I have positively no idea about whether someone else has already written go bindings for it. If not, doing that works be worthwhile.


¹ there is cases where you can, that would probably apply to MPEG Transport Streams with a fixed mux bitrate. But unless you're working in streaming of video for actual TV towers or actual TV satellites that need a constant rate data stream, you will not likely be dealing with these

Upvotes: 2

Related Questions