无需下载即可从 S3 上的视频创建缩略图

Sta*_*avL 4 java video video-capture amazon-s3 amazon-web-services

有一些视频文件(主要是 .mp4)存储在 S3 中。它们可能相当大。我需要获取视频文件的缩略图 - 假设 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");
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

使用静态文件但结果1_cut.mp4无效。任何玩家都无法识别它,也无法识别avconv库。

有没有办法只下载视频文件的片段并从片段创建图像?

Bab*_*abl 9

不确定您是否需要完整的 java 实现,但如果您的文件可以在 S3 上通过直接或签名的 URL 访问,并且您可以使用,而ffmpeg不是以下应该可以解决问题。

ffmpeg -i $amazon_s3_signed_url -ss 00:00:00.500 -vframes 1 thumbnail.png
Run Code Online (Sandbox Code Playgroud)

您可以使用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");
Run Code Online (Sandbox Code Playgroud)