直接上代碼
"""視頻轉圖片"""
port cv2
def getphoto(video_in, video_save):
cap = cv2.VideoCapture(video_in) # 打開視頻文件
n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 視頻的幀數
fps = cap.get(cv2.CAP_PROP_FPS) # 視頻的幀率
dur = n_frames / fps # 視頻的時間
num_frame = 0
judge = cap.isOpened()
while judge:
flag, frame = cap.read() # flag是讀取狀態,frame下一幀
cv2.imshow('video', frame) # capture
if cv2.waitKey(0) == 27:
break
if flag:
num_frame += 1
# print("正在保存第%d張照片" % num_frame)
# cv2.imwrite('a\\' + str(num_frame) + '.jpg', frame) # cv2.imwrite(‘路徑’ + ‘名字’ + ‘后綴’, 要存的幀)
# cv2.waitKey(1)
# # new_path = str(num_frame) + '.jpg'
# # cv2.imencode('.jpg', frame)[1].tofile(new_path)
else:
break
print("視頻時長: %d 秒" % dur)
print("視頻共有幀數: %d 保存幀數為: %d" % (n_frames, num_frame))
print("每秒的幀數(FPS): %.1lf" % fps)
def main():
video_in = 'apple.flv'
video_save = '2th'
getphoto(video_in, video_save)
if __name__ == '__main__':
main()
"""圖片轉視頻"""
import cv2
import os
def getvideo(photo_path, video_name, fps):
filelist = os.listdir(photo_path)
size = (1440, 1080)
video = cv2.VideoWriter(video_name, cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
num = int(0)
for item in filelist:
# print(item)
num += 1
print('轉化到%d張' % num)
if item.endswith('.jpg'):
item = photo_path + item
img = cv2.imread(item)
video.write(img)
video.release()
cv2.destroyAllWindows()
def main():
photo_path = 'E:\\try apple\\aa\\'
video_name = 'new.avi'
fps = 30
getvideo(photo_path, video_name, fps)
if __name__ == '__main__':
main()
我想說的惡心的地方是:圖片轉視頻時,一定不要把圖片的像素大小弄錯,我為此白白從凌晨到凌晨2點找bug,各種百度。
還有就是 filelist = os.listdir(photo_path) 這個東西輸出后發現不是按照文件名的字典序,像是個二維數組,但是奇怪的是明明不是順序讀取圖片的,但是合成后的視頻竟然是正確的。但是如果你的圖片種有一些一樣的圖片,合成的視頻就會總是閃你那個一樣的圖片。
我試了下500張圖片,錢50張是開場全是黑屏,合成的視頻沒有開場,但是總是閃黑屏,把這50張照片刪了之后就好了。