音視頻處理
- 一,圖片操作
- 1,轉換圖片格式
- 2,多張圖片合成視頻
- 二,音頻操作
- 1,轉換音頻格式
- 2,分割音頻為多段
- 3,合成多段音頻
- 三,視頻操作
- 1,轉換視頻格式
- 2,提取視頻中的音頻
- 3,合成多段視頻
- 4,為視頻添加音頻
- 5,視頻抽幀
- 四,壓縮文件
- 1,Zip轉rar
- 2,rar轉Zip
提前導入模塊
from pydub import AudioSegment
from moviepy.editor import VideoFileClip, concatenate_videoclips, AudioFileClip
from PIL import Image
import cv2
import os
一,圖片操作
1,轉換圖片格式
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,多張圖片合成視頻
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.shapefourcc = 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,轉換音頻格式
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,分割音頻為多段
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_lengthend = start + segment_lengthchunk = audio[start:end]chunks.append(chunk)chunk.export(f"chunk{i}.mp3", format) # 導出每個片段為單獨的文件return chunks
3,合成多段音頻
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,轉換視頻格式
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,提取視頻中的音頻
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,合成多段視頻
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,為視頻添加音頻
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,視頻抽幀
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 Imageimage = Image.fromarray(frame)image.save(output_image_path)print(f"從 {video_path} 抽取的幀已保存到 {output_image_path}")
四,壓縮文件
1,Zip轉rar
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
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)}")