首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何绘制颜色渐变填充ffmpeg (ffmpeg-python)的文本?然后和音乐混在一起?

如何绘制颜色渐变填充ffmpeg (ffmpeg-python)的文本?然后和音乐混在一起?
EN

Stack Overflow用户
提问于 2022-02-09 14:46:26
回答 1查看 434关注 0票数 2

我想要达到这样的结果(在视频的顶部放置带有梯度或任何图片填充的文本):

所以我决定画一张渐变图:

然后用色度键技术将其转换为这个(具有透明背景):

然后把它放在录像上。

下面是使用ffmpeg-python的代码

代码语言:javascript
运行
复制
font_path = 'fonts/my_font.ttf'
input_video = ffmpeg.input('vid01.mp4')
split = input_video.filter_multi_output('split')
split_main = split[0]
split_txt_bg = split[1]

text_bg_black = ffmpeg.filter(text_bg, 'eq', brightness=-1000, saturation=0) # generate black bg from video input
text_mask = ffmpeg.filter(text_bg_black, 'drawtext', text='some text', fontcolor='0xFFFFFF', fontsize=85, x='(w-text_w)/2', y='68-(text_h/2)', fontfile=font_path) #draw text
text_mask_transparent = ffmpeg.filter(text_mask, 'colorkey', color='0xFFFFFF', similarity=0.45, blend=0.1)
text_on_bg = ffmpeg.filter([fill_gradient_gold, text_mask_transparent], 'overlay', x='(W-w)/2', y='(H-h)/2')
text = ffmpeg.filter(text_on_bg, 'colorkey', color='0x000000', similarity=0.45, blend=0.01)

comp1 = ffmpeg.filter([split_main, text], 'overlay', x='(W-w)/2', y='(H-h)/2')

comp.output('vid01_comp1.mp4').overwrite_output().run()

此解决方案有效,但有以下问题:

最后,

  1. 降低了原始渐变图像的亮度,我根本不想要它,它看起来并不优雅(因为色度键控解决方案)

是否有可能用drawtext制作一个阿尔法掩码,然后用它来减少梯度?

如果你用ffmpeg-python给出答案会更好,因为我是个新手,我很难把命令行ffmpeg转换成ffmpeg-python,谢谢!

我也无法得到如何混合产生的视频comp1与音乐文件,帮助请。

EN

Stack Overflow用户

回答已采纳

发布于 2022-02-12 13:46:03

我们可以在黑色背景上绘制文本,并使用alphamerge创建带有彩色渐变文本的透明背景。

然后,我们可以覆盖在输入视频的梯度(与透明背景)。

我不知道我建议的解决方案是否是最优雅的,但它并没有降低梯度图片的亮度。

建议的解决办法适用于以下阶段:

  • 定义合成黑视频源(1帧),
  • 在黑视频帧上绘制白色文本,
  • 添加“黑色背景上的白色文本”作为渐变图像的α通道。

只有白色的文本是不透明的,而黑色的背景是完全transparent.

  • Overlay以上的视频。

首先创建用于测试的合成黄色视频文件(带有正弦音频):

代码语言:javascript
运行
复制
# Build first synthetic video, for testing:
(
    ffmpeg
    .output(ffmpeg.input('sine=frequency=500', f='lavfi'),
            ffmpeg.input('color=yellow:size=1920x1080:rate=1', f='lavfi'),
            'in.mp4', vcodec='libx264', crf=17, pix_fmt='yuv444p', acodec='aac', ar=22050, t=10)
    .overwrite_output()
    .run()
)

解决方案代码示例:

代码语言:javascript
运行
复制
import ffmpeg

# Example using FFmpeg CLI:
# ffmpeg -y -i text_bg.png -f lavfi -i color=0x505050:size=1920x1080:rate=1:duration=1 -filter_complex "color=black[blk];[blk][0:v]scale2ref[b][v0];[b]drawtext=text='some text':fontcolor='0xFFFFFF':fontsize=300:x='(w-text_w)/2':y='(h-text_h)/2',format=gray[a];[v0][a]alphamerge[txt];[1:v][txt]overlay=format=yuv444" -frames:v 1 overlayed_text.png

input = ffmpeg.input('in.mp4')
input_video = input.video
input_audio = input.audio

bg = ffmpeg.input('text_bg.png').video  # Gradient image

blk = ffmpeg.input('color=black:size=1920x1080:rate=1:duration=1', f='lavfi').video  # Black background

# White text on black background - used as alpha channel
txt = blk.filter('drawtext', text='some text', fontcolor='0xFFFFFF', fontsize=400, x='(w-text_w)/2', y='(h-text_h)/2').filter('format', pix_fmts='gray')

# Add txt as alpha channel to bg - only the white text is opaque, the black background is transparent.
txt_on_bg = ffmpeg.filter([bg, txt], 'alphamerge')

# Overlay txt_on_bg on input_video
comp1 = ffmpeg.filter([input_video, txt_on_bg], 'overlay', x='(W-w)/2', y='(H-h)/2', format='yuv444')

ffmpeg.output(comp1, input_audio, 'vid01_comp1.mp4', vcodec='libx264', crf=17, pix_fmt='yuv444p', acodec='copy').overwrite_output().run()

样本输出:

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71051645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档