python合并mp4视频 (mp3音频怎么与mp4视频合成)

#encoding=utf-8
'''
pic合成movie
'''
import os
import imageio
from PIL import Image
#encoding=utf-8
import os
import logging
import datetime
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s -%(levelname)s -%(message)s')
log = logging.getLogger(__name__)

class FileOprate():
    def __init__(self,obsfn,fp,fn,create_time,update_time,access_time,file_size):
        self.obsfn = obsfn
        self.fp = fp
        self.fn = fn
        self.create_time = create_time
        self.update_time = update_time
        self.access_time = access_time
        self.file_size = file_size

def time2str(time):
    return str(datetime.datetime.fromtimestamp(time)).split('.')[0]

def getAllFiles(folder):
    fo_list = []
    for root,folder_names,file_names in os.walk(folder):
        for file_name in file_names:
            file_path = root + os.sep + file_name
            file_stat = os.stat(file_path)
            ct = file_stat.st_ctime
            ut = file_stat.st_mtime
            at = file_stat.st_atime
            fs = os.path.getsize(file_path)
            fo = FileOprate(file_path,root,file_name,ct,ut,at,fs)
            fo_list.append(fo)            
    return fo_list

def suo_tu2(path,save_path,width=224,height=224):
    raw_files = os.walk(path)
    for root,dirs,files in raw_files:
        log.info("遍历图片信息:{}".format(root))
        for file in files:
            pic_path = os.path.join(root,file)
            pic_org = Image.open(pic_path)

            #pic_new = pic_org.resize((width,height),Image.ANTIALIAS)
            pic_new = pic_org.resize((width,height),)
            
            _, sub_folder = os.path.split(root) #得到子文件夹的名字
            pic_new_path = os.path.join(save_path,sub_folder)
            if not os.path.exists(pic_new_path):
                os.makedirs(pic_new_path)
            pic_new_path = os.path.join(pic_new_path,file)
            
            #pic_new_path = os.path.join(save_path,file)
            log.info("pic_new_path:{},pic_new:{}".format(pic_new_path,pic_new.__dict__))
            pic_new.save(pic_new_path)

'''
将图片合成视频
'''
from pathlib import Path
from moviepy.editor import ImageSequenceClip
def image2Movie(src_folder,distFile):
    # src_folder: 来源文件夹的路径
    file_list = list(Path(src_folder).glob('*.jpg'))
    duration_list = [1] * len(file_list) #设置每张图片在视频中显示的时长
    new_video = ImageSequenceClip(src_folder,durations=duration_list)
    new_video.write_videofile(distFile,fps=5)


def test():
    #获取D:\temp\pic下的所有图片
    src_folder = r'D:\temp\pic\srcPic'
    save_path = r'D:\tmp\pic\20230605'
    distFile = r'D:\tmp\pic\20230605.mp4'
    suo_tu2(src_folder,save_path,640,640)
    #image2Movie(save_path,distFile)

import cv2
import os
import moviepy.editor as mov
def image_to_video(image_path,media_path):
    image_names = os.listdir(image_path)
    #对提取的图片名称进行排序
    image_names.sort(key=lambda n: int(n[:-4]))
    #设置写入格式
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    #设置每秒帧数
    fps = 1
    #读取第一个图片大小尺寸,因为需要转换成视频的图片大小尺寸是一样的
    image = Image.open(image_path + os.sep + image_names[0])
    #初始化媒体写入对象
    media_writer = cv2.VideoWriter(media_path,fourcc,fps,image.size)
    #遍历图片,将每张图片加入视频当中
    for i in range(3):
        for image_name in image_names:
            im  = cv2.imread(os.path.join(image_path,image_name))
            media_writer.write(im)
            log.info("{}合并完成!".format(image_name))
    #释放媒体写入对象
    media_writer.release()
    log.info("无声视频写入完成!")

# 给视频配置音乐
def set_music():
    #合成视频设置背景音乐函数
    log.info("开始添加背景音乐!")
    #初始化视频文件对象
    clip = mov.VideoFileClip(r'D:\tmp\pic\20230605.mp4')
    #从某个视频中提取一段背景音乐
    audio = mov.AudioFileClip(r'D:\tmp\pic\taohuanuo.mp3').subclip(30,90)
    #将背景音乐写入.mp3文件
    audio.write_audiofile(r'D:\tmp\pic\taohuanuo2.mp3')
    # 想合成好的无声视频中添加音乐
    clip = clip.set_audio(audio)
    #保存视频
    clip.write_videofile('D:\tmp\pic\20230605-2.mp4')
    log.info("背景音乐添加完成!")

from moviepy import *
from moviepy.editor import *
# mp3与mp4合并
def mp3_merge_mp4(mp3,mp4,newmp4):
    #提取音频
    audio = AudioFileClip(mp3)
    #读取视频
    video = VideoFileClip(mp4)
    #将音频合并到视频中
    video = video.set_audio(audio)
    #输出
    video.write_videofile(newmp4)

# 给视频添加标题字幕
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
def make_title_text():
    video_clip = VideoFileClip(r'D:\tmp\pic\20230605-2.mp4') # 读取视频
    text = TextClip(txt='商洛*望江楼', font='FZBangSXJW.ttf',fontsize=120,color='RED',kerning=10)
    text = text.set_position('center')
    text = text.set_duration(1)
    new_video = CompositeVideoClip([video_clip, text])
    new_video.write_videofile(r'D:\tmp\pic\20230605-3.mp4')

if __name__=='__main__':
    #test()
    '''
    image_path = r'D:\temp\pic\srcPic'
    media_path = r'D:\tmp\pic\20230605.mp4'
    image_to_video(image_path,media_path)
    '''
    #set_music()

    '''
    mp3 = r'D:\tmp\pic\taohuanuo2.mp3'
    mp4 = r'D:\tmp\pic\20230605.mp4'
    newmp4 = r'D:\tmp\pic\20230605-2.mp4'
    mp3_merge_mp4(mp3,mp4,newmp4)
    '''

    make_title_text()