iOS FFmpeg开发-添加文字水印功能

一、背景

在iOS平台下,使用FFmpeg tools(命令行)开发添加文字水印功能需要添加libfreetype、libfontconfig、libfribidi库. 

为什么需要这3个库?因为在ffmpeg官方说明文档中:

11.60 drawtext

Draw a text string or text from a specified file on top of a video, using the libfreetype library.To enable compilation of this filter, you need to configure FFmpeg with --enable-libfreetype. To enable default font fallback and the font option you need to configure FFmpeg with --enable-libfontconfig. To enable the text_shaping option, you need to configure FFmpeg with --enable-libfribidi.

翻译过来意思是:

使用libfreetype库在视频指定文件中绘制文本字符串或文本。要启用此过滤器的编译,您需要使用--enable-libfreetype配置FFmpeg。要启用默认字体后备和字体选项,您需要使用--enable-libfontconfig配置FFmpeg。要启用text_shaping选项,您需要使用--enable-libfribidi配置FFmpeg。

所以,这里我们需要自行编译libfreetype、libfontconfig、libfribidi库。

二、编译第三方库

在ffmpeg中,加入第三方库需要下载源码并将它编译。使用brew install libfreetype安装是没用的,因为这样安装出来的freetype只有x86架构,并没有其它架构。必须要像网上x264教程一样,需要下载它的源码,使用xcode编译出它的静态库出来,再在FFmpeg编译中添加参数--enable-libfreetype、--enable-libfontfig、--enable-libfribidi.这样FFmpeg才会将这三个库加进去一起编译。

我使用的脚本是mobile-ffmpeg,在这个脚本中包含了编译脚本与源码:

1.源码

freetype库源码位于mobile-ffmpeg/src/freetype

fontconfig库源码位于mobile-ffmpeg/src/fontconfig

fribidi库源码位于mobile-ffmpeg/src/fribidi

所有ffmpeg使用到的第三方库都放到了mobile-ffmpeg/src目录下,如有新版本或想更换源码可以替换该路径。

2.编译脚本

freetype编译脚本位于mobile-ffmpeg/build/ios-freetype.h 

fontconfig编译脚本位于mobile-ffmpeg/build/ios-fontconfig.h

fribidi编译脚本位于mobile-ffmpeg/build/ios-fontconfig.h

所有ffmpeg使用到的第三方库的编译脚本都在mobile-ffmpeg/build中。

3.编译环境准备

编译环境需要Xcode 8和Command Line Tools for Xcode8。(可见上一篇 iOS集成FFmpeg开发)

4.编译命令

cd mobile-ffmpeg

./ios.sh --disable-arm64e --disable-armv7s --enable-fontconfig --enable-freetype --enable-fribidi

编译完成后会在当前目录生成一个prebuilt目录,里面包含arm64、armv7、i386、x86_64架构下已经编译的第三方库与ffmpeg库。静态库合并之后放在ios-universal中

第三方库我们取expat、fontconfig、freetype、fribidi、libpng、libuuid中的静态库,需要将他们加入到工程的链接库中。

三、测试

1.新建Xcode工程

按照 iOS集成FFmpeg开发 的方法,直接替换ffmpeg库和新增第三方库,我们编写以下命令作为测试代码:

ffmpeg -i test.mp4 -vf drawtext=fontfile=Songti.ttc:text='测试水印':x=10:y=10:fontsize=24:fontcolor=white test_output.mp4

运行后打开test_output.mp4成功看到文字水印。

编译不再报错:No such filter: 'drawtext' ,报没有drawtext滤镜的错误。

2.文字水印含有符号的情况

1).在文字水印中含有冒号:时,ffmpeg运行会报错:

[Parsed_drawtext_0 @ 0x7f8d21702000] Cannot find a valid font for the family Sans

[AVFilterGraph @ 0x7f8d1e50e640] Error initializing filter 'drawtext' with args 'fontfile=/Library/Fonts/Songti.ttc:text=测试水印:90%:x=10:y=10:fontsize=24:fontcolor=white'

Error reinitializing filters!

Failed to inject frame into filter network: No such file or directory

Error while processing the decoded data for stream #0:0

原因是文字水印中的冒号:是ffmpeg中的分隔符,需要将它转义.

2). 在文字水印中含有百分号%,ffmpeg运行会报错:

[Parsed_drawtext_0 @ 0x7ffa57d0ecc0] Stray % near ''

    Last message repeated 1 times

原因是百分号%之后需要它要找大括号,因为%{...}格式是函数扩展模式,可见ffmpeg命令官网介绍

所以我们这里的解决方案就是增加命令expansion=none,指定扩展模式为逐个字符打印

ffmpeg -i test.mp4 -vf drawtext=fontfile=Songti.ttc:text='测试水印\\:90%':x=10:y=10:fontsize=24:fontcolor=white:expansion=none test_output.mp4

四、分析编译脚本

回过头来,我们简单分析一下mobile-ffmpeg脚本

第三方库和ffmpeg源码放在mobile-ffmpeg/src/* 中,编译脚本放在mobile-ffmpeg/build/*中,

如果我们对ffmpeg编译配置需要修改,可以打开mobile-ffmpeg/build/ios-ffmpeg.sh进行添加或修改。

最外层使用脚本位于mobile-ffmpeg/ios.sh,打开该脚本阅读可以看到它的逻辑。可对脚本进行修改以满足需求。

五、结束

文中Demo:

参考资料:https://github.com/tanersener/mobile-ffmpeg

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容