容器化应用如何执行本地脚本?自建Nginx VOD点播服务问题咨询
实现第三步(自动触发ffmpeg转DASH分片)的方案
触发逻辑配置
- 首先在你的Golang应用容器镜像中预装ffmpeg:如果用Debian/Ubuntu作为基础镜像,Dockerfile中添加
RUN apt update && apt install -y ffmpeg即可;如果用Alpine作为基础镜像,添加RUN apk add --no-cache ffmpeg - 上传接口完成MP4文件本地存储后,不要用同步逻辑执行转码(会阻塞接口响应),通过goroutine异步触发转码任务即可;如果并发上传量较大,建议加内存队列/Redis队列限制同时运行的转码任务数,避免CPU被占满影响服务可用性
- 可以在数据库中为每个视频新增状态字段,标记视频当前为「待转码/转码中/转码成功/转码失败」,方便前端给用户展示对应状态
可直接使用的ffmpeg DASH转码命令
你可以直接在Golang中通过os/exec包调用以下命令完成转码:
ffmpeg -i 你存储的上传MP4文件路径 -c:v libx264 -crf 28 -preset medium -c:a aac -b:a 128k -adaptation_sets "id=0,streams=v id=1,streams=a" -f dash 静态资源目录/对应视频ID/manifest.mpd
输出的manifest.mpd索引文件和所有分片要存在nginx可以直接访问的静态资源目录下,前端播放器请求这个mpd文件即可实现DASH点播。
异常处理补充
- 转码过程中可以捕获ffmpeg的运行日志存储到本地,转码失败时方便排查问题
- 可以加转码失败重试逻辑,避免偶发的系统资源不足导致转码失败
更优的自托管VOD服务搭建方案
- 如果你不需要高度自定义站点逻辑,可以直接用Owncast,这是开箱即用的自托管直播+VOD一体化服务,自带前端页面、上传入口、自动转码、播放器全套能力,支持DASH/HLS输出,容器化部署只需要一行命令,不需要自己开发上传、转码相关逻辑,适合快速搭建可用的视频站点
- 如果你需要保留自定义开发的需求,可以把转码模块拆成独立的转码服务,用开源的转码框架替代自己手写的
exec调用逻辑,支持多码率转码、水印插入、字幕挂载、失败重试、任务调度等能力,稳定性比自己写的调用逻辑高很多 - 如果后续访问量上升,可以把转码输出的DASH分片同步到对象存储,nginx只负责接口转发,静态资源流量全部由对象存储承担,成本比用nginx扛静态流量低很多
内容的提问来源于stack exchange,提问作者Nguyen Duc
相关产品推荐
相关产品推荐

