【问题标题】:Creating Thumbnail from video on S3 without downloading从 S3 上的视频创建缩略图,无需下载
【发布时间】:2017-11-16 12:45:08
【问题描述】:

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

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

【问题讨论】:

  • 如果文件没有准备好渐进式流媒体,您将无法下载其中的一部分并开始解码过程。您可以在 VLC 甚至 chrome 浏览器中使用更大的可公开访问文件进行测试;当您打开并播放 http 链接时,它是缓冲整个文件还是在完全下载之前开始播放?
  • @Mike 下载部分没问题。让我们完全排除 aws 部分。假设我们有一个视频文件并剪切了文件的一部分。是否可以从文件中创建缩略图(或屏幕截图)?
  • 您能否详细介绍一下您正在实施的解码器?
  • 我完全不相信这会奏效,但可能值得研究修复下载的片段。本站 (stellarinfo.com/blog/repair-corrupt-video-file-vlc-media-player) 声称 VLC 在某些情况下可以修复部分视频文件。
  • @Harry 我没有实现任何解码器。我需要视频文件中的缩略图(快照)。假设第 10 帧视频非常大。我不想下载文件以获得第 10 帧。

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


【解决方案1】:

不确定您是否需要完整的 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");

【讨论】:

  • 用公共 URL 试过这个(我使用 avconv lib,但选项是相同的)。当我使用 http://some.path.here 时工作正常,但当我尝试 HTTPS 时失败,相同的 url https://some.path.here 失败
  • 似乎它只是ffmpeg的一个分支,所以你可以尝试-protocols参数,它应该列出支持的协议,如果https不在列表中,你需要重新编译avconv启用openssl。例如,这列出了 ffmpeg ffmpeg -protocols 支持的协议
【解决方案2】:

您当前仅下载随机数量的连续字节的方法需要您修复您下载的部分文件...大量工作。

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

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

How InputStream's read() method is implemented?

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

Windows:https://tntdrive.com/

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

【讨论】:

  • 第二种方法是一种选择。我的意思是使用 S3 作为磁盘。至于第一个。实际上我没有任何解码器。我将 avconv 库称为类似于@Babl 的答案中所述的库
猜你喜欢
  • 2015-12-20
  • 2018-05-15
  • 1970-01-01
  • 2012-05-19
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
相关资源
最近更新 更多