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"
关键说明
- 同时引入视频源和水印图片两个输入文件,确保水印能被每个视频流调用
- 每个分辨率的视频流都在
-vf滤镜链里先执行overlay添加图片水印,再执行scale缩放到目标分辨率,最后用format=yuv420p保证视频在不同设备上的兼容性 - 修正了原命令里的小错误:比如
maxrate的索引要对应当前流(原命令里720p流写的maxrate:v:0应该改成maxrate:v:1),还有var_stream_map里的命名笔误(把460p改成720p) - 音频码率可以根据分辨率适配,720p可以用更高的音频码率提升体验
这样执行命令后,就能生成同时包含360p、720p分辨率且都带有图片水印的HLS多码率流了。
备注:内容来源于stack exchange,提问作者Mohamed Taher
相关产品推荐
相关产品推荐

