簡體   English   中英

無需下載即可在S3上創建縮略圖

[英]Creating Thumbnail from video on S3 without downloading

S3中存儲了一些視頻文件(大多數是.mp4)。 它們可能相當大。 我需要獲取視頻文件的縮略圖 - 比如0.5秒的幀(跳過可能的黑屏等)。

我可以創建縮略圖,如果我下載整個文件,但它太長,我試圖避免這個並下載一些最小的片段。

我知道如何從AWS S3下載前N個字節 - 具有指定范圍的請求但問題是視頻文件片段已損壞且無法識別為正確的視頻。

我試圖模擬使用代碼檢索的頭字節

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Test {
    public static void main(String[] args) throws Exception {
        try(FileInputStream fis = new FileInputStream("D://temp//1.mp4");
            FileOutputStream fos = new FileOutputStream("D://temp//1_cut.mp4");
        ) {
            byte[] buf=new byte[1000000];
            fis.read(buf);
            fos.write(buf);
            fos.flush();
            System.out.println("Done");
        }
    }

}

要使用靜態文件,但結果1_cut.mp4無效。 玩家既不能識別也不能識別avconv庫。

有沒有辦法下載視頻文件的片段並從片段中創建圖像?

不確定您是否需要完整的Java實現,但是如果您的文件可以通過S3中的直接或簽名URL訪問,並且您可以使用ffmpeg不是以下應該可以解決問題。

ffmpeg -i $amazon_s3_signed_url -ss 00:00:00.500 -vframes 1 thumbnail.png

您可以使用Amazon Java SDK創建預簽名URL,然后執行上述命令以創建縮略圖。

GeneratePresignedUrlRequest generatePresignedUrlRequest = 
                new GeneratePresignedUrlRequest(bucketName, objectKey);
generatePresignedUrlRequest.setMethod(HttpMethod.GET); 
generatePresignedUrlRequest.setExpiration(expiration);

URL url = s3client.generatePresignedUrl(generatePresignedUrlRequest); 
String urlString = url.toString();

Runtime run  = Runtime.getRuntime();
Process proc = run.exec("ffmpeg -i " + urlString +" -ss 00:00:00.500 -vframes 1 thumbnail.png");

您當前的方法只是下載隨機數量的順序字節將要求您修復您下載的部分文件...大量的工作。

上述問題的另一種解決方案可能是:

在此輸入圖像描述

您需要將解碼器中的所有磁盤I / O讀取請求轉發到S3存儲桶。 如果你的解碼器(avconv)支持從輸入流讀取,這里有一個很好的例子如何覆蓋read方法:

如何實現InputStream的read()方法?

另一種方法是使用現有的驅動程序,只允許您訪問S3存儲桶,因為它是本地驅動器:

Windows: https//tntdrive.com/

Linux: https//tecadmin.net/mount-s3-bucket-centosrhel-ubuntu-using-s3fs/#

暫無
暫無

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

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