音視頻命令轉(zhuǎn)換工具 - FFmpeg

隨著自媒體興起黎炉,許多人會(huì)自拍視頻或者找視頻素材裁剪膜钓,配上背景音樂或解說嗽交,加上各種特效邊框,處理后再生成新的視頻文件颂斜,發(fā)布到各大平臺(tái)夫壁。生成的原始視頻文件都很大,我們需要轉(zhuǎn)換格式或者壓縮大小沃疮,便于上傳或者在其他如手機(jī)等設(shè)備上分享盒让。

FFmpeg 介紹

FFmpeg是一款開源免費(fèi)的多媒體視頻處理工具,功能包括視頻采集功能司蔬、視頻格式轉(zhuǎn)換糯彬、視頻抓圖、給視頻加水印等葱她。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案似扔。

FFmpeg項(xiàng)目在開源界的影響力也是數(shù)一數(shù)二的吨些。幾乎你所見到的視頻轉(zhuǎn)換軟件或播放器中用到的功能或編碼/解碼都基于FFmpeg。它采用LGPL或GPL許可證炒辉,曾今國內(nèi)某些知名播放器使用FFmpeg源碼未聲明豪墅,被FFmpeg釘在歷史的恥辱柱上。

FFmpeg 安裝

FFmpeg提供源碼黔寇,可自行編譯偶器。幾乎所有發(fā)行版Linux倉庫中已有FFmpeg,可以直接安裝缝裤。

# debian/ubuntu
apt install ffmpeg

# redhat/centos/fedora'
yum install ffmpeg
或
dnf install ffmpeg

FFmpeg官方也提供二進(jìn)制包:ffmpeg.org/download.html

推薦使用FFmpeg官方static二進(jìn)制包屏轰,無需額外動(dòng)態(tài)庫,僅一個(gè)可執(zhí)行文件官網(wǎng)下載后的FFmpeg解壓后有三個(gè)可執(zhí)行文件:ffmpeg憋飞、ffprobe霎苗、ffplay。

FFmpeg 使用

官網(wǎng)下載后的FFmpeg解壓后有三個(gè)可執(zhí)行文件:

  • ffmpeg:音視頻文件處理轉(zhuǎn)換

  • ffprobe:讀取視頻文件信息

  • ffplay:一個(gè)簡易的播放器


ffmpeg命令:

ffmpeg -i video.wma ./video.mp4

把 video.wma 視頻文件轉(zhuǎn)換成 mp4 格式榛做。ffmpeg mp4 格式默認(rèn)使用h264編碼

ffmpeg -i video.wma -c:v libx265 video.mp4

把 video.wma 視頻文件轉(zhuǎn)換成 h265 編碼的 mp4 格式唁盏。

h265比h264編碼有更高的壓縮率,在低碼率下生成的文件更小检眯。
也就是說厘擂,相同質(zhì)量下的h265編碼比h264更清晰。相同大小的視頻文件锰瘸,h265編碼比h264編碼的視頻文件體積更小刽严。但是當(dāng)視頻碼率到達(dá)一定大小時(shí),兩者清晰度區(qū)別不大避凝。
h264比h265有更好的兼容性港庄,有些手機(jī)默認(rèn)不支持h265編碼的視頻文件倔既,需要借助軟件解碼。
視頻轉(zhuǎn)換鹏氧,h265編碼比h264編碼用時(shí)會(huì)更長渤涌,更消耗CPU資源。

ffmpeg -i video.mp4 -s 1280x720 video2.mp4

將視頻壓縮到1280x720分辨率把还。

ffmpeg -i video.mp4 -ss 00:00:10 -i video.mp4 -t 00:00:30 -c:v copy -c:a copy cut.mp4

不改變視頻和音頻的編碼截剪視頻实蓬,保留從視頻10秒之后開始30秒,因?yàn)橐纛l視頻編碼指定參數(shù)值copy吊履,不會(huì)影響視頻質(zhì)量安皱。

使用ss參數(shù)一定要在-i之前,如果寫在-i之后艇炎,ffmpeg會(huì)理解為起始點(diǎn)是作用于輸出文件酌伊。

ffmpeg -i video.mp4 -metadata:s:v rotate="90" -c:v copy -c:a copy out.mp4

不改變視頻和音頻的質(zhì)量將視頻翻轉(zhuǎn)90度。把橫屏變豎屏缀踪。

ffmpeg -f x11grab -r 30 -i :0.0 -f alsa -i hw:0,0 -acodec aac -vcodec libx264 out.mkv

使用FFmpeg錄像居砖,該命令在Linux上有效。每秒30幀驴娃,音頻格式使用 aac奏候,視頻格式使用h264,輸出mkv格式唇敞。

vcodec 與 c:v 參數(shù)一樣蔗草,指定視頻編碼,如:libx264疆柔,libx265
acodec 與 c:a 參數(shù)一樣咒精,指定音頻編碼,如:aac旷档,mp4狠轻,flac

FFmpeg還有很多其他用法,比如調(diào)整碼率彬犯,幀數(shù)等向楼。使用 ffmpeg --help 可以看到全部參數(shù)說明。

GPU加速

FFmpeg默認(rèn)使用CPU編碼谐区。執(zhí)行ffmpeg命令時(shí)湖蜕,資源管理器可以看到CPU使用率升高。

image

