Linux下使用"avconv"捕捉錄製桌面視訊及音訊

尋夢發表於2015-07-17

Libav是一套跨平臺的庫和工具,用來處理多媒體檔案、流及協議,它原生於ffmpeg專案。它包含的一些工具如下:

  • avplay:視訊、音訊播放器;
  • avconv:多媒體轉換器,並可以對來自不同源的視訊和音訊進行錄製;
  • avprobe:連線多媒體流檔案流,並返回多種有用資訊及統計資料的工具;
  • Libavfilter:為不同Libav工具提供的過濾器API。

本文將闡釋如何使用DebianUbuntuLinux Mint發行版中的avconv進行Linux桌面音視訊捕捉錄製。

1. 安裝avconv工具

avconvlibav-tools軟體包的一部分,對於如Ubuntu和Mint等所有基於Debain的發行版,可從官方的資源庫中獲取並進行安裝,命令如下:

$ sudo apt-get update
$ sudo apt-get install libav-tools

注意:從預設資源庫中安裝的軟體包,版本可能有些舊,因此,推薦從官方的git資源庫中獲取最新版本進行編譯安裝,命令如下:

$ sudo apt-get install yasm
$ git clone git://git.libav.org/libav.git
$ cd libav
$ ./configure
$ make
$ sudo make install

當然,可以執行./configure –help命令,先列出所有的可選項,進行配置並安裝需要的庫。為了安裝依賴項,可能有大量的工作要做。在使用從原始碼編譯安裝時,要注意操作許可權,可能要使用sudo avconv而不是avconv來執行。

2. 開始捕捉錄製桌面視訊

安裝就緒後,可使用下面的命令捕捉錄製桌面視訊:

avconv -f x11grab -r 25 -s 1920x1080 -i :0.0 -vcodec libx264 -threads 4 $HOME/output.avi

簡單地介紹下上面的命令:

  • avconv -f x11grab是從X伺服器捕捉視訊的預設命令;
  • -r 25是所需的幀頻,可以根據需要進行調整;
  • -s 1920×1080是視訊的解析度,選定的值不應大於當前系統螢幕最大解析度,否則可能會出現以下錯誤:

    avconv version 9.18-6:9.18-0ubuntu0.14.04.1, Copyright (c) 2000-2014 the Libav developers
      built on Mar 16 2015 13:19:10 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1)
    [x11grab @ 0x9de2c0] device: :0.0 -> display: :0.0 x: 0 y: 0 width: 1920 height: 1080
    [x11grab @ 0x9de2c0] shared memory extension  found
    X Error of failed request:  BadMatch (invalid parameter attributes)
      Major opcode of failed request:  130 (MIT-SHM)
      Minor opcode of failed request:  4 (X_ShmGetImage)
      Serial number of failed request:  11
      Current serial number in output stream:  11
    
  • -i :0.0要捕捉錄製的當前X伺服器的桌面,一般無需改變此值;

  • -vcodec libx264錄製視訊時所用的編碼庫;

  • -threads 4,錄製時所用的執行緒數,根據需要調整合適的值;

  • $HOME/output,檔案儲存的目標路徑;

  • .avi,視訊的格式及檔案的副檔名,支援的格式還有.flv.mp4.wmv.mov.mkv等。

在命令列終端中,回車執行該命令後,就自動開始錄製,可以在該命令列終端視窗時使用Ctrl + C終止錄製。

錄製結束,可使用mplayer或者其他的多媒體播放器進行播放,或者可以使用此Libav包中自帶avplay工具進行播放,命令如下:

$ avplay $HOME/output.avi

注意:切勿忘記修改檔案儲存的目標路徑。

3. 捕捉錄製桌面的音訊

如果要捕捉錄製音訊,首先執行下面的命令來列出所有可用的音訊輸入源:

$ arecord -l

該命令可能的輸出如下:

card 0: SB [HDA ATI SB], device 0: ALC892 Analog [ALC892 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: SB [HDA ATI SB], device 2: ALC892 Alt Analog [ALC892 Alt Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

就我當前的系統而言,有card 0card 2兩塊卡作為音訊輸入源卡(儘管card 2是偽裝置),依次執行下面的命令來捕捉錄製桌面的音訊:

avconv -f alsa -i hw:0 output.wav

如果錄製成mp3格式,可採用下面的命令:

avconv -f alsa -i hw:0 -acodec libmp3lame output.mp3

或 avconv -f alsa -i hw:0 output.mp3

如果系統支援多執行緒,也可採用下面的命令:

avconv -f alsa -i hw:0 -acodec libmp3lame -threads 4 output.wav

對以上命令的簡單解釋:

  • -f alsa,捕捉音訊的裝置源可選項,其他的還有dv1394jackfbdevosspulse等;
  • -i hw:0,對應alsa裝置的音訊輸入源,此選項中0arecord -l命令輸出中card 0對應。

但採用alsa時,錄製成的音訊可能比源音訊來音量小,推薦採用下面的方式改進:

1) 先執行下面的路徑,找到pulse的源裝置:

    $ pactl list sources | grep analog-stereo.monitor

該命令的輸出可能如下:

    Name: alsa_output.pci-0000_00_14.2.analog-stereo.monitor
    Name: alsa_output.2.analog-stereo.monitor

2) 接著,採用-f pulse可選項進行捕捉錄製音訊,命令如下:

    avconv -f pulse -i alsa_output.pci-0000_00_14.2.analog-stereo.monitor output.wav

按下Ctrl + C,終止錄製。

4. 同時捕捉錄製桌面的視訊和音訊

同時錄製桌面的視訊和音訊命令如下:

$ avconv -f alsa -i hw:0 -f x11grab -r 25 -s 1920x1080 -i :0.0 -vcodec libx264 -threads 4 output-02.avi

為改進音訊的音量大小,推薦使用下面的命令:

$ avconv -f pulse -i alsa_output.pci-0000_00_14.2.analog-stereo.monitor -f x11grab -r 25 -s 1920x1080 -i :0.0 -vcodec libx264 -threads 4 output-file2.avi

如果音訊採用mp3進行壓縮編碼,可採用下面的命令:

$ avconv -f pulse -i alsa_output.pci-0000_00_14.2.analog-stereo.monitor -f x11grab -r 25 -s 1920x1080 -i :0.0 -acodec libmp3lame -vcodec libx264 -threads 4 output-file2.avi

參考資料:

  1. How to Record Your Desktop Video and Audio Using “Avconv” Tool in Ubuntu
  2. Recording speaker audio using avconv
  3. PCM (digital audio) interface

相關文章