一個基本的命令:
ffmpeg -f alsa -i <device> out.mp3
其中,
-f 表示設置格式,有format的意思,out.mp3前面可以加上 -f mp3, 因為帶了mp3后綴,就省略了。
alsa 表示alsa音頻驅動程序的編碼格式,它保證后面的音頻流可以由alsa解碼。具體可根據驅動程序選擇。(alsa主頁https://www.alsa-project.org)
-i 表示從后面的 url 輸入(音頻流),url(Uniform Resource Locator,統一資源定位器)不僅可表示網址,還能表示文件路徑。如果是麥克風設備,則是捕獲麥克風采集的音頻,需要設備在計算機中的url,比如 hw:1。
out.mp3輸出文件路徑(默認當前文件夾)。
如果出現
cannot open audio device ... (No such file or directory)
是因為沒檢測到麥克風之類設備,可以先使用
arecord -l
(注意最后的l, 是字母l, 大寫為L,意為list, 列表,即羅列出來)
從card 1到n羅列出了錄音設備,我們需要的就是數字后面跟着的名字。不一定,只需要數字就夠了。
比如選擇了card 1,把ffmpeg的命令中的<device>換成 plug:front:1,或者hw:1也可以,
如果不用數字,用名字,就換成
plug:default:名字
或
plug:front:名字
具體請參考:
https://www.alsa-project.org/main/index.php/DeviceNames
。
如果錄制視頻,一個基本的ffmpeg命令為:
ffmpeg -f v4l2 -i <device> out.mp4
v4l是video for linux的簡寫,
v4l2是v4l-utils的一種編碼格式。具體可根據驅動程序選擇。
v4l-utils是一個Linux的視頻驅動程序集,(沒有需安裝)
具體的<device>可以用
v4l2-ctl --list-devices查看圖形設備,
Linux把設備當成文件對待,所以攝像頭設備存放於/dev/*,一般是/dev/video0
把ffmpeg命令中的<device>替換成/dev/video0就好。
同時錄制音頻和視頻,輸出一個有聲音的視頻:
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:1 out.mp4
可以看到有兩個 -f 了,分別是音頻的和視頻的,輸出文件還是一個。
如果無法播放,根據http://trac.ffmpeg.org/wiki/Errors 說明:
No pixel format specified, yuv444p for H.264 encoding chosen. Use -pix_fmt yuv420p for compatibility with outdated media players.
Your input and output may vary in supported pixel formats. ffmpeg will attempt to choose the "best" supported pixel format for your encoder. For libx264 it may use a pixel format that is not decodable by many non-FFmpeg based media players.
Adding -pix_fmt yuv420p or -vf format=yuv420p will ensure compatibility with dumb players.
(本文鏈接https://www.cnblogs.com/oler/p/13437701.html)
以上, 意思是把pixel_format(像素格式)改成yuv420p以兼容一些傻瓜播放器。提供兩個選項:-pix_fmt yuv420p 或 -vf format=yuv420p,我嘗試了一下,命令如下:
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:1 -pix_fmt yuv420p out.mp4
在out.mp4 前面加了pix_fmt選項,指定為yuv420p,就可以用windows自帶播放器播放了,也能嵌入網頁播放了。其他pix_fmt格式可用ffmpeg -pix_fmts查詢。
如果錄出來的視頻聲音或畫面卡頓不清,並且輸出信息有ALSA buffer xrun,還有Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
從英文意思就可以看出,是因為thread_queue_size不夠,看它前面【】里面@的是alsa還是v4l2, 在相應的 -f 前面加上 -thread_queue_size 再加個數值就好了,從8,16,32,64翻倍加(翻倍加比較快一點),直到沒有上述提示就好了。我一直把視頻加到了128,音頻加到了4096,才沒有了錯誤提示,視頻中的音質也好了很多:
ffmpeg -thread_queue_size 128 -f v4l2 -i /dev/video0 -thread_queue_size 4096 -f alsa -i hw:1 -pix_fmt yuv420p out.mp4
不過鑒於樹莓派的性能較低,應該設置視頻的碼率,清晰度,音頻采樣率低一點,而不是盲目加塞。
其他的參數設置請參考ffmpeg的命令詳解,這里提供的命令僅僅是最基本的。