1. 程式人生 > 實用技巧 >linux 樹莓派 debian ffmpeg alsa v4l2 錄製音訊 視訊 cannot open audio device 無法播放 聲音模糊 畫面卡頓 ALSA buffer xrun Thread message queue blocking -pix_fmt

linux 樹莓派 debian ffmpeg alsa v4l2 錄製音訊 視訊 cannot open audio device 無法播放 聲音模糊 畫面卡頓 ALSA buffer xrun Thread message queue blocking -pix_fmt

一個基本的命令:

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 了,分別是音訊的和視訊的,輸出檔案還是一個。

如果無法播放


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.ffmpegwill 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 yuv420por-vf format=yuv420pwill 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的命令詳解,上面提供的命令僅僅是最基本的。