FFmpeg 是一个 C语言的项目,C语言标准库的功能比较简陋,所以很多东西都要自己写,造轮子。FFmpeg
已经造了不少轮子,AVString
就是其中一个轮子,用 AVString
函数库,可以使字符串处理更加方便。
AVString
函数库的代码在 libavutil/avstring.h
里面,本文选取一些常用的函数来讲解。
1,av_strstart()
,检查 str
字符串是不是以 pfx
开头的,如果是,返回 非 0,同时把 ptr
指向 pfx
后面的字符。
2,av_stristart()
,跟 av_strstart()
一样,只是不区分大小写。
上面这两个检查字符串开头的函数确实挺好用,C标准库好像是没有类似的函数。
3,av_strnstr()
,跟C标准库函数 strstr()
一样,只是限制了搜索长度。
4,av_strlcpy()
,根据长度拷贝字符,跟 BSD 的 strlcpy()
函数一样。
5,av_strlcat()
,拼接字符串函数,跟 BSD的 strlcat()
类似,但有些许区别。
6,av_strlcatf()
,动态参数拼接字符串,感觉这个函数超有用。
7,av_strnlen()
,获取字符串的长度,但是加了长度限制,估计是为了防止传错指针,字符串没有以 0 结尾,导致死循环。加了长度限制就不会死循环。
8,av_asprintf()
,类似 GNU 的 asprintf()
,返回值是堆指针,需要自己释放内存。
9,av_get_token()
,不知道干嘛的,后面补充。
10,av_strtok()
,字符串分割函数,可以把 hello-jason-please
字符串按照 -
符号分割成 hello
jason
please
。
11,av_isdigit()
,判断单个字符是不是数字字符,通过把 char
转成 int
来比较的。
12,av_isgraph()
,判断单个字符是不是图像字符。
13,av_isspace()
,判断单个字符是不是空格或者换行符之类的。
14,av_toupper()
,av_tolower()
,转换大小写。
15,av_isxdigit()
,判断一个字符是不是 16 进制的数字字符。
16,av_strcasecmp()
,比较两个字符串是否一样,不区分大小写。
17,av_strireplace()
,后面补充。
18,av_basename()
,后面补充。线程安全的。
19,av_dirname()
,后面补充。线程安全的。
20,av_match_name()
,后面补充。
21,av_append_path_component()
,后面补充。
22,av_escape()
,后面补充。
23,av_utf8_decode()
,后面补充。
24,av_match_list()
,后面补充。
25,av_sscanf()
,后面补充。
还有一个我自己最常用的字符串函数,av_strdup()
,但是这个函数是在 libavutil/mem.h
里面的,定义如下:
这个函数可以很方便的创建一个字符串变量,这个变量是在堆上的,需要自己释放内存。下面对比一下原生的方式跟 用 av_strdup
的方式。
可以看到,av_strdup
非常地简洁。
上面这些函数的使用示例,可以在 GitHub 下载,截图如下: