繁体   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