无需下载即可在S3上创建缩略图

时间:2017-11-16 12:45:09

标签: java amazon-web-services video amazon-s3 video-capture

S3中存储了一些视频文件(大多数是.mp4)。它们可能相当大。我需要为视频文件获取缩略图 - 让我们说0.5秒的帧(跳过可能的黑屏等)。

如果我下载整个文件,我可以创建缩略图,但它太长了,我试图避免这种情况并下载一些最小的片段。

我知道how to download first N bytes from AWS S3 - 请求指定范围,但问题是视频文件已损坏且无法识别为正确的视频。

我尝试使用代码

模拟检索头字节
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库。

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

2 个答案:

答案 0 :(得分:3)

不确定您是否需要完整的Java实现,但是如果您的文件可以通过S3的直接或签名URL访问,并且您可以使用ffmpeg而不是以下应该可以做到这一点。

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

您可以使用Amazon Java SDK创建预签名网址,然后执行上述命令以创建缩略图。

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");

答案 1 :(得分:3)

您当前的方法只是为了下载随机数量的顺序字节,这将要求您修复您下载的部分文件......大量的工作。

上述问题的另一种解决方案可能是:

enter image description here

您需要将解码器中的所有磁盘I / O读取请求转发到S3存储桶。如果你的解码器(avconv)支持从输入流读取,这里有一个很好的例子如何覆盖read方法:

How InputStream's read() method is implemented?

另一种方法是使用现有的驱动程序,只允许您访问S3存储桶,因为它是本地驱动器:

Windows:https://tntdrive.com/

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