自学内容网 自学内容网

加速合并,音频与字幕的探讨

因上一节。合并时速度太慢了。显卡没用上。所以想快一点。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.mp4

MoviePy - 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)!