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
库。
有没有办法只下载视频文件片段并从片段中创建图像?
答案 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)
您当前的方法只是为了下载随机数量的顺序字节,这将要求您修复您下载的部分文件......大量的工作。
上述问题的另一种解决方案可能是:
您需要将解码器中的所有磁盘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/#