加速合并,音频与字幕的探讨
因上一节。合并时速度太慢了。显卡没用上。所以想快一点。1分钟的视频用了5分钟。
在合并视频时,进度条中的 now=None 通常表示当前处理的时间点没有被正确记录或显示。这可能是由于 moviepy 的内部实现细节或配置问题。为了加快视频合并速度并利用 GPU 加速,可以采取以下措施:
1. 使用 GPU 加速
moviepy 本身并不直接支持 GPU 加速,但可以通过使用 ffmpeg 的 GPU 支持来加速视频处理。你需要确保 ffmpeg 已经安装并且配置了 GPU 支持(例如 NVIDIA GPU 和 CUDA)。
2. 配置 ffmpeg 使用 GPU
确保 ffmpeg 已经安装并且配置了 GPU 支持。你可以通过以下命令检查 ffmpeg 是否支持 GPU:
ffmpeg -hwaccels
我的机器结果:
duyicheng@duyicheng-computer:~$ ffmpeg -hwaccels
ffmpeg version 6.1.1-3ubuntu5+esm2 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 13 (Ubuntu 13.2.0-23ubuntu4)
configuration: --prefix=/usr --extra-version=3ubuntu5+esm2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --disable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared
libavutil 58. 29.100 / 58. 29.100
libavcodec 60. 31.102 / 60. 31.102
libavformat 60. 16.100 / 60. 16.100
libavdevice 60. 3.100 / 60. 3.100
libavfilter 9. 12.100 / 9. 12.100
libswscale 7. 5.100 / 7. 5.100
libswresample 4. 12.100 / 4. 12.100
libpostproc 57. 3.100 / 57. 3.100
Hardware acceleration methods:
vdpau
cuda
vaapi
qsv
drm
opencl
vulkan
如果输出中包含 cuda 或其他 GPU 加速选项,则表示 ffmpeg 支持 GPU 加速。
3. 修改 write_videofile 参数以使用 GPU
你可以通过设置 write_videofile 的参数来利用 GPU 加速。具体来说,可以使用 preset 和 threads 参数来优化性能。
4. 优化代码
确保代码中没有不必要的计算或重复操作,这可以提高整体性能。
修改后的代码示例
以下是修改后的代码示例,增加了使用 GPU 加速的配置:
from moviepy import VideoFileClip, AudioFileClip, TextClip, CompositeVideoClip
import cv2
import numpy as np
import logging
# 配置日志
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
def create_video(audio_path, subtitle_path, video_path, subtitle_position='center'):
# 创建一个灰色背景的视频
width, height = 1920, 1080 # 横屏视频分辨率
fps = 24 # 视频帧率
logging.debug(f"开始处理音频文件: {audio_path}")
duration = AudioFileClip(audio_path).duration # 视频时长与音频相同
logging.debug(f"音频时长: {duration} 秒")
# 创建灰色背景视频
try:
logging.debug("创建灰色背景视频")
video_clip = VideoFileClip("gray_background.mp4").with_duration(duration).resized((width, height))
logging.debug("灰色背景视频创建成功")
except Exception as e:
logging.error(f"创建灰色背景视频失败: {e}")
return
# 加载音频
try:
logging.debug("加载音频")
audio_clip = AudioFileClip(audio_path)
video_clip = video_clip.with_audio(audio_clip) # 确保音频正确插入
logging.debug("音频加载成功")
except Exception as e:
logging.error(f"加载音频失败: {e}")
return
# 读取字幕文件
try:
logging.debug(f"读取字幕文件: {subtitle_path}")
with open(subtitle_path, 'r', encoding='utf-8') as file:
subtitles = file.readlines()
logging.debug(f"读取字幕文件成功,共 {len(subtitles)} 行")
except Exception as e:
logging.error(f"读取字幕文件失败: {e}")
return
# 处理字幕
subtitle_clips = []
for i in range(0, len(subtitles), 3): # 3代表字幕文件中每一块所占行数。如果是4改成4
index = subtitles[i].strip()
time_range = subtitles[i + 1].strip().split(' --> ')
start_time = time_range[0]
end_time = time_range[1]
text = subtitles[i + 2].strip()
# 折行处理
font_size = 50
font = cv2.FONT_HERSHEY_SIMPLEX
max_width = width * 0.8 # 最大宽度为视频宽度的80%
words = text.split()
lines = []
line = ""
for word in words:
test_line = line + " " + word
(test_width, _), _ = cv2.getTextSize(test_line, font, 1, font_size)
if test_width <= max_width:
line = test_line
else:
lines.append(line)
line = word
lines.append(line)
# 创建TextClip
final_text = "\n".join(lines)
subtitle_clip = TextClip(text=final_text, font_size=font_size, color='white',
font='/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc')
subtitle_clip = subtitle_clip.with_start(start_time).with_end(end_time).with_position(
('center', subtitle_position))
subtitle_clips.append(subtitle_clip)
# 合成视频
try:
logging.debug("合成视频")
final_video = CompositeVideoClip([video_clip] + subtitle_clips)
# 使用 GPU 加速
final_video.write_videofile(video_path, codec='libx264', fps=fps, threads=8, preset='fast')
logging.debug("视频合成成功")
except Exception as e:
logging.error(f"合成视频失败: {e}",exc_info=True) #后一个参数可以获取更详细的错误信息
return
# 创建一个灰色背景视频
def create_gray_background(output_path, duration, fps, size):
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_path, fourcc, fps, size, isColor=True)
gray_frame = np.zeros((size[1], size[0], 3), dtype=np.uint8) + 128 # 灰色背景
for _ in range(int(fps * duration)):
out.write(gray_frame)
out.release()
# 创建一个黑色背景视频
def create_black_background(output_path, duration, fps, size):
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_path, fourcc, fps, size, isColor=True)
black_frame = np.zeros((size[1], size[0], 3), dtype=np.uint8) # 灰色背景
for _ in range(int(fps * duration)):
out.write(black_frame)
out.release()
# 示例调用
audio_path = "wwww.wav"
subtitle_path = "wwww.srt"
video_path = "wwww.mp4"
subtitle_position = 'bottom' # 可选值: 'center', 'bottom'
# 创建灰色背景视频
try:
duration = AudioFileClip(audio_path).duration
create_gray_background("gray_background.mp4", duration, 24, (1920, 1080))
except Exception as e:
logging.error(f"创建灰色背景视频失败: {e}")
# 创建最终视频
try:
create_video(audio_path, subtitle_path, video_path, subtitle_position)
except Exception as e:
logging.error(f"创建最终视频失败: {e}")
主要修改点:
使用 GPU 编码器:将 codec 参数从 libx264 改为 h264_nvenc,这是 NVIDIA GPU 的 H.264 编码器。这个很关键,有的不支持,根据自己的机器调整。
增加线程数:将 threads 参数设置为 4,以利用多线程加速。
设置预设:将 preset 参数设置为 fast,以平衡质量和速度。
测试一下:结果
(chattts) duyicheng@duyicheng-computer:~/gitee/ChatTTS$ python create_video2.py
2024-12-12 14:51:30,304 - DEBUG - 开始处理音频文件: wwww.wav
2024-12-12 14:51:30,351 - DEBUG - 音频时长: 62.47 秒
2024-12-12 14:51:30,351 - DEBUG - 创建灰色背景视频
2024-12-12 14:51:30,505 - DEBUG - 灰色背景视频创建成功
2024-12-12 14:51:30,505 - DEBUG - 加载音频
2024-12-12 14:51:30,550 - DEBUG - 音频加载成功
2024-12-12 14:51:30,550 - DEBUG - 读取字幕文件: wwww.srt
2024-12-12 14:51:30,550 - DEBUG - 读取字幕文件成功,共 69 行
2024-12-12 14:51:31,306 - DEBUG - 合成视频
MoviePy - Building video wwww.mp4.
MoviePy - Writing audio in wwwwTEMP_MPY_wvf_snd.mp3
MoviePy - Done.
MoviePy - Writing video wwww.mp4MoviePy - Done !
MoviePy - video ready wwww.mp4
2024-12-12 14:56:04,058 - DEBUG - 视频合成成功
以上是2个线程,还是4分钟多。基本无效。可能是机器太老了。有10年了。 改了8线程,也无用。基本寄了。
原文地址:https://blog.csdn.net/weixin_42771529/article/details/144425685
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!