python用ffmpeg进行视频处理

1.下载及安装

在ffmpeg官网https://ffmpeg.zeranoe.com/builds/可以下载到需要的版本,然后解压到D盘,添加环境变量(如D:\ffmpeg\bin)
在这里插入图片描述
在cmd输入ffmpeg,出现如图现象,即为安装成功

2.使用

#视频处理
def file_name(path_file):
    for i in range(len(path_file)):#找到不含地址的文件名
        if(path_file[-i-1]=='\\'):
            name = path_file[-i:]
            break
    return name
class video():
    def __init__(self):
        print('(1)视频合并\n(2)视频剪辑\n(3)视频格式转换\n(4)提取音频')
        print('(5)视频拆分成帧图片\n(6)帧图片合成视频')
        b = eval(input('请选择:\n'))
        if(b==1):
            self.video_convert()
        elif(b==2):
            self.video_clip()
        elif(b==3):
            self.video_format_conversion()
        elif(b==4):
            print('请输入视频的存储路径:')
            video = input(r'')
            cmd = 'ffmpeg -i {} -f mp3 -vn output.mp3'.format(video)
            subprocess.call(cmd,shell=True)
            print('提取完成!')
        elif(b==5):
            self.video_frame_photo()
        elif(b==6):
            self.frame_photo_video()
        else:
            print('输入有误!')  
    #视频合并
    def video_convert(self):
        print('请输入视频个数:')
        num = eval(input())
        filelist = open('filelist.txt','w')
        for i in range(num):
            print('请输入视频%d的存储路径:'%(i+1))
            a = input(r'')
            filelist.write("file '"+ a +"'\n")
        filelist.close()
        cmd = 'ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4'
        subprocess.call(cmd,shell=True)
        print('合并完成!')
    #视频格式转换
    def time(self,file_path):
        cap = cv2.VideoCapture(file_path)
        # get方法参数按顺序对应下表(从0开始编号)
        rate = cap.get(5)   # 帧速率
        FrameNumber = cap.get(7)  # 视频文件的帧数
        duration = FrameNumber/rate/60  # 帧速率/视频总帧数 是时间,除以60之后单位是分钟
        minutes = int(duration)
        seconds = int((duration - minutes) * 60)
        return str(minutes) + ':' + str(seconds)
    def video_format_conversion(self):
        while True:
            print('请输入视频路径:')
            video = input()
            #print('请输入需要转换的视频格式:')
            style = 'mp4'#input()
            time = self.time(video)
            cmd = 'ffmpeg -i {} -ss 00:00:00 -c copy -to {} {}.{}'.format(video,time,file_name(video),style)
            subprocess.call(cmd,shell=True)
            print('转换完成!')
    #视频剪辑
    def video_clip(self):
        print('请输入视频路径:')
        video = input()
        print('请输入开始时间:')
        start = input()
        print('请输入结束时间:')
        end = input()
        cmd = 'ffmpeg -i {} -ss {} -c copy -to {} output.mp4'.format(video,start,end)
        subprocess.call(cmd,shell=True)
        print('剪辑完成!')
    #视频拆分成帧图片
    def video_frame_photo():
    	print('请输入视频的存放路径:')
    	videos_path = input(r'') #视频的存放路径
    	print('请输入帧图片的存放路径:')
    	frames_save_path = input(r'') #视频切分成帧之后图片的保存路径
    	print('每几帧中保存1帧?')
    	time_interval = eval(input()) #每1帧保存一次    
    	vidcap = cv2.VideoCapture(videos_path)
    	success, image = vidcap.read()
   	 	count = 0
    	while success:
        	success, image = vidcap.read()
        	count = count + 1
        	if count % time_interval == 0:
            	cv2.imencode('.jpg', image)[1].tofile(frames_save_path + "frame%d.jpg" % count)
        print('拆分完成!')
        #帧图片合成视频
def frame_photo_video(size):
    print('请输入帧图片存放路径:')
    path = input(r'')#帧存放路径
    print('请输入合成视频的存放路径:')
    save_path = input(r'') #合成视频存放的路径
    print('请输入帧率:')
    fps = eval(input())
    filelist = os.listdir(path)  # 获取该目录下的所有文件名
    size = Image.open(save_path+filelist[0]).size
    i = 1
    while True:
    	if os.path.isdir(save_path + 'exp-video{}.mp4'.format(i)) == True:
	        i = i + 1
        else:
            break
    file_path = save_path + 'exp-video{}.mp4'.format(i)
    fourcc = cv2.VideoWriter_fourcc('D', 'I', 'V', 'X')  # 不同视频编码对应不同视频格式(例:'I','4','2','0' 对应avi格式)
    video = cv2.VideoWriter(file_path, fourcc, fps, size)
    for item in filelist:
        if item.endswith('.jpg') or item.endswith('.png'):  # 判断图片后缀是否是.png
           item = path + '/' + item
           img = cv2.imread(item)  # 使用opencv读取图像,直接返回numpy.ndarray 对象,通道顺序为BGR ,注意是BGR,通道值默认范围0-255。
           video.write(img)  # 把图片写进视频

此外,还有一些其他功能:

4.其它功能

提取无声视频

ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4

合并两个音频

ffmpeg -i input1.mp3 -i input2.mp3 -filter_complex amerge -ac 2 -c:a libmp3lame -q:a 4 output.mp3

提取字幕:

ffmpeg -i input.mkv -vn -an -codec:s:0 srt subtitle.srt

添加字幕:

ffmpeg -i input.mkv -vf subtitles=subtitle.srt output.mp4

音视频合并:

ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中使用FFmpeg进行多进程分割视频文件可以通过以下步骤实现: 1. 首先,你需要安装FFmpeg并确保它已经添加到系统的环境变量中。你可以从FFmpeg的官方网站(https://ffmpeg.org/)下载并安装它。 2. 在Python中,你可以使用`subprocess`模块来执行FFmpeg命令。首先,导入`subprocess`模块: ```python import subprocess ``` 3. 接下来,你可以使用`subprocess.Popen`函数来启动一个新的进程并执行FFmpeg命令。例如,你可以使用以下代码来分割视频文件: ```python def split_video(input_file, output_file, start_time, duration): command = ['ffmpeg', '-i', input_file, '-ss', start_time, '-t', duration, '-c', 'copy', output_file] process = subprocess.Popen(command) process.wait() ``` 在上面的代码中,`input_file`是输入视频文件的路径,`output_file`是输出视频文件的路径,`start_time`是分割开始的时间(以秒为单位),`duration`是分割的持续时间(以秒为单位)。 4. 如果你想要同时分割多个视频文件,你可以使用Python的多进程库(如`multiprocessing`)来实现并行处理。以下是一个示例代码: ```python import multiprocessing def split_video(input_file, output_file, start_time, duration): # 分割视频的代码 if __name__ == '__main__': input_files = ['video1.mp4', 'video2.mp4', 'video3.mp4'] output_files = ['output1.mp4', 'output2.mp4', 'output3.mp4'] start_times = [10, 20, 30] durations = [5, 10, 15] processes = [] for i in range(len(input_files)): process = multiprocessing.Process(target=split_video, args=(input_files[i], output_files[i], start_times[i], durations[i])) processes.append(process) process.start() for process in processes: process.join() ``` 在上面的代码中,`input_files`是输入视频文件的路径列表,`output_files`是输出视频文件的路径列表,`start_times`是分割开始的时间列表,`durations`是分割的持续时间列表。通过循环创建多个进程来同时处理多个视频文件的分割操作。 这样,你就可以使用FFmpegPython的多进程库来实现多进程分割视频文件了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值