Python使用PyAV提取視頻關(guān)鍵幀的實踐
1.軟件環(huán)境??
Windows10教育版64位Python3.6.3PyAV8.0.3
2.問題描述??
在提取視頻文件的關(guān)鍵內(nèi)容時,手動查看會非常耗時。即使你快進視頻,一個小時的視頻也需要超過10分鐘;通常,一秒鐘的視頻包含24幀圖像。如果你能捕獲視頻中的關(guān)鍵幀(key frame,你可以把它理解成論文里面的摘要,看完關(guān)鍵幀就知道這個視頻主要在講什么了),尤其是在長時間拍攝類似鏡頭的場景中,對圖像進行重復(fù)數(shù)據(jù)消除將有助于過濾掉大多數(shù)噪聲幀,并最大程度地提取視頻的核心內(nèi)容。
隨著短視頻越來越流行,視頻的內(nèi)容分析與文本的內(nèi)容分析一樣重要。然而,如果每個分析師都想看每一段視頻,那就需要太多時間。即使使用快進功能,節(jié)省的時間仍然不夠。此外,由于人為疏忽,內(nèi)容分析會出現(xiàn)錯誤和遺漏。相較于基于文本的內(nèi)容分析,會發(fā)現(xiàn)一個主要的區(qū)別:查看文本內(nèi)容可以一目十行,并且沒有強制的前后時間線。相反,觀看流媒體必須消耗流媒體的長度。然后我們會有一個問題:我們能一目了然地看到流媒體嗎?事實上,視頻流中的大量信息是冗余的,并且信息量非常低。信息量僅集中在一個關(guān)鍵幀(也稱為信息幀或I幀)圖片中。如果你把這些圖片一張一張地放在面前,你也可以做到像文本內(nèi)容一樣一目十行,減少人為疏忽。
關(guān)于視頻的相關(guān)概念可以看一下這個博客:
音視頻pts、dts基本概念及理解
那么有沒有什么方法能夠高效的提取視頻的關(guān)鍵幀呢
3.解決方法??
當然有啦,這就是我們今天的主角——PyAV:

PyAV 是 FFmpeg 的Pythonic 綁定,其目標是提供FFmpeg 底層庫的所有功能。 PyAV 通過容器、流、數(shù)據(jù)包、編解碼器和幀直接和精確地訪問視頻媒體。同時,它能夠方便的和其他庫進行對接,并幫助您從其他包(例如 Numpy 和 Pillow)獲取和修改數(shù)據(jù),提取視頻關(guān)鍵幀就更不在話下了!
不廢話了,直接上代碼:
'''
===========================================
@author: jayce
@file: extract_video_keyframes_av.py
@time: 2022/4/11 21:42
===========================================
'''
import av
import os
import shutil
path_to_video = r'E:\Code\Python\extract_video_keyframes\test video.mp4'
output_dir = r'E:\Code\Python\extract_video_keyframes\pyav'
# # 提取全部幀
# container = av.open(path_to_video)
#
# for frame in container.decode(video=0):
# frame.to_image().save(r'E:\Code\Python\比例尺鑒定\20220410比例尺鑒定\extract_video_keyframes\pyav\frame-%04d.png' % frame.index)
def extract_video_keyframes(path_to_video, output_dir):
try:
os.makedirs(output_dir, exist_ok=True)
# 提取關(guān)鍵幀
with av.open(path_to_video) as container:
# 表示我們只想查看關(guān)鍵幀
stream = container.streams.video[0]
stream.codec_context.skip_frame = 'NONKEY'
for frame in container.decode(stream):
print(frame)
# 使用frame.pts的原因是frame.index對skip_frame沒有意義,因為關(guān)鍵幀是從所有的幀中抽取中獨立的圖像,而pts顯示的就是這些獨立圖像的index;
# DTS(Decoding Time Stamp):即解碼時間戳,這個時間戳的意義在于告訴播放器該在什么時候解碼這一幀的數(shù)據(jù)。
# PTS(Presentation Time Stamp):即顯示時間戳,這個時間戳用來告訴播放器該在什么時候顯示這一幀的數(shù)據(jù)。
frame.to_image().save(os.path.join(output_dir, 'temporary-image-{:04d}.png'.format(frame.pts)))
except Exception as e:
print('Program error occurred:{}'.format(repr(e)))
if __name__ == "__main__":
extract_video_keyframes(path_to_video, output_dir)
# shutil.rmtree(output_dir)
4.結(jié)果預(yù)覽

到此這篇關(guān)于Python使用PyAV提取視頻關(guān)鍵幀的實踐的文章就介紹到這了,更多相關(guān)Python PyAV提取視頻關(guān)鍵幀 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python實現(xiàn)定時自動給微信好友發(fā)送天氣預(yù)報
這篇文章主要介紹了基于Python實現(xiàn)定時自動給微信好友發(fā)送天氣預(yù)報的實現(xiàn)代碼,,需要的朋友可以參考下2018-10-10
python深度學習TensorFlow神經(jīng)網(wǎng)絡(luò)模型的保存和讀取
這篇文章主要為大家介紹了python深度學習TensorFlow神經(jīng)網(wǎng)絡(luò)如何將訓練得到的模型保存下來方便下次直接使用。為了讓訓練結(jié)果可以復(fù)用,需要將訓練好的神經(jīng)網(wǎng)絡(luò)模型持久化2021-11-11
Python函數(shù)的參數(shù)常見分類與用法實例詳解
這篇文章主要介紹了Python函數(shù)的參數(shù)常見分類與用法,結(jié)合實例形式較為詳細的分析了Python函數(shù)的形參、實參、默認參數(shù)、可變參數(shù)等概念、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下2019-03-03
Python繪圖實現(xiàn)坐標軸共享與復(fù)用詳解
這篇文章主要為大家詳細介紹了Python在繪圖時如何實現(xiàn)坐標軸共享與復(fù)用,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-02-02
Python使用Selenium、PhantomJS爬取動態(tài)渲染頁面
本文主要介紹了Python使用Selenium、PhantomJS爬取動態(tài)渲染頁面,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05

