最近在公司作一些視頻處理的task,遇到了一個需求,是把MP4視頻裏的音頻提取成AAC格式。html
當時的第一感受就是很簡單,直接使用ffmpeg -i source.mp4 -vn -acodec copy sound.aac
就好。android
可是發現這樣是有問題的,其最終AAC的duration
和MP4的duration
徹底不同。如圖:git
網上的方法也都試了,可是都沒法解決這個問題。github
後來通過測試,發現不一樣的比特率(bit rate),最終的生成的AAC Duration是不同的。web
可是我怎麼知道這個比特率的值是多少呢?因此我從頭縷了一下。ubuntu
首先MP4的視頻文件咱們是從Webm格式轉過來的,而Webm視頻咱們又是基於MediaRecorder來的。bash
我又從新看了一下MediaRecorder API
,發現其中有這樣的屬性:curl
audioBitsPerSecond
: 指定音頻的比特率OK找到了,改了代碼,對MediaRecorder
接口增了audioBitsPerSecond
屬性,值設置了128000
,也就是128K
gitlab
而後使用下面的命令轉化下,看看結果:測試
ffmpeg -i source.mp4 -vn -acodec aac -b:a 128k -y sound.aac
複製代碼
發現狀況並無獲得改善...
後來想了一下,會不會是由於雖然使用了恆定比特率,可是仍是會有必定的浮動,因而我把128k
改成200k
嘗試下:
不只沒解決,反而又增長了duration
在接近放棄的時候,rurico提供了一個思路,讓我嘗試下libfdk_aac
編碼器。因而通過從新編譯FFmpeg來安裝libfdk_aac
編碼器(FFmpeg安裝額外編碼器須要從新編譯)。
成功了...
可是這只是在MAC上成功,我須要讓其在Ubuntu
上跑起來,可是一想到,在Ubuntu Docker
上編譯整個FFmpeg
就頭皮發麻。(我花了4個小時的時間去嘗試在Ubuntu上編譯帶有libfdk_aac的FFmpeg,最終失敗了結。)
下班回家後吃完飯後,又在網上從新查了下ubuntu build ffmpeg
,發現了靜態編譯
的字樣。茅塞頓開
因而在網上搜了下有沒有現成的靜態編譯好的FFmpeg,發現有是有,可是由於libfdk_aac的LICENSE規定,廣泛都沒有把libfdk_aac編譯進去。
因而在github上找到一個開源的FFmpeg靜態編譯項目:ffmpeg-static
通過測試發現沒問題,可是由於在國內,每次下載、安裝、編譯都很慢,因而想到gitlab有免費的runner
可使用。因而在gitlab建了一個項目,用於自動編譯。
只須要在項目里加上.gitlab-ci.yml
就好:
image: ubuntu:18.04
stages:
- build
build-ubuntu:
stage: build
script:
- apt-get update
- apt-get install -yq bzip2 xz-utils perl tar wget git bc
- apt-get install -yq autoconf automake build-essential cmake curl frei0r-plugins-dev gawk libfontconfig-dev libfreetype6-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl2-dev libspeex-dev libtheora-dev libtool libva-dev libvdpau-dev libvo-amrwbenc-dev libvorbis-dev libwebp-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev libxvidcore-dev lsb-release pkg-config texi2html yasm
- git clone https://github.com/BlackHole1/ffmpeg-static
- cd ffmpeg-static
- chmod 777 *
- ./build-ubuntu.sh -B
artifacts:
name: build
paths:
- ./ffmpeg-static/bin/*
複製代碼
而後push到gitlab,自動觸發ci。半個小時後,獲得結果:
gitlab project: gitlab.com/BlackHole1/…