python处理视频的几个操作

两组图片序列帧合成一个视频(左右排列),只合成一个的自行修改

参数介绍:

  • 两组图片序列帧存放在source中,命名格式为

        real_1.png、real_2.png、..........

        fake_1.png、fake_2.png、...........

  • 将合成好的视频name(final.avi),保存在file('./results')中。
  • size为name(final.avi)的大小,注意格式为(width,height)
  • size一定要和图片的大小对应好,否则final.avi无法播放
import os
import cv2
import numpy as np

def picvideo(path,size,file,name):
    filelist = os.listdir(path) # 获取path中的所有序列帧

    fps = 35

    file_path = os.path.join(file,name)
    fourcc = cv2.VideoWriter_fourcc('I','4','2','0')
    # fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')  # mp4

    video = cv2.VideoWriter(file_path,fourcc,fps,size)
    real = []
    fake = []
    for item in filelist:
        # if 后的判断根据自己的实际情况去编写,如果用到以aaa结尾的,自行改成item.endswith('aaa')
        if item.startswith('real'):
            item=path+'/'+item
            real.append(item)
        if item.startswith('fake'):
            item=path+'/'+item
            fake.append(item)
    real.sort()
    fake.sort()

    for path1,path2 in zip(real,fake):
        img1=cv2.imread(path1)
        img2=cv2.imread(path2)
        assert img1.shape==img2.shape, "shape error"
        # 竖排用 image=np.vstack([img1,img2])
        image=np.hstack([img1,img2]) # 横排
        video.write(image)
    video.release()


number=2
path = 'source'
# 竖排用 size=(1024,512*number)
size = (1024*number,512)
file = './results'
name = 'final.avi'
picvideo(path, size, file, name)
    
    

计算一个视频的FPS

import cv2
if __name__ == '__main__' :
 
  video = cv2.VideoCapture("video.mp4");
 
  # Find OpenCV version
  (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
 
  if int(major_ver) < 3 :
    fps = video.get(cv2.cv.CV_CAP_PROP_FPS)
    print "Frames per second using video.get(cv2.cv.CV_CAP_PROP_FPS): {0}".format(fps)
  else :
    fps = video.get(cv2.CAP_PROP_FPS)
    print "Frames per second using video.get(cv2.CAP_PROP_FPS) : {0}".format(fps)
 
  video.release();

将一个视频中的音频提取出来

from moviepy.editor import *

video = VideoFileClip('test.mp4')
audio = video.audio
audio.write_audiofile('test.wav')

将A.mp4的音频加到B.mp4

from moviepy.editor import VideoFileClip

origin_video = "A.mp4"
add_video = "B.mp4"

res_video = "res.mp4"

voice_video = VideoFileClip(origin_video)
audio = voice_video.audio

video = VideoFileClip(add_video)

new = video.set_audio(audio)
new.write_videofile(res_video)

将格式不同(mp4,avi)两个视频合成为一个avi(256,256*4),一个大小为(256,256*3),另一个大小为(256,256)

import cv2
import numpy as np
import imageio

# 将statue.avi 和 voice3.mp4 (两个格式不同的视频) 合并成 final3.avi
path = './results/final3.avi'
video1 = imageio.get_reader('./results/statue.avi')
video2 = imageio.get_reader('./results/voice3.mp4')

video1_L = []
for im in video1:
    video1_L.append(im)
video1.close

video2_L = []
for im in video2:
    video2_L.append(im)
video2.close

fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out1 = cv2.VideoWriter(path,fourcc,20,(256*4,256),True)

for frame1,frame2 in zip(video1_L ,video2_L):
    frame1 = cv2.cvtColor(frame1.astype('float32'), cv2.COLOR_BGR2RGB)    
    frame2 = cv2.cvtColor(frame2.astype('float32'), cv2.COLOR_BGR2RGB) 
    
    # 对于不同格式的视频 下面这个步骤至关重要
    frame1 = frame1.astype(np.uint8)
    frame2 = frame2.astype(np.uint8)
    
    image = np.concatenate((frame1,frame2),axis=1)
    out1.write(image)

将一个文件夹中的图片resize成(256,256),并把jpg转成png

import PIL.Image
import os

path = './data'

path_list = os.listdir(path)

for file in path_list:
    im = PIL.Image.open(os.path.join(path,file))
    im = im.resize((256,256))
    im.save(os.path.join(path,file[:-3]+'png'))
    os.remove(os.path.join(path,file))

将视频test.mp4进行裁切(比如:00:00:01-00:05:00)保存为crop.mp4(需要安装ffmpeg)

ffmpeg -i test.mp4 -ss 00:00:01 -to 00:05:00 -c:v copy -c:a copy crop.mp4

如果使用上面的命令出现黑视频的情况则使用下面的命令

ffmpeg -i test.mp4 -ss 00:00:01 -to 00:05:00 -strict -2 crop.mp4

将视频test.mp4每5s保存一次图片(fps=1时一秒1张图保存、fps=1/5=0.2时5秒一张图保存)

ffmpeg -i test.mp4 -vf fps=0.2 out%d.png

将视频进行旋转(需要安装moviepy)

from moviepy.editor import *
clip = VideoFileClip("result.mp4")
# clip = clip.rotate(-90) # 顺时针旋转90
clip = clip.rotate(90) # 逆时针旋转90
clip.write_videofile("res.mp4")  # save

获取视频的时长(按秒计算)

import subprocess

def get_length(filename):
    result = subprocess.run(["ffprobe", "-v", "error", "-show_entries",
                             "format=duration", "-of",
                             "default=noprint_wrappers=1:nokey=1", filename],
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT)
    return float(result.stdout)

print("minute:"+str(int(get_length("test.mp4")) // 60))
print("second:"+str(int(get_length("test.mp4")) % 60))

将视频转换成帧序列

import cv2
import numpy as np
import os

video = cv2.VideoCapture("test.mp4")
result_path = './save_result' # 保存的文件夹
success, frame = video.read()

i = 0
while success:
    cv2.imwrite(os.path.join(result_path,str(i)+'.png'),frame)
    i = i + 1
    success, frame = video.read()

从图片中提取人脸

from PIL import Image
import face_recognition

inputImg = "biden.jpg"

image = face_recognition.load_image_file(inputImg)
faces = face_recognition.face_locations(image)

for i in range(len(faces)):
    top, right, bottom, left = faces[i]

    faceImage = image[top:bottom, left:right]
    final = Image.fromarray(faceImage)
    final.save("img%s.png" % (str(i)), "PNG")

使用ffmpeg >1.1将本地的a.mp4与b.mp4合并成output.mp4(无损合并)

先创建一个文本文件filelist.txt,并且在文本文件中添加如下信息:

file 'a.mp4'
file 'b.mp4'

ffmpeg -f concat -i filelist.txt -c copy output.mp4

视频帧转视频

ffmpeg -f image2 -i /home/ttwang/images/image%d.jpg tt.mp4

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值