FFMPEG添加文字中文显示乱码的问题

本文介绍如何解决使用FFmpeg添加中文文字时出现的乱码问题,通过更换字体文件及调整配置实现中文正常显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 【后记】本篇是几年前还在从事流媒体时候的一篇笔记文,近来常有朋友问我目前的方向,经过几年的辗转,目前在计算机视觉AI方向落地生根。转方向需要持续的学习和突破,从流媒体转到人工智能也是一个需要时间的过程,所幸的是,自己从来没有放弃前进的步伐。在不断的摸索前进中,逐渐汲取更多的知识和能量,才能支撑我们走到更远更高的地方。前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享给想学习人工智能的你。点击跳转到网站

---------------------------------------------------------------------------------------------------------------------------------

最近在视频中添加文字的时候,遇到中文显示乱码的问题,使用的命令行如下:

ffmpeg  -i bingheshiji.ts  -c:v libx264 -preset veryfast  -s 1280x720 -r 25  -b:v 1500k  -bufsize 1500k -maxrate 1500k -minrate 1500k 

-rc_init_occupancy 1125k  -max_delay 1.4M  -vf 

drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeMono.ttf:textfile=text.txt:x=100:y=200:fontsize=50:

fontcolor=0xFF0000:reload=1" -c:a libfdk_aac -profile:a aac_low  -b:a 64k  -ar 48000 -ac 2 -muxrate 2000k -f mpegts  

-max_interleave_delta 1000000  addtext.ts

滤镜参数说明:

drawtext是用来添加文字的滤镜名称;

fontfile:指定的字体文件;

textfile:需要添加的文字文件,也可以用text=‘Hello world’这种格式指定需要添加的文字,但是对于大量文字,显然文件更为方便;

x,y:文字左上角在画面上显示的位置;

fontsize:字体大小;

fontcolor:字体颜色,可以通过0xRRGGBB@0.X来指定文字的透明度,例如0xFF0000@0.5为红色半透明。

reload:为1时表示每帧重新load字体文件,可以实现实时更新显示文字的功能。

输出的添加文字的视频如下:

网上类似情况,有人说文字需要转成UTF-8编码,经查看,文字文件已经是UTF-8编码格式。于是怀疑是字体文件不匹配。从windows下面获取了宋体、微软雅黑两个字体文件,拷贝到ubuntu系统中,具体步骤如下:

1. 从工作电脑C:\Windows\Fonts下面找到宋体文件simsun.ttc,并将其上传至转码服务器自己的文件夹中,我用的是winscp工具。

2. 在服务器中,进入字体文件存放位置:cd /usr/shared/fonts/,创建一个新文件夹,用来存放新拷贝进来的汉字字体文件:

     sudo mkdir chinese

3. cd chinese/,进入新建的文件夹,将放在自己目录中的宋体文件simsun.ttc拷贝至chinese文件夹下:

     sudo cp /home/ubuntu/myname/simsun.ttc ./simsun.ttc

4. 为新拷贝进来的字体文件加可读权限: 

     sudo chmod 644 simsun.ttc

     644为当前用户读写,当前组用户只读,其他用户只读,也可以用444,全部只读。

5. 安装字体文件:

    (1) sudo mkfontscale  创建字体fonts.scale文件,用来控制字体的旋转缩放;

    (2) sudo mkdir    创建fonts.dir文件;

    (3) sudo fc-cache -fv    建立字体缓存信息,即让系统识别到当前字体。

做完上面的5步操作后,修改命令行如下:

ffmpeg  -i bingheshiji.ts  -c:v libx264 -preset veryfast  -s 1280x720 -r 25  -b:v 1500k  -bufsize 1500k -maxrate 1500k -minrate 1500k 

-rc_init_occupancy 1125k  -max_delay 1.4M  -vf  drawtext="fontfile=/usr/share/fonts/chinese/simsun.ttc:textfile=text.txt:x=100:y=200:fontsize=50:

fontcolor=0xFF0000:reload=1"  -c:a libfdk_aac -profile:a aac_low  -b:a 64k  -ar 48000 -ac 2 -muxrate 2000k -f mpegts 

 -max_interleave_delta 1000000  addtext.ts

再来看得到的结果:

用同样方法安装微软雅黑字体 msyh.ttf到ubuntu系统中,也能正常显示中文:

注:由于在drawtext滤镜中使用了参数reload=1,且在转码过程中实时编辑文字文件text.txt,因此,可以看到播放到后面的时候,文字内容已经比前面有所增加。

<think>好的,我需要帮助用户在CentOS 8上使用pyttsx3库实现文字转语音功能。首先,我得回顾一下用户提供的引用内容,看看有没有相关的信息。引用[2]提到在CentOS 7中使用Docker部署pyttsx3,需要安装python3-devel和espeak。引用[4]是在Deepin系统上配置pyttsx3,其中提到需要安装espeak和设置语音参数为中文。 用户现在用的是CentOS 8,所以可能需要类似的步骤,但要注意CentOS 8的包管理可能与CentOS 7不同。首先,安装必要的依赖库。CentOS 8可能使用dnf而不是yum,所以需要调整安装命令。例如,安装python3-devel和espeak,可能用dnf install python3-devel espeak。另外,用户可能需要安装pip3,因为CentOS 8默认可能没有安装,可以用dnf install python3-pip来安装。 接下来,安装pyttsx3库,用户可能需要使用pip3 install pyttsx3。但根据引用[4],在Linux上pyttsx3依赖espeak,所以确保espeak已经正确安装,并且可能需要设置语音参数为中文,比如engine.setProperty('voice', 'zh'),这样才能正常朗读中文。 然后,编写代码示例。根据引用[1]和[3],代码需要初始化引擎,设置语速、音量、语音类型,然后调用say和runAndWait方法。需要注意的是,在Linux环境下,保存音频文件可能需要ffmpeg,所以用户可能需要安装ffmpeg,但引用[3]中提到在Linux中要确保安装espeak和ffmpeg模块。 可能遇到的问题包括:安装依赖时的包名称不同,例如espeak在CentOS 8中的名称是否一致;中文语音支持是否需要额外配置;权限问题,比如是否需要sudo来安装软件包。此外,用户可能需要测试代码是否能够正确发音,如果出现语音异常,可能需要检查语音引擎的设置,如引用[4]中提到的设置语音为中文。 最后,生成相关问题需要考虑用户在实现过程中可能遇到的其他问题,比如性能优化、异常处理、部署到生产环境等,以及如何结合其他工具如Docker进行部署,如引用[2]中的Dockerfile示例。</think>### 在CentOS 8中使用pyttsx3实现文字转语音的步骤 #### 1. 安装系统依赖 pyttsx3在Linux系统上依赖`espeak`语音引擎和Python开发工具包: ```bash sudo dnf install espeak python3-devel python3-pip ``` - `espeak`:提供基础语音合成功能[^4] - `python3-devel`:编译Python依赖的必要头文件[^2] - `python3-pip`:Python包管理工具[^4] #### 2. 安装pyttsx3库 ```bash pip3 install pyttsx3 ``` 若下载缓慢,可添加阿里云镜像: ```bash pip3 install -i https://mirrors.aliyun.com/pypi/simple/ pyttsx3 ``` #### 3. 编写基础代码 创建`text_to_speech.py`文件,内容如下: ```python import pyttsx3 def text_to_speech(text): engine = pyttsx3.init() # 设置语音参数(中文支持) engine.setProperty('rate', 150) # 语速(默认200) engine.setProperty('volume', 1.0) # 音量(0-1) engine.setProperty('voice', 'zh') # 中文语音支持[^4] engine.say(text) engine.runAndWait() if __name__ == "__main__": input_text = input("请输入要转换的文字:") text_to_speech(input_text) ``` #### 4. 运行测试 ```bash python3 text_to_speech.py ``` 输入中文文本后,系统将通过扬声器输出语音。 --- #### 常见问题解决 1. **中文发音异常** 若输出为英文或乱码,需确认: - 已安装`espeak`并设置`engine.setProperty('voice', 'zh')` - 系统语言环境支持中文(可通过`locale`命令检查) 2. **音频保存功能** 需额外安装`ffmpeg`: ```bash sudo dnf install ffmpeg ``` 代码中添加: ```python engine.save_to_file('文本内容', 'output.mp3') engine.runAndWait() # 必须再次调用以生成文件 ``` 3. **Docker部署** 参考CentOS 7的Dockerfile适配(需改用CentOS 8基础镜像)[^2]: ```dockerfile FROM centos:8 RUN dnf install -y python3-devel espeak python3-pip WORKDIR /app COPY . . RUN pip3 install -r requirements.txt CMD ["python3", "main.py"] ``` ---
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值