目录
2、视频中的 FPS,即:每秒传输帧数(Frames Per Second))
1、计算视频总帧数
ffmpeg
$ffmpeg -i test.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1
opencv
import os
import cv2
video_cap = cv2.VideoCapture('ffmpeg_test.avi')
frame_count = 0
all_frames = []
while(True):
ret, frame = video_cap.read()
if ret is False:
break
all_frames.append(frame)
frame_count = frame_count + 1
# The value below are both the number of frames
print frame_count
print len(all_frames)
2、视频中的 FPS,即:每秒传输帧数(Frames Per Second))
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();
还有 fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频的帧率。具体用法可以看“视频按帧保存成图片”部分的注释。
3、视频按帧保存成图片
import numpy as np
import cv2
import os
"""
读取单个视频并按帧进行保存
"""
def video2image(video_dir, save_dir):
cap = cv2.VideoCapture(video_dir) # 生成读取视频对象
n = 1 # 计数
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频的宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频的高度
fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频的帧率
fourcc = int(cap.get(cv2.CAP_PROP_FOURCC)) # 视频的编码
# 定义视频输出
# writer = cv2.VideoWriter("teswellvideo_02_result.mp4", fourcc, fps, (width, height))
i = 0
timeF = int(fps) # 视频帧计数间隔频率
while cap.isOpened():
ret, frame = cap.read() # 按帧读取视频
# 到视频结尾时终止
if ret is False:
break
# 每隔timeF帧进行存储操作
if (n % timeF == 0):
i += 1
# print("保存第 {} 张图像".format(i))
save_image_dir = os.path.join(save_dir, "{}.jpg".format(i))
print("save_image_dir: ", save_image_dir)
cv2.imwrite(save_image_dir, frame) # 保存视频帧图像
n = n + 1
cv2.waitKey(1) # 延时1ms
cap.release() # 释放视频对象
"""
读取文件夹所有视频,每个视频按帧保存图像
"""
def video2image_multi(video_path, save_path):
video_list = os.listdir(video_path)
for i in range(len(video_list)):
video_dir = os.path.join(video_path, video_list[i])
cap = cv2.VideoCapture(video_dir)
fps = cap.get(cv2.CAP_PROP_FPS) # 视频的帧率
save_num = 0
n = 1 # 计数
timeF = int(fps) # 视频帧计数间隔频率
while cap.isOpened():
ret, frame = cap.read()
if ret is False:
break
# 每隔timeF帧进行存储操作
if (n % timeF == 0):
save_num += 1
save_image_dir = os.path.join(save_path, "{}_{}.jpg".format(i,save_num))
cv2.imwrite(save_image_dir, frame)
n = n + 1
cv2.waitKey(1)
cap.release()
print("读取第 {} 个视频完成 !!!".format(i))
if __name__ == "__main__":
path = r"F:\Data\video\shake-video\0073YC.avi"
dst_path = r"F:\Data\video\shake-video\shake_frames\0073YC"
for p in os.listdir(path):
src = os.path.join(path,p)
if os.path.isfile(src):
name = p.split('.')[0]
dst = os.path.join(dst_path, name)
if not os.path.exists(dst):
os.mkdir(dst)
video2image(src, dst)
4、按帧合成视频
一般视频的帧率为24,帧率越大,视频越流畅。
import cv2
import os
import numpy as np
from PIL import Image
from tqdm import tqdm
def frame2video(im_dir, video_dir, fps):
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.cv.CV_FOURCC('M','J','P','G') #opencv版本是2
# fourcc = cv2.VideoWriter_fourcc(*'XVID') # opencv版本是3
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
videoWriter = cv2.VideoWriter(video_dir, fourcc, fps, img_size)
# count = 1
print(video_dir)
for i in tqdm(im_list):
# print(i)
im_name = os.path.join(im_dir, i)
frame = cv2.imdecode(np.fromfile(im_name, dtype=np.uint8), -1)
videoWriter.write(frame)
# count+=1
# if (count == 200):
# print(im_name)
# break
videoWriter.release()
print('finish')
if __name__ == '__main__':
im_dir = r"F:\Data\video\kitty" # 帧存放路径
video_dir = r"F:\Data\video\kitty.mp4" # 合成视频存放的路径
fps = 24 # 帧率,每秒钟帧数越多,所显示的动作就会越流畅
frame2video(im_dir, video_dir, fps)
其中,fourcc = cv2.VideoWriter_fourcc(*"mp4v"),合成的视频保存为mp4格式。
5、视频按照 指定时间/ 指定帧率 保存成图片
6、不使用ffmpeg获取视频时长/ 大小
参考: