簡體   English   中英

有沒有辦法提供視頻部分,提供開始結束秒數?

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

我正在嘗試使用后端來提供存儲中的視頻。 我使用 Go + GIN 它可以工作,但我需要使用開始和結束參數來實現視頻請求。 例如,我有一個時長為 10 分鍾的視頻,我想請求一個 2 到 3 分鍾的片段。 有可能嗎?或者在某處有例子嗎?

這就是我現在所擁有的:

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)

這將要求您的程序至少解復用媒體 stream 以從中獲取時間信息,以防您使用的是支持它的容器,或者實際解碼視頻 stream 以防它不支持 - 通常,您不知道您需要多少字節才能將視頻文件搜索到 go 到特定位置¹。

由於 output 再次需要成為一個有效的媒體容器,以便任何請求它的人都可以處理它,因此將重新混合到 output 容器中。

所以,選擇一個可以做到這一點的庫並閱讀它的文檔。 Ffmpeg / avlib 是那里的經典選擇,但我完全不知道其他人是否已經為它編寫了 go 綁定。 如果沒有,這樣做是值得的。


¹ 在某些情況下,您可以這樣做,這可能適用於具有固定多路復用比特率的 MPEG 傳輸流。 但是除非您正在為需要恆定速率數據 stream 的實際電視塔或實際電視衛星處理視頻流,否則您不太可能處理這些

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM