### 解决 `UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in position 2101` 错误
此错误是因为 `subprocess` 尝试用 `gbk` 编码解码包含非 `gbk` 字符的输出。可通过指定 `encoding` 参数为 `utf-8` 来解决。修改代码中 `subprocess.run` 部分:
```python
result = subprocess.run(
conversion_cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
encoding='utf-8'
)
```
完整修改后的代码示例如下:
```python
import subprocess
import os
import logging
def video_conversion_pipeline(source_dir, target_dir, resolution="640x360", watermark_image="watermark.png", watermark_text="Your Text"):
os.makedirs(target_dir, exist_ok=True)
extensions = ['.mp4', '.avi', '.mov', '.mkv', '.flv', '.wmv']
ffmpeg_path = './FFmpeg/FFmpeg.exe'
if not os.path.exists(ffmpeg_path):
logging.error(f"FFmpeg未找到: {ffmpeg_path}")
return False
for filename in os.listdir(source_dir):
name, ext = os.path.splitext(filename)
if ext.lower() not in extensions:
continue
source_path = os.path.join(source_dir, filename)
output_name = f"{name}__zygl__"
mp4_path = os.path.join(target_dir, f"{output_name}.mp4")
thumbnail_path = os.path.join(target_dir, f"{output_name}.jpg")
try:
overlay_filter = f"movie={watermark_image},format=rgba,colorchannelmixer=aa=0.3 [watermark]; [in][watermark] overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2 [video_with_image_watermark]; drawtext=text='{watermark_text}':x=(main_w-text_w-10):y=(main_h-text_h-10):fontcolor=white@0.4:fontsize=24 [out]"
conversion_cmd = [
ffmpeg_path,
'-i', source_path,
'-c:v', 'libx264',
'-c:a', 'aac',
'-strict', 'experimental',
'-preset', 'medium',
'-crf', '23',
'-movflags', '+faststart',
'-s', resolution,
'-vf', overlay_filter,
'-y',
mp4_path
]
result = subprocess.run(
conversion_cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
encoding='utf-8'
)
if result.returncode != 0:
error_message = result.stderr if result.stderr else "No error message available"
logging.error(f"视频转换失败: {filename}\n错误信息: {error_message}")
continue
thumbnail_cmd = [
ffmpeg_path,
'-i', source_path,
'-ss', '00:00:03',
'-vframes', '1',
'-s', '480x270',
'-y',
thumbnail_path
]
subprocess.run(thumbnail_cmd)
logging.info(f"成功处理: {filename} -> {output_name}.mp4")
except Exception as e:
logging.error(f"处理 {filename} 时出错: {str(e)}")
return True
if __name__ == "__main__":
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
success = video_conversion_pipeline(
source_dir='./source_videos',
target_dir='./processed_videos',
resolution='800x450',
watermark_image='watermark.png',
watermark_text='Your Text'
)
if success:
logging.info("处理完成!")
else:
logging.error("处理过程中发生错误")
```
### 解决 `Fontconfig error: Cannot load default config file` 错误
此错误通常是因为 `Fontconfig` 无法找到默认配置文件。可以尝试以下解决办法:
- **设置 `FONTCONFIG_FILE` 环境变量**:指定 `Fontconfig` 配置文件的路径。
```python
import os
os.environ['FONTCONFIG_FILE'] = '/path/to/your/fontconfig.conf'
```
- **安装 `Fontconfig` 配置文件**:确保系统中安装了 `Fontconfig` 配置文件。在 Linux 系统中,可以使用包管理器安装;在 Windows 系统中,`Fontconfig` 可能不是必需的,可以尝试手动指定字体文件路径。例如在 `ffmpeg` 命令中使用 `drawtext` 滤镜时指定字体文件:
```python
drawtext_filter = f"drawtext=text='{watermark_text}':x=(main_w-text_w-10):y=(main_h-text_h-10):fontcolor=white@0.4:fontsize=24:fontfile='/path/to/your/font.ttf' [out]"
```