如果使用GPU運(yùn)算宋列,轉(zhuǎn)換速度能成倍提高昭抒,特別是轉(zhuǎn)換h265編碼視頻。

查看ffmpeg支持視頻編碼格式:

ffmpeg -codecs

找到 hevc ,也就是h265編碼:

image
  • hevc_qsv:intel核顯

  • hevc_nvenc:nvidia顯卡

  • hevc_amf:amd顯卡

如果使用h264編碼灭返,使用 h264_qsv / h264_nvenc 盗迟。

ffmpeg -i ./video.mp4 -c:v hevc_qsv ./out.mp4

使用GPU編碼,運(yùn)行以上ffmpeg命令熙含,可以看到GPU占用率升高罚缕。

image

使用GPU加速視頻轉(zhuǎn)換速度快了很多,我僅使用核顯速度也比CPU轉(zhuǎn)碼也能快數(shù)倍怎静。


ffprobe命令

ffprobe ./video.mp4

查看視頻文件信息邮弹。

image

從輸出信息可以看到該視頻文件是使用h264編碼,分辨率1280x720蚓聘,視頻平均碼率921kbps腌乡,24幀。視頻的音頻使用aac編碼夜牡,采樣率44100Hz与纽,碼率128kpbs。

ffprobe -v error -show_streams -print_format json ./video.mp4

使用json格式輸出視頻信息塘装。

image

ffplay命令

ffplay ./video.mp4

播放視頻文件急迂。這時(shí)會(huì)彈出一個(gè)播放器。

image

ffplay命令還有很多控制參數(shù)氢哮。不過我覺得用處不大,畢竟圖形化播放器更好用型檀,功能也更強(qiáng)大冗尤。


開發(fā)集成

使用FFmpeg命令,我們可以用程序或腳本完成視頻自動(dòng)轉(zhuǎn)換胀溺。也可以讓我們開發(fā)的系統(tǒng)擁有視頻轉(zhuǎn)碼裂七,或讀取視頻信息的功能。以Java示例:

public static int doWaitFor(Process process) {
  InputStream in = null;
  InputStream err = null;
  int exitValue = -1; // returned to caller when p is finished
  try {
    in = process.getInputStream();
    err = process.getErrorStream();
    boolean finished = false; // Set to true when p is finished
    while (!finished) {
      try {
        while (in.available() > 0) {
          // Print the output of our system call
          Character c = new Character((char) in.read());
          System.out.print(c);
        }
        while (err.available() > 0) {
          // Print the output of our system call
          Character c = new Character((char) err.read());
          System.out.print(c);
        }
        // Ask the process for its exitValue. If the process
        // is not finished, an IllegalThreadStateException
        // is thrown. If it is finished, we fall through and
        // the variable finished is set to true.
        exitValue = process.exitValue();
        finished = true;
      } catch (IllegalThreadStateException e) {
        // Process is not finished yet;
        // Sleep a little to save on CPU cycles
        Thread.currentThread().sleep(500);
      }
    }
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    try {
      if (in != null) {
        in.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    if (err != null) {
      try {
        err.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  return exitValue;
}

Java調(diào)用外部命令使用 Runtime.getRuntime().exec(command) 仓坞。
在使用調(diào)用ffmpeg命令時(shí)背零,必須要讀取執(zhí)行命令輸出流中的內(nèi)容,程序才不會(huì)阻塞无埃。否則緩沖讀滿后徙瓶,進(jìn)程會(huì)卡住。
視頻轉(zhuǎn)換會(huì)非常耗時(shí)嫉称,取決于硬件性能侦镇。在實(shí)際應(yīng)用中,我們也可以開啟線程去處理织阅。

FFmpeg還提供C調(diào)用壳繁,公共庫集成。以上方法并不是最優(yōu)解決方案,僅提供一種參考闹炉。


除非注明蒿赢,否則均為"攻城獅·正"原創(chuàng)文章,請(qǐng)注明出處渣触。

本文鏈接:https://engr-z.com/422.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末羡棵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子昵观,更是在濱河造成了極大的恐慌晾腔,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啊犬,死亡現(xiàn)場離奇詭異灼擂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)觉至,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門剔应,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人语御,你說我怎么就攤上這事峻贮。” “怎么了应闯?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵纤控,是天一觀的道長。 經(jīng)常有香客問我碉纺,道長船万,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任骨田,我火速辦了婚禮耿导,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘态贤。我一直安慰自己舱呻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布悠汽。 她就那樣靜靜地躺著箱吕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柿冲。 梳的紋絲不亂的頭發(fā)上殖氏,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音姻采,去河邊找鬼雅采。 笑死爵憎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婚瓜。 我是一名探鬼主播宝鼓,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巴刻!你這毒婦竟也來了愚铡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤胡陪,失蹤者是張志新(化名)和其女友劉穎沥寥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柠座,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邑雅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妈经。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淮野。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吹泡,靈堂內(nèi)的尸體忽然破棺而出骤星,到底是詐尸還是另有隱情,我是刑警寧澤爆哑,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布洞难,位于F島的核電站,受9級(jí)特大地震影響揭朝,放射性物質(zhì)發(fā)生泄漏队贱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一萝勤、第九天 我趴在偏房一處隱蔽的房頂上張望露筒。 院中可真熱鬧呐伞,春花似錦敌卓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至癣防,卻和暖如春蜗巧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蕾盯。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工幕屹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓望拖,卻偏偏與公主長得像渺尘,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子说敏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容