DEV Community 中文 关注 使用 Go 和 FFmpeg 构建视频缩略图生成服务 公司的视频分类网格正从第三方 CDN 热链接大型且未优化的 JPEG 缩略图,导致移动端的最大内容绘制(LCP)时间缓慢。这是由于服务器提供全分辨率图像并通过 CSS 进行缩放,从而浪费了大量带宽。为解决此问题,他们开发了一个 Go 服务以掌控缩略图生成流程。该服务使用 FFmpeg 从源视频中提取视觉上显著的帧或海报帧,随后将这些帧编码为多种宽度的 WebP 格式,其效率优于 JPEG。该 Go 服务还负责下载流量控制,确保 FFmpeg 进程得到高效管理。PHP 因共享主机环境在执行时间和进程管理方面的限制,被认为不适合此任务。该 Go 服务利用 FFmpeg 标志,如在 -i 之前使用 -ss 以加快跳转,并使用 thumbnail=300 以优化帧选择。此外,该服务采用有界工作池和 singleflight 机制,以防止重复处理并管理并发。生成的缩略图先写入临时文件,再通过原子重命名操作完成,避免提供不完整的文件。该 Go 服务由定时任务触发,以将缩略图生成任务加入队列。前端 PHP 应用则查询一个简单的 SQLite 数据库以检查这些缩略图的状态。数据库架构基础,存储视频 ID、源 URL、状态和重试次数。PHP 定时任务通过向 Go 服务发起 HTTP 请求来消耗该队列。Go 服务的写入超时时间被有意设置得长于任务的执行预算,以避免响应被截断。 Building a Video Thumbnail Generator Service with Go and FFmpeg Workers dev.to DEV Community 中文 RSS thenote.app
-i之前使用-ss以加快跳转,并使用thumbnail=300以优化帧选择。此外,该服务采用有界工作池和 singleflight 机制,以防止重复处理并管理并发。生成的缩略图先写入临时文件,再通过原子重命名操作完成,避免提供不完整的文件。该 Go 服务由定时任务触发,以将缩略图生成任务加入队列。前端 PHP 应用则查询一个简单的 SQLite 数据库以检查这些缩略图的状态。数据库架构基础,存储视频 ID、源 URL、状态和重试次数。PHP 定时任务通过向 Go 服务发起 HTTP 请求来消耗该队列。Go 服务的写入超时时间被有意设置得长于任务的执行预算,以避免响应被截断。