Ununtu16.04系統下編譯安裝ffmpeg、抽幀和計算圖片時間點

ffmpeg是開源的、功能強大的視頻、音頻、圖像處理工具,在最近的工作中,需要從視頻中抽取圖像,並準確計算每張圖片對應在視頻播放中的時間點。在網上找了一圈發現,所有的參考資料基本分爲兩種:

1、通過c語言調用ffmpeg進行抽幀,無奈技術太渣,此路不通

2、通過ffmpeg命令進行抽幀,這種方式無論抽取關鍵幀還是按照時間間隔(隔 N 秒抽一幀)抽幀都很方便,速度也快

但是找了一圈就是沒有如何計算圖像在視頻中時間點的方法,今天在此對於如何使用ffmpeg命令抽幀(關鍵幀、時間間隔抽幀),以及如何計算圖片時間點做一個詳細的總結。


  • 安裝ffmpeg

抽幀第一步,安裝ffmpeg。下面介紹在Ununtu 16.04系統上快速安裝ffmpeg工具的方法:

1、下載 yasm-1.3.0.tar.gz 和 ffmpeg-4.0.2.tar.bz2 壓縮包,下載地址 https://download.csdn.net/download/cxx654/10762083

2、在壓縮包的同一目錄下創建 install_ffmpeg.sh 腳本文件,腳本功能是解壓壓縮包並進行編譯安裝,腳本執行約15分鐘,執行完成後使用 ffmpeg -version 檢查是否安裝成功

  1.     #!/bin/bash
    
    	current_path=$(`dirname $0`;pwd)
    	cd $current_path
    
    	# install yasm
    	tar xvf yasm-1.3.0.tar.gz
    	cd yasm-1.3.0
    	./configure && make && make install
    
    	# install ffmpeg
    	cd ..
    	tar jxvf ffmpeg-4.0.2.tar.bz2
    	cd ffmpeg-4.0.2
    	./configure --prefix=/usr/local/ffmpeg
    	make && make install
    
    	# 添加環境變量
    	sed -i '$a PATH=$PATH:/usr/local/ffmpeg/bin' ~/.bashrc
    	sed -i '$a export PATH' ~/.bashrc
    
    	source ~/.bashrc   # 設置生效
    	# ffmpeg -version     # 查看版本

     


  • 抽取關鍵幀和時間點計算

1、關鍵幀抽幀命令:ffmpeg -i xxx.mp4 -vf select="eq(pict_type\,PICT_TYPE_I)" -vsync 2 image/%09d.jpg -loglevel debug 2>&1 | grep -i "pict_type:I" | awk -F" " '{print $6}'| awk -F":" '{print $2}' > image/temp.txt (備註:抽取視頻xxx.mp4的關鍵幀放在當前目錄的image文件夾中,圖片編號長度爲9位數字, -loglevel debug設置是輸出抽幀日誌,並過濾pict_type:I關鍵幀信息保存到image目錄的temp.txt 文件中)

2、經過步驟1處理後,image目錄下保存有抽幀的結果圖片,並且temp.txt文件中保存每個圖像對應的時間點,一一對應,內容如下:

            240.000000
            241.600000
            244.000000
            246.400000
            nan
            251.200000
            253.240000
            255.000000
            257.160000

3、由於ffmpeg日誌打印存在問題,導致temp.txt文件中丟失了部分時間點(如上述的nan),約佔總數的1%,對於這個問題暫時沒找到解決方法,可以採用上一幀的時間點代替


  • 時間間隔抽幀和時間點計算

    方法一:

1、按照時間間隔抽幀命令:ffmpeg -i xxx.mp4 -vf fps=1/4 image/%09d.jpg,使用該命令對xxx.mp4文件抽幀,抽幀間隔爲4秒,如果想每秒抽取多幀,可以使用命令:ffmpeg -i xxx.mp4 -vf fps=2 image/%09d.jpg(每秒抽2幀)

2、抽幀時間點計算

對於按照時間間隔抽幀的時間點計算,直觀上理解通過圖片 編號 * 時間間隔 就可以計算,但是實踐發現,ffmpeg按照時間間隔抽幀,抽取的第一張圖片對應的時間與抽幀間隔有關,總結規律如下:

                process_offset = {
                    "1" : 0, "2" : 0,
                    "3" : 1, "4" : 1,
                    "5" : 2, "6" : 2,
                    "7" : 3, "8" : 3,
                    "9" : 4, "10" : 4
                }

即:當抽幀間隔爲1秒、2秒時,第一張圖片對應的時間點爲第0秒;當抽幀間隔爲3秒、4秒時,第一張圖片對應的時間點位第1秒;依次類推。因此,在上述第一張圖片存在時間偏移的基礎上,計算每張圖片的時間點公式如下:
            seconds = (image_count - 1) * SPEED + process_offset[SPEED],其中SPEED爲抽幀速度,image_count爲圖片編號(從1開始)

    方法二:

1、獲取視頻的time_base
        ffprobe -v quiet -show_streams -select_streams v -i xxx.mp4 | grep time_base= | grep time_base | grep -v codec | awk -F"/" '{print $2}'

2、按照時間間隔抽幀,並獲取每張圖片的pts時間
        ffmpeg -i xxx.mp4 -f image2 -vf fps=fps=1/4 image/%09d.jpg -loglevel debug 2>&1 | grep 'Read frame with' | grep -v 'out pts 0' | grep -v 'd=' | awk -F" " '{print $9}' | sort -t ',' -k 2,2 -u | awk -F"," '{print $1}' > temp.txt

3、計算圖片時間點(秒)

使用第二步產生的每個pts值除以第一步得到的 time_base,就是每張圖片對應的時間點

參考:https://blog.csdn.net/qingyuanluofeng/article/details/45397811

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章