視訊幀數(圖片)提取及儲存方法---ffmpeg
阿新 • • 發佈:2018-12-07
視訊幀數(圖片)提取及儲存方法—ffmpeg
環境:Ubuntu16.04、Python3.5、anaconda3
任務需要,要從視訊裡提取一定幀數的圖片,查了不少方法,也試了不少方法,很多都不可行,也又可能是配置的問題,沒細究,下面把親測可行的拿出來分享,配上關鍵操作的輸出效果:
用的是一個Python的工具—ffmpeg
,非常強大,不僅可以提取視訊裡一定幀數的圖片,也可以提取特定幀數的圖片,也可以轉換視訊的格式。
先說一下安裝方法:
- 先說明,我是在anaconda裡搭建的環境,所以有些依賴項可能需要根據自己的環境去配置
conda install imageio scikit-image
- 在terminal裡進入Python
python
import imageio
imageio.plugins.ffmpeg.download()
之後就會開始下載,下載完就ok了
說一下兩個測試可行的方法:
method 1:
import pylab import imageio import skimage import numpy as np filename='/home/will/Videos/level_1.mp4' vid=imageio.get_reader(filename, 'ffmpeg') for num,im in enumerate(vid): #print im.mean() image = skimage.img_as_float(im).astype(np.float64) fig = pylab.figure() fig.suptitle('image #{}'.format(num), fontsize=20) pylab.imshow(im) pylab.show()
上面測試的視訊是之前錄的RL的demo,根據自己視訊的儲存路徑修改即可,注意是絕對路徑
method 2
這個方法就簡單了,直接使用ffmpeg
工具,這裡以一個叫testvideo.avi
的視訊做測試
ffmpeg -i testvideo.avi -vf select='eq(pict_type\,I)' -vsync 2 -f image2 frame-%03d.jpg -hide_banner
其實還可以設定很多引數的,但是我也一下子找不到太多,所以也希望有大神知道的,可以分享一下這部分,我把我知道的分享一下:
-i
:後面的視訊的名字也是路徑,這個引數一定要放在最前面
-f
-s
:解析度,如-s 160×90
則將圖片的解析度統一設定成160×90-vsync
:阻止每個關鍵幀產生多餘的拷貝,其實只有兩個值可以輸入,1或2-vf
:表示過濾圖形的描述,選擇過濾器select會選擇幀進行輸出:包括過濾器常量eq(pict_type\,I)
:PICT_TYPE_I 表示是I幀,即關鍵幀,如果I幀,7秒視訊輸出201個圖片,換成2,7秒視訊輸出101個圖片。-vframes
:指抽取的幀數-ss
:指起始時間-t
:持續時間,單位是秒-r
:指抽取的幀率,即從視訊每秒鐘抽取圖片的數量,1即每秒抽取一幀
放下效果圖:
圖片的儲存路徑預設當前所在的路徑
7秒的視訊,生成了201張圖片
加個題外話,ffmpeg
轉換視訊格式命令:
ffmpeg -i input.mp4 output.avi
用ffmpeg按每秒8幀進行解幀,命令如下:
ffmpeg -i ${path} -vf fps=fps=8/1 -q 0 $IMGFOLDER/%06d.jpg