用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','a')
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(self):
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(self):
print('请输入帧图片存放路径:')
im_dir = input(r'')#帧存放路径
print('请输入合成视频的存放路径:')
video_dir = input(r'') #合成视频存放的路径
print('请输入帧率:')
fps = eval(input()) #帧率
im_list = os.listdir(im_dir)
im_list.sort(key=lambda x: int(x.replace("frame","").split('.')[0]))
img = Image.open(os.path.join(im_dir,im_list[0]))
img_size = img.size #获得图片分辨率,im_dir文件夹下的图片分辨率需要一致
fourcc = cv2.VideoWriter_fourcc(*'XVID')
videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
for i in im_list:
im_name = os.path.join(im_dir+i)
frame = cv2.imdecode(np.fromfile(im_name, dtype=np.uint8), -1)
videoWriter.write(frame)
videoWriter.release()
print('合成完成!')
此外,还有一些其他功能:
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
还没有评论,来说两句吧...