天天看點

記錄一次Linux音視訊調試過程

一、基本資訊

1.CPU詳情:Intel(R) Core(TM) i3-8100 CPU @ 3.60GHz

2.PCH詳情:h310

3.系統資訊:Linux buildroot 5.4.77 #4 SMP Sun Aug 29 19:39:59 PDT 2021 x86_64 GNU/Linux

二、背景

1.使用程式完成視訊播放(也可以在檔案系統建構中勾選vlc,使用vlc指令直接播放視訊檔案),VGA和HDMI視訊播放畫面正常,但是HDMI和耳機都沒有聲音。

三、調試過程

1.由于闆子未接入儲存設備,采用pxe啟動

啟動參數如下圖所示

記錄一次Linux音視訊調試過程

核心檔案:bzImage

檔案系統檔案:rootfs.cpio.gz

2.檢查聲霸卡資訊

記錄一次Linux音視訊調試過程

3.檢查聲霸卡相關裝置資訊

記錄一次Linux音視訊調試過程

缺少HDMI相關音頻裝置。

4.上一步中發現缺少HDMI相關音頻裝置,檢查是否為驅動問題

記錄一次Linux音視訊調試過程

根據驅動的列印資訊可以看出,audio bind失敗了。

檢視核心源碼,找到該錯誤資訊列印的位置,發現驅動确實存在問題,嘗試修改驅動源碼等方式,經曆了很多過程,這裡不再贅述,但最終沒能很好地解決該問題。

5.嘗試另外一個方向

由于驅動中提到【i915】,是以聯想到pxe啟動參數【i915.modeset=0】。

由于該啟動參數決定了後續核心中【i915】相關驅動的走向,是以嘗試【i915.modeset】的另一個值【1】,這裡不贅述這個參數值的具體含義和差別,有興趣的可以自行百度一下。

采用【i915.modeset=1】pxe啟動,如圖所示。

啟動後檢查驅動列印資訊

記錄一次Linux音視訊調試過程

這樣來看,沒有報錯,那就繼續檢查其它項目。

6.檢查聲霸卡資訊

記錄一次Linux音視訊調試過程

7.檢查聲霸卡相關裝置資訊

記錄一次Linux音視訊調試過程

沒有什麼異常。

8.根據上一步中的裝置資訊,使用【aplay】指令(使用其它可以指定聲霸卡及裝置的指令也可以),驗證具體聲音輸出裝置是其中的哪一個

記錄一次Linux音視訊調試過程

【aplay -D plughw:0,0 /media/sda1/8ch.1k2k.wav】指令的意思是,使用【card 0】【device 0】播放【/media/sda1/8ch.1k2k.wav】。

9.經過上一步中一輪驗證後,發現所有裝置都不發聲,是以使用【alsamixer -c 0】指令檢查音頻配置

【alsamixer -c 0】的意思是檢視【card 0】的音頻配置。

【alsamixer -c 0】指令後發現都是【MM】的狀态,【MM】代表靜音,是以改變該狀态,如果不知道每個配置怎樣修改才正确的話,可以考慮使用【alsactl init】指令直接将alsa配置初始化。

使用【alsactl init】初始化後,【alsamixer -c 0】的配置如下圖所示

記錄一次Linux音視訊調試過程

10.音頻配置修改後再次驗證【步驟8】中内容,使用【aplay】指令(使用其它可以指定聲霸卡及裝置的指令也可以),驗證具體聲音輸出裝置是其中的哪一個

最終驗證發現:

耳機輸出裝置:card 0,device 0

HDMI輸出裝置:card 0,device 7

11.設定HDMI為預設音頻輸出裝置

檔案系統中,【/etc】目錄下建立一個檔案【asound.conf】,在檔案中寫入如下内容

記錄一次Linux音視訊調試過程

内容的意思是将HDMI音頻輸出裝置【card 0,device 7】指定為預設音頻輸出裝置。

12.此時再次使用程式播放視訊

視訊播放有畫面,有聲音,是以聲音方面問題解決了。

但是同時檢視【VGA】和【HDMI】可以發現,兩者顯示不同,并且同時接入時【VGA】會出現隻顯示畫面的一部分的現象,如果隻接入【VGA】,畫面似乎是正常的。

13.根據上一步中發現的問題,正式開始從解決聲音問題轉向解決視訊問題

對于上一步的現象,經過研究發現

同時接入【VGA】和【HDMI】時,使用的顯示模式為【克隆模式】。

【i915.modeset=1】時,如果将【VGA】和【HDMI】同時接入的話,分辨率會以【HDMI】的分辨率為準,但是如果隻接入【VGA】自己的話,就以【VGA】的為準。

【i915.modeset=0】時,如果将【VGA】和【HDMI】同時接入的話,【VGA】和【HDMI】各自以自己的分辨率為準,互不影響。

14.在與Intel技術支援溝通的途中得到啟發,嘗試修改X(Xorg)服務的分辨率

執行指令【xrandr --output HDMI1 --mode "1024x768"】。

指令很好了解,分辨率修改為【1024*768】。

最終【VGA】和【HDMI】顯示均正常。

四、結語

其實這裡記錄的很多東西都做了一定的簡化,實際探索過程比這裡描述的要複雜的多太多,現在将探索過程留在這裡,希望以後遇到類似問題時可以更快地解決,畢竟探索過程很多時候真的很讓人絕望。

繼續閱讀