ffmpeg為視訊新增時間戳 - 手動編譯ffmpeg

leolztang發表於2016-12-24

FFMPEG給視訊加時間戳水印

專案中需要給視訊新增時間戳,理所當然最好用的辦法是ffmpeg。在找到正確的做法前,還被網上的答案timecode給水了一下(水的不輕,在這裡轉了2天),大概是這樣寫的:

ffmpeg -i wildlife.wmv -vf "drawtext=fontfile=arial.ttf: text='fuck': timecode='09\:57\:00\:00': r=25: \x=(w-tw)/1.5: y=h-(20*lh):fontcolor=white: box=1: boxcolor=0x00000000@1" -an -y out.wmv

 

轉了一大圈,最後找到了答案, 在Ubuntu14.04LTS下面的使用過程:

#安裝官方庫提供的版本,2.X的版本
sudo apt-get install ffmpeg

#新增時間戳的命令, 這串命令在實際應用中是用java生成的,然後使用process執行這個命令
ffmpeg -i "/input/input-video.mp4" -vf "drawtext=expansion=strftime:  basetime=$(date +%s -d '2016-12-19 16:27:50')000000 :text='%Y-%m-%d %H\\:%M\\:%S':fontsize=11:fontcolor=white:box=1:x=10:y=10:boxcolor=black@0.5:" -strict -2 -y "/output/output-video.mp4"

其中:

  -i: 指定輸入檔案,這裡使用的視訊編碼是H264, 音訊編碼是AAC

  -vf: 視訊濾鏡,使用了drawtext濾鏡,basetime是視訊時間戳的初始值,text是顯示時間的格式,fontsize後面一串是關於水印的顏色、字型、背景等設定

  -strict -2:AAC的解碼在2.x版本是試驗性功能,需要加這個引數

  -y: 覆蓋已經存在的輸出檔案

      最後一段是輸出檔案

問題來了:源視訊的引數變化卡死了FFMPEG程式

這樣相安無事的使用了一段時間,直到有一天發現伺服器上的FFMPEG卡在那不動了,CPU佔用率90%多。問了一下,錄製視訊的客戶端確實改了一些東西,主要是視訊位元速率和畫面大小,音訊引數沒有改。先看看是什麼導致卡死了,通過調整一些引數的方法,定位到了是音訊導致卡死的(音訊引數沒動過,所以沒法解釋清楚為什麼,只能猜是視訊的變化影響了音訊,反正MP4容器裡面的東西一竅不通)。

ffmpeg -i "/input/input-video.mp4" -vf "drawtext=expansion=strftime:  basetime=$(date +%s -d '2016-12-19 16:27:50')000000 :text='%Y-%m-%d %H\\:%M\\:%S':fontsize=11:fontcolor=white:box=1:x=10:y=10:boxcolor=black@0.5:"-an -y "/output/output-video.mp4"

和原始命令不同的地方就是-strict -2換成了-an, -an表示不處理音訊。這個時候視訊又能正確的被處理了(只是沒有聲音)。問題是找到了,找來找去也沒找到解決辦法。

沒招了,升級版本試試

先去Ubuntu16.04的系統上試了試,使用系統倉庫的版本是2.8,也有同樣的問題。

去官網看了看,官網都3.2了。果斷去找3.2的版本,在官網找了Ubuntu14的PPA版本,按照他們的步驟裝好了一試,報錯:大概意思就是drawtext過濾器不存在,刪了一些引數,發現aac的解碼器也沒有。大致的意思就是有一些依賴庫沒有自動裝。看了看沒找到怎麼裝,也不知道具體依賴庫有哪些,放棄。

沒辦法了,只能試試手動編譯了

#安裝文件的步驟刪了一些不要的庫
sudo apt-get update
sudo apt-get -y install autoconf automake build-essential libass-dev libfreetype6-dev \
  libsdl1.2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev \
  libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev

#要h264的庫
sudo apt-get install libx264-dev

#要aac的庫
sudo apt-get install libfdk-aac-dev

#configure,編譯目的路徑也懶得改了,最好還是改了,不然到時候ffmpeg安裝到了~/bin目錄下
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
  --prefix="$HOME/ffmpeg_build" \
  --pkg-config-flags="--static" \
  --extra-cflags="-I$HOME/ffmpeg_build/include" \
  --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
  --bindir="$HOME/bin" \
  --enable-gpl \
  --enable-libass \
  --enable-libfdk-aac \
  --enable-libfreetype \
  --enable-libtheora \
  --enable-libvorbis \
  --enable-libx264 \
  --enable-nonfree

PATH="$HOME/bin:$PATH" make

make install

make distclean

#更新一下profile,ffmpeg加入到了PATH
source ~/.profile

重新執行了一下加水印的命令,ffmpeg又能正常工作了。

完整編譯過程:http://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#CompilationInstallation

 

相關文章