【脚本】图片-音视频-压缩文件处理

音视频处理

提前导入模块

python 复制代码
from pydub import AudioSegment
from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip
from PIL import Image
import cv2
import os

一,图片操作

1,转换图片格式
python 复制代码
def convert_image(input_path, output_path, output_format):
	"""
    将图片从一种格式转换为另一种格式。

    :param input_path: 输入图片文件的路径。
    :param output_path: 输出图片文件的路径。
    :param output_format: 输出图片的格式(如 'PNG', 'JPEG' 等)。
    """
    try:
        # 打开输入图片
        image = Image.open(input_path)
        
        # 将图片保存为指定的输出格式
        image.save(output_path, format=output_format)
        
        print(f"成功将图片转换为 {output_format} 格式并保存到 {output_path}")
    except Exception as e:
        print(f"转换图片格式时出现错误: {str(e)}")
2,多张图片合成视频
python 复制代码
def images_to_video(image_folder, output_video_path, frame_rate=30):
    """
    将多张图片合成为视频。

    :param image_folder: 包含要合成的图片的文件夹路径。
    :param output_video_path: 输出视频的文件路径。
    :param frame_rate: 视频的帧率(默认为30帧/秒)。
    """
    image_files = [img for img in os.listdir(image_folder) if img.endswith(".png") or img.endswith(".jpg")]
    image_files.sort()  # 确保图片按顺序排列

    frame = cv2.imread(os.path.join(image_folder, image_files[0]))
    height, width, layers = frame.shape

    fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 选择视频编解码器(可以根据需要更改)
    video = cv2.VideoWriter(output_video_path, fourcc, frame_rate, (width, height))

    for image_file in image_files:
        image_path = os.path.join(image_folder, image_file)
        frame = cv2.imread(image_path)
        video.write(frame)

    video.release()
    print(f"成功生成视频:{output_video_path}")

二,音频操作

1,转换音频格式
python 复制代码
def convert_audio_format(input_path, output_path, output_format):
    """
    将音频文件从一种格式转换为另一种格式。

    :param input_path: 输入音频文件的路径。
    :param output_path: 输出音频文件的路径。
    :param output_format: 输出音频的格式(如 'mp3', 'wav' 等)。
    """
    # 加载音频文件
    audio = AudioSegment.from_file(input_path)

    # 转换并导出音频
    audio.export(output_path, format=output_format)

    print(f"音频已从 {input_path} 转换为 {output_format} 格式,并保存到 {output_path}。")
2,分割音频为多段
python 复制代码
def split_audio_into_chunks(audio_path, format,segment_length=10000):
    """
    将音频文件分割成多个片段。

    :param audio_path: 音频文件的路径。
    :param segment_length: 分割长度,单位为毫秒。默认为 10000 毫秒(10秒)。
    :return: 分割后的音频片段列表。
    """
    # 加载音频文件
    audio = AudioSegment.from_file(audio_path)

    # 计算分割数量
    length_of_audio = len(audio)
    number_of_chunks = length_of_audio // segment_length + (1 if length_of_audio % segment_length else 0)

    # 分割音频
    chunks = []
    for i in range(number_of_chunks):
        start = i * segment_length
        end = start + segment_length
        chunk = audio[start:end]
        chunks.append(chunk)
        chunk.export(f"chunk{i}.mp3", format)  # 导出每个片段为单独的文件

    return chunks
3,合成多段音频
python 复制代码
def merge_audio_files(audio_files, output_path):
    """
    合并多个音频文件为一个音频文件。

    :param audio_files: 音频文件路径列表。
    :param output_path: 合并后的音频文件输出路径。
    """
    # 初始化空的音频段
    combined = AudioSegment.empty()

    # 依次加载每个音频文件并合并
    for file in audio_files:
        audio = AudioSegment.from_file(file)
        combined += audio

    # 导出合并后的音频文件
    combined.export(output_path, format="mp3")

    print(f"音频文件已合并并保存到 {output_path}")

三,视频操作

1,转换视频格式
python 复制代码
def convert_video_format(input_path, output_path, output_format):
    """
    将视频文件从一种格式转换为另一种格式。

    :param input_path: 输入视频文件的路径。
    :param output_path: 输出视频文件的路径。
    :param output_format: 输出视频的格式(如 'mp4', 'avi' 等)。
    """
    # 加载视频文件
    video = VideoFileClip(input_path)

    # 设置输出文件的扩展名
    output_path_with_format = output_path + '.' + output_format

    # 转换并导出视频
    video.write_videofile(output_path_with_format, codec='libx264')

    print(f"视频已从 {input_path} 转换为 {output_format} 格式,并保存到 {output_path_with_format}。")
2,提取视频中的音频
python 复制代码
def extract_audio_from_video(video_path, audio_output_path):
    """
    从视频文件中提取音频。

    :param video_path: 视频文件的路径。
    :param audio_output_path: 要保存的音频文件的路径。
    """
    # 加载视频文件
    video = VideoFileClip(video_path)

    # 提取音频
    audio = video.audio

    # 保存音频文件
    audio.write_audiofile(audio_output_path)

    print(f"音频已从 {video_path} 提取并保存到 {audio_output_path}。")
