You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg实现带图片水印的多分辨率HLS流生成问题求助

FFmpeg实现带图片水印的多分辨率HLS流生成问题求助

大家好,我最近在做一个需求:把MP4视频转换成包含360p、720p两种分辨率的HLS多码率流,同时要给所有输出的视频分段加上图片水印。但我试了两种方法都没达到预期效果,想请教一下怎么把这两个需求结合起来。

我的尝试过程如下:

尝试1:生成带图片水印的单分辨率HLS流

这个命令能成功给视频加上图片水印,但只能输出单一分辨率的HLS,没法生成多码率版本:

ffmpeg \
-i input.mp4 \
-i watermark.png \
-filter_complex "[0:v][1:v] overlay=10:10:format=auto,format=yuv420p" \
-c:a copy -b:a 128k -c:v libx264 -crf 23 \
-f hls \
-hls_time 3 \
-hls_flags independent_segments \
-master_pl_name "output.m3u8" "output-%v.m3u8"

尝试2:生成多分辨率HLS流,但用的是文字水印

这个命令能生成360p、720p的多码率HLS流(还加了加密),但只能添加文字水印,我想改成图片水印却不知道怎么整合:

ffmpeg \
-i ../input.mp4 \
-map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 \
-c:v:0 libx264 -crf 28 -preset faster -maxrate:v:0 600k -vf "drawtext=fontfile=font.ttf:text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white, scale=-1:360"  -b:a:0 64k \
-c:v:1 libx264 -crf 28 -preset faster -maxrate:v:0 3000k -vf "drawtext=fontfile=font.ttf:text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white, scale=-1:720" -b:a:0 64k \
-var_stream_map "v:0,a:0,name:360p v:1,a:1,name:460p" \
-f hls \
-hls_list_size 0 \
-threads 0 \
-hls_playlist_type event \
-hls_time 3 \
-hls_key_info_file ../keys/enc.keyinfo \
-hls_flags independent_segments \
-master_pl_name "output.m3u8" "output-%v.m3u8"

请问有没有办法把图片水印的逻辑整合到多分辨率HLS的生成命令里,让每个分辨率的流都带上图片水印?


解决方案

你只需要把图片水印的overlay滤镜和分辨率缩放的scale滤镜结合到每个视频流的处理链里即可,下面是调整后的完整命令:

ffmpeg \
-i input.mp4 \
-i watermark.png \
# 映射2组视频+音频流,对应两个分辨率
-map 0:v:0 -map 0:a:0 -map 0:v:0 -map 0:a:0 \
# 处理360p分辨率流:先加水印,再缩放,最后编码
-c:v:0 libx264 -crf 28 -preset faster -maxrate:v:0 600k \
-vf "[0:v][1:v] overlay=10:10:format=auto, scale=-1:360, format=yuv420p" \
-b:a:0 64k \
# 处理720p分辨率流:同样先加水印再缩放
-c:v:1 libx264 -crf 28 -preset faster -maxrate:v:1 3000k \
-vf "[0:v][1:v] overlay=10:10:format=auto, scale=-1:720, format=yuv420p" \
-b:a:1 128k \
# 配置多码率流映射,注意对应正确的流索引和命名
-var_stream_map "v:0,a:0,name:360p v:1,a:1,name:720p" \
# HLS输出参数
-f hls \
-hls_time 3 \
-hls_flags independent_segments \
-hls_list_size 0 \
-hls_playlist_type event \
# 保留加密参数(如果不需要可以删除这一行)
-hls_key_info_file ../keys/enc.keyinfo \
-master_pl_name "output.m3u8" \
"output-%v.m3u8"

关键说明

  1. 同时引入视频源和水印图片两个输入文件,确保水印能被每个视频流调用
  2. 每个分辨率的视频流都在-vf滤镜链里先执行overlay添加图片水印,再执行scale缩放到目标分辨率,最后用format=yuv420p保证视频在不同设备上的兼容性
  3. 修正了原命令里的小错误:比如maxrate的索引要对应当前流(原命令里720p流写的maxrate:v:0应该改成maxrate:v:1),还有var_stream_map里的命名笔误(把460p改成720p)
  4. 音频码率可以根据分辨率适配,720p可以用更高的音频码率提升体验

这样执行命令后,就能生成同时包含360p、720p分辨率且都带有图片水印的HLS多码率流了。

备注:内容来源于stack exchange,提问作者Mohamed Taher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:04:53