从 minio 对象流媒体文件

问题描述 投票:0回答:2

我有一个后端 go Fiber 服务器,它将使用 minio 客户端 sdk 提供从云服务获取的文件。我的目标是实现视频文件流,而不暴露与云 URL 的直接连接,并且视频必须是可向前和向后搜索的(与云 URL 的功能相同)。但是,当我添加从服务器发送的流时,无法搜索视频或者有时只能向后搜索。我尝试设置响应的内容长度、内容类型、内容范围等...但它不起作用。注意:所有行为都发生在 chrome 最新稳定版本中,而不是 firefox 或 postman 中。这是我的代码:

// c is the *fiber.Ctx

object, err := minioClient.GetObject(context.Background(), bucketName, fileName, minio.GetObjectOptions{})
if err != nil {
    return err
}

objInfo, err := object.Stat()
if err != nil {
    return err
}

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

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

c.Response().SetBodyStream(bytes.NewReader(buffer), int(objInfo.Size))
return nil

//c.SendStream just won't work

go video-streaming minio go-fiber
2个回答
1
投票

我已经找到解决办法了。结果我只需要添加 Accept-Ranges 标头哈哈。


0
投票

在您的示例中,您不需要读取 Minio 的 GetObject 生成的对象并将其放入缓冲区中,只是为了创建另一个 Reader ...您可以使用它已经是 Stream 的对象...

这是使用

sendStream
的另一个建议:

func (api *MyRoute) GetObject(c *fiber.Ctx) error {
    bucketName := c.Params("bucket", "")
    objectName := c.Params("name", "")
    
    //YOU SHOULD INTIALIZE YOUR MINIO CLIENT HERE 

    o, err := minioClient.GetObject(bucketName, objectName, minio.GetObjectOptions{})
    if err != nil {
        return err
    }

    stats, err := o.Stat()
    if err != nil {
        return err
    }

    return c.SendStream(o, int(stats.Size))
}

© www.soinside.com 2019 - 2024. All rights reserved.