我想将 MP4 视频转换为 HLS 多分辨率(360、720)并在输出段中添加水印图像。
我得到了两个结果,但是缺少具有多尺度的水印图像:
// one hls with water mark image
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"
// multi hls with watermark text
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"
答案1
-vf
我们可以使用以下方法来代替多个指令-filter_complex
:
ffmpeg -i input.mp4 -filter_complex "[0:v:0]drawtext=fontfile=font.ttf:text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white,scale=-1:360[v0];[0:v:0]drawtext=fontfile=font.ttf:text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white,scale=-1:720[v1]" -map "[v0]" -map "[v1]" -map 0:a:0 -map 0:a:0 -c:v:0 libx264 -crf 28 -preset faster -maxrate:v:0 600k -b:a:0 64k -c:v:1 libx264 -crf 28 -preset faster -maxrate:v:0 3000k -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_flags independent_segments -master_pl_name "output.m3u8" "output-%v.m3u8"
[0:v:0]drawtext=fontfile=font.ttf:text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white,scale=-1:360[v0]
- 将 drawtext 和 scale 过滤器应用于第一个视频输入流,并将结果存储在临时名称中[v0]
。[0:v:0]drawtext=fontfile=font.ttf:text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white,scale=-1:720[v1]
- 将 drawtext 和 scale 过滤器应用于第一个视频输入流,并将结果存储在临时名称中[v1]
。-map "[v0]" -map "[v1]"
- 映射[v0]
到第一个输出视频流和[v1]
第二个输出视频流。
执行原始命令时,我收到一条警告消息:
为流 0 指定了多个 -filter、-af 或 -vf 选项,只有最后一个选项“-filter:v drawtext=fontfile=font.ttf:text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white, scale=-1:720”将被使用。
警告信息表明第一个-vf
被忽略。
注意:由于 Windows/Linux 兼容性,我将整个命令放在一行中。
答案2
如何更改代码中的目录文件 m3u8 和 .ts ?
ffmpeg -i input.mp4 -filter_complex "[0:v:0]drawtext=fontfile=font.ttf:text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white,scale=-1:360[v0];[0:v:0]drawtext=fontfile=font.ttf:text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white,scale=-1:720[v1]" -map "[v0]" -map "[v1]" -map 0:a:0 -map 0:a:0 -c:v:0 libx264 -crf 28 -preset faster -maxrate:v:0 600k -b:a:0 64k -c:v:1 libx264 -crf 28 -preset faster -maxrate:v:0 3000k -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_flags independent_segments -master_pl_name "output.m3u8" "output-%v.m3u8"