如何从Google云存储中获取视频并从其中一帧生成jpeg图像?
该帧可用作视频的缩略图。或者通过定期获取帧,这些帧可用于在拖动视频时制作预览帧。
我喜欢用Java服务器端(在Google应用引擎上)来做这个。这是我可以用来在Google云存储中获取视频的Blob的代码。我做了那件事之后还有什么选择?
Storage storage = StorageOptions.getDefaultInstance().getService();
BlobId blobId = BlobId.of(BUCKET, OBJECT_NAME);
Blob blob = storage.get(blobId);
字符串
我正在寻找一个快速和轻量级的解决方案,因为这将在谷歌应用引擎的服务器端运行。
2条答案
按热度按时间oug3syen1#
虽然@VonC的回答非常好,但我还是建议您使用Transcoder API提供的功能,而不是自定义解决方案。
具体来说,代码转换器API为您提供了generating a spritesheet of video frames的功能。
如文档中所示,您有两个生成缩略图的选项:
您有两个选项可用于生成信息表:
API为不同的编程语言提供SDK,其中包括Java(2)。这个相关的例子也可能有所帮助。供参考:
字符串
转码器作业的输入从云存储获得。
因此,为了使用此代码启动转码过程,可能需要定义一个视频的[Cloud Function that responsibility to the creation] - object finalize event -(https://cloud.google.com/functions/docs/calling/storage)。
您可以在GCP documentation中找到处理此类事件的函数示例。
型
函数中的最终代码可能与此类似(请原谅任何不准确,我只是尝试将两个示例组合起来):
型
应正确配置事件触发器和函数。
请注意,转码作业是异步的,您可能需要一些额外的工作来读取结果。
虽然可能更复杂,但基于这个想法,this blog post和companion one可能会有所帮助。
vwoqyblh2#
从存储在Google Cloud Storage中的视频创建缩略图或JPEG图像需要几个步骤,可能需要的不仅仅是Java来完成。通常,您会使用像FFmpeg这样的媒体处理软件从视频中生成帧。
然而,直接在App Engine中使用FFmpeg或类似工具可能会很棘手,因为在App Engine环境中安装和执行第三方二进制文件受到限制。因此,典型的解决方案涉及使用Google Cloud Functions或Google Cloud Run来执行FFmpeg命令,并使用App Engine来触发这些函数。
这意味着:
FFmpeg
的工具从视频中生成图像。它会将图像保存回谷歌云存储桶。下面是一个Google Cloud函数的Python示例,它可以做到这一点(它不是Java,但它可以让你知道函数需要做什么)。
(来源于
brown-mida/elvo/etl/processed_dag.py#to_public_png()
)该函数在上传新视频时触发,它使用FFmpeg从视频中抓取图像,然后将图像存储在桶中:
字符串
通过该设置,生成缩略图的工作将从Java App Engine服务卸载到Cloud Function。这将提供一个可扩展的解决方案来创建视频缩略图,而无需使用来自App Engine服务的资源。
您可以使用各种运行时环境创建云函数,如Python,Node.js,Java,Go,.NET等。这里使用Python是因为FFmpeg交互更简单。
警告:由于使用Cloud Functions/Cloud Run以及生成的映像的额外存储需求,此类操作可能会导致额外成本。
最后,如果您需要坚持使用Java并只使用AppEngine,请考虑使用App Engine flexible environment,这将允许您使用FFmpeg或其他工具。
在Java中创建Cloud Function或Cloud Run示例来执行此任务比使用Python等脚本语言复杂,因为Java不支持运行
FFmpeg
等shell命令。但是,如果您使用自定义Dockerfile并从Java运行shell命令,则使用FFmpeg创建Cloud Function或Cloud Run示例是可以的。这通常是在Cloud Run示例中完成的,而不是在Cloud Function中完成的,因为Cloud Run允许您使用自定义的Dockerfile在运行时中包含FFmpeg。
例如,这里有一个简单的Java应用程序,它使用FFmpeg从视频中提取帧。它可以用作Cloud Run示例的基础。
型
(Note Java进程将需要具有执行FFmpeg命令和访问文件所必需的权限。)
在实际应用程序中,这应该 Package 在Web服务器中(如Sping Boot )来处理HTTP请求和响应。视频将从Google Cloud Storage下载到一个临时文件中,运行FFmpeg命令生成帧,然后将图像文件上传回Google Cloud Storage。您还需要包括错误处理和日志记录,以确保流程顺利进行,并且可以诊断任何问题。
正如所评论的,您确实有JCodec,一个视频编码器和解码器的纯Java实现,包括从视频生成帧的功能。你可以在Google App Engine Standard Environment上使用它。
这就是如何使用JCodec从视频中提取帧:
型
您可以使用
getFrame
方法,该方法打开视频文件,在指定位置提取帧(帧编号是双精度表示视频的秒数),将帧转换为RGB图像,并将帧保存为文件。您需要调整此代码以处理
Blob
对象,可能首先将blob下载到App Engine环境中的临时文件中,然后使用JCodec提取帧,最后将生成的图像文件上传回Google Cloud Storage。请注意,Google App Engine对文件系统访问有限制,但您可以使用临时目录(/tmp
)写入文件。由于解码视频帧是一项CPU密集型任务,并且可能需要一些时间,具体取决于视频的大小和长度,因此您需要小心使用App Engine示例的资源和执行时间限制。