3,合成多段视频
python 复制代码
def merge_video_files(video_files, output_path):
    """
    合并多个视频文件为一个视频文件。

    :param video_files: 视频文件路径列表。
    :param output_path: 合并后的视频文件输出路径。
    """
    # 加载视频文件
    clips = [VideoFileClip(file) for file in video_files]

    # 合并视频
    final_clip = concatenate_videoclips(clips)

    # 导出合并后的视频文件
    final_clip.write_videofile(output_path, codec="libx264")

    print(f"视频文件已合并并保存到 {output_path}")
4,为视频添加音频
python 复制代码
def add_audio_to_video(video_path, audio_path, output_path):
    """
    将音频文件添加到视频文件中。

    :param video_path: 视频文件的路径。
    :param audio_path: 音频文件的路径。
    :param output_path: 合成后的视频文件输出路径。
    """
    # 加载视频和音频
    video_clip = VideoFileClip(video_path)
    audio_clip = AudioFileClip(audio_path)

    # 将音频添加到视频中
    video_with_audio = video_clip.set_audio(audio_clip)

    # 导出最终视频文件
    video_with_audio.write_videofile(output_path, codec="libx264")

    print(f"音频已添加到视频中,并保存到 {output_path}")
5,视频抽帧
python 复制代码
def extract_frame_from_video(video_path, time, output_image_path):
    """
    从视频中抽取特定时间点的帧。

    :param video_path: 视频文件的路径。
    :param time: 抽取帧的时间点(秒)。
    :param output_image_path: 输出图像的路径。
    """
    # 加载视频文件
    video_clip = VideoFileClip(video_path)

    # 获取特定时间点的帧
    frame = video_clip.get_frame(time)

    # 将帧保存为图像
    from PIL import Image
    image = Image.fromarray(frame)
    image.save(output_image_path)

    print(f"从 {video_path} 抽取的帧已保存到 {output_image_path}")

四,压缩文件

1,Zip转rar
python 复制代码
def convert_zip_to_rar(zip_file_path, rar_file_path):
    """
    将zip文件转换为rar文件。

    :param zip_file_path: 输入的zip文件路径。
    :param rar_file_path: 输出的rar文件路径。
    """
    try:
        # 打开输入的zip文件
        with zipfile.ZipFile(zip_file_path, 'r') as zipf:
            # 创建rar文件
            with rarfile.RarFile(rar_file_path, 'w') as rarf:
                # 逐个将zip文件中的文件添加到rar文件中
                for file_name in zipf.namelist():
                    with zipf.open(file_name) as zip_file:
                        rarf.writestr(file_name, zip_file.read())
        
        print(f"成功将 {zip_file_path} 转换为 {rar_file_path}")
    except Exception as e:
        print(f"转换文件格式时出现错误: {str(e)}")
2,rar转Zip
python 复制代码
def convert_rar_to_zip(rar_file_path, zip_file_path):
    """
    将RAR文件转换为ZIP文件。

    :param rar_file_path: 输入的RAR文件路径。
    :param zip_file_path: 输出的ZIP文件路径。
    """
    try:
        # 打开输入的RAR文件
        with rarfile.RarFile(rar_file_path, 'r') as rarf:
            # 创建ZIP文件
            with zipfile.ZipFile(zip_file_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
                # 逐个将RAR文件中的文件添加到ZIP文件中
                for file_name in rarf.namelist():
                    with rarf.open(file_name) as rar_file:
                        zipf.writestr(file_name, rar_file.read())
        
        print(f"成功将 {rar_file_path} 转换为 {zip_file_path}")
    except Exception as e:
        print(f"转换文件格式时出现错误: {str(e)}")
相关推荐
CriticalThinking13 分钟前
Pycharm不正常识别包含中文路径的解释器
ide·python·pycharm
来吧~14 分钟前
vue3使用video-player实现视频播放(可拖动视频窗口、调整大小)
前端·vue.js·音视频
Bubluu14 分钟前
浏览器点击视频裁剪当前帧,然后粘贴到页面
开发语言·javascript·音视频
深圳启明云端科技15 分钟前
ESP-IDF HTTP POST请求发送音频-ESP32物联网方案
物联网·http·音视频
从后端到QT17 分钟前
音视频采集推流时间戳记录方案
ffmpeg·音视频
御风@户外20 分钟前
质数生成函数、质数判断备份
算法·acm
闻缺陷则喜何志丹33 分钟前
【C++动态规划】1105. 填充书架|2104
c++·算法·动态规划·力扣·高度·最小·书架
sin220139 分钟前
springboot数据校验报错
spring boot·后端·python
Dong雨1 小时前
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
数据结构·算法·排序算法
达帮主1 小时前
7.C语言 宏(Macro) 宏定义,宏函数
linux·c语言·算法