1. 程式人生 > >視訊幀數(圖片)提取及儲存方法---ffmpeg

視訊幀數(圖片)提取及儲存方法---ffmpeg

視訊幀數(圖片)提取及儲存方法—ffmpeg

環境:Ubuntu16.04、Python3.5、anaconda3
任務需要,要從視訊裡提取一定幀數的圖片,查了不少方法,也試了不少方法,很多都不可行,也又可能是配置的問題,沒細究,下面把親測可行的拿出來分享,配上關鍵操作的輸出效果:

用的是一個Python的工具—ffmpeg,非常強大,不僅可以提取視訊裡一定幀數的圖片,也可以提取特定幀數的圖片,也可以轉換視訊的格式。

先說一下安裝方法:

  1. 先說明,我是在anaconda裡搭建的環境,所以有些依賴項可能需要根據自己的環境去配置
conda install imageio scikit-image
  1. 在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()

test1
上面測試的視訊是之前錄的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即每秒抽取一幀

放下效果圖:
圖片的儲存路徑預設當前所在的路徑
227秒的視訊,生成了201張圖片


加個題外話,ffmpeg轉換視訊格式命令:

ffmpeg -i input.mp4 output.avi

用ffmpeg按每秒8幀進行解幀,命令如下:

ffmpeg -i ${path} -vf fps=fps=8/1 -q 0 $IMGFOLDER/%06d.jpg