抖音時(shí)光倒流原理
抖音的時(shí)光倒流原理赖钞,應(yīng)該來(lái)說(shuō)最好理解,也就是將視頻倒放宋欺。如果你是掌握PR或者AE的用戶(hù)轰豆,那么視頻倒放肯定手到擒來(lái)。但是齿诞,今天我們要做的是使用OpenCV程序?qū)崿F(xiàn)視頻的倒放效果(當(dāng)然PR與AE底層實(shí)現(xiàn)的效果就是這段代碼原理)酸休。
下面,我們來(lái)一步步掌握視頻的整體倒放祷杈,以及部分倒放的操作代碼斑司。
實(shí)現(xiàn)視頻整體倒放
先要了解時(shí)光倒流的具體實(shí)現(xiàn),我們不妨先實(shí)現(xiàn)一個(gè)簡(jiǎn)單的整體倒放但汞。對(duì)于整體倒放來(lái)說(shuō)宿刮,相對(duì)比部分倒放簡(jiǎn)單,只需要讀取視頻私蕾,然后把每一幀保存僵缺,然后倒著遍歷寫(xiě)入視頻文件保存即可。
具體代碼如下所示:
#視頻整體倒放
def video_Inverted(videoFileName,outputFileName):
cap = cv2.VideoCapture(videoFileName)
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
videoWriter = cv2.VideoWriter(outputFileName+".avi", fourcc, fps, (width, height))
frame_list = []
while (cap.isOpened()):
ret, frame = cap.read()
if ret:
frame_list.append(frame)
c = cv2.waitKey(1)
if c == 27:
break
else:
break
for frame in frame_list[::-1]:
videoWriter.write(frame)
cap.release()
videoWriter.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
video_Inverted("45.mp4","output")
運(yùn)行之后踩叭,我們的視頻就會(huì)倒放磕潮,效果如下:
1.gif
實(shí)現(xiàn)視頻部分倒放
視頻的部分倒放在抖音以及影視作品中也非常的常見(jiàn),比如影視中慣用的回憶容贝,然后加快進(jìn)度等都有倒放的影子自脯。那么如何實(shí)現(xiàn)視頻的中間部分倒放呢?
答案很簡(jiǎn)單斤富,我們分為如下2個(gè)步驟:
- 首先設(shè)置需要倒放視頻的幀數(shù)起點(diǎn)與終點(diǎn)
- 然后設(shè)置三個(gè)列表膏潮,一個(gè)保存不需要倒放的倒放前的幀數(shù)圖像,一個(gè)保存倒放的幀數(shù)圖像满力,一個(gè)保存不需要倒放的倒放后那段幀數(shù)圖像戏罢。
- 最后屋谭,拼接倒放前的圖像,倒放的圖像龟糕,倒放后的圖像桐磁。這樣就完成了視頻里面部分視頻的倒放。
下面讲岁,我們將上面的步驟轉(zhuǎn)換為代碼我擂,具體如下:
# 視頻的部分倒放
def video_part_Inverted(videoFileName, outputFileName):
cap = cv2.VideoCapture(videoFileName)
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
videoWriter = cv2.VideoWriter(outputFileName + ".avi", fourcc, fps, (width, height))
frame_list_start = [] # 倒放前圖像列表
frame_list_end = [] # 倒放后圖像列表
inverted_list = [] # 需要倒放的圖像列表
fps_start = 66# 倒放起始幀
fps_end = 150# 倒放結(jié)束幀
i = 0
while (cap.isOpened()):
ret, frame = cap.read()
if ret:
if i >= fps_start and i <= fps_end:
inverted_list.append(frame)
elif i < fps_start:
frame_list_start.append(frame)
elif i > fps_end:
frame_list_end.append(frame)
i += 1
c = cv2.waitKey(1)
if c == 27:
break
else:
break
for frame in frame_list_start:
videoWriter.write(frame)
for frame in inverted_list[::-1]:
videoWriter.write(frame)
for frame in frame_list_end:
videoWriter.write(frame)
cap.release()
videoWriter.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
video_part_Inverted("45.mp4", "output1")
原理已經(jīng)講清楚了,相信這段代碼很好理解缓艳,這里就不在贅述校摩,也不放運(yùn)行后的圖像。感興趣的讀者阶淘,可以自己找一段視頻測(cè)試衙吩。