最近更新: 2014-04-25

Rasbperry Pi 電視解析度設置與 omxplayer 顯示座標校正

日前,我將 Raspberry Pi (以下簡稱 Pi) 透過 HDMI 接上一台 LCD 電視時,發現它在 X Window 環境下的解析度錯誤。明明電視的 OSD 顯示目前顯示狀態為 1080p@60 ,但 X Window 中執行 xrandr 時,卻顯示 18??x9?? 這種奇怪的解析度。此外,我還發現使用 omxplayer 播放影片時,影像內容顯示的座標與長寬比例有微妙的偏差。舉個例子來說,我指定 --win "10 10 1290 730" 的播放座標,預期應該會在 X Window 的範圍內完整顯示。但結果卻是影像內容超出了整個 X Window 範圍,甚至有一部份影像內容被切掉(超過電視可見範圍)。這也讓我發現 X Window 並沒有佔滿整個電視可見範圍,實際上留了一段黑邊。

我需要設置 Pi 連接電視的正確解析度,以及校正 omxplayer 顯示座標錯誤這兩件事。

首先,啟動 Pi 後,我先執行下列指令查看這台電視提供的解析度資訊。

$ tvservice -d edid
$ edidparser edid

我需要找評分最高的模式。例如我這台電視就可以找到下列訊息。

HDMI:EDID best score mode is now CEA (16) 1920x1080p @ 60 Hz with pixel clock 148 MHz (score 5398248)

這段訊息的重點是 CEA (16) 。這是說這台電視的 HDMI 顯示模式採用 CEA 規範(CEA group 1, DMT group 2),最適合的模式代號是 16 。對應 /boot/config.txt 的設置項目,就是:

hdmi_group=1
hdmi_mode=16

重開機後再進入 X Window ,這次 X Window 顯示的解析度就是 1920x1080 了。但是 omxplayer 的顯示座標還是錯誤。這是因為 omxplayer 顯示時參考的座標值和 X Window 不一樣。 omxplayer 的顯示方式是直接透過 Pi 的顯示晶片的硬體功能寫入視訊記憶體中。它不透過 X Window 顯示協定,所以它參考的不是 X Window 所用的座標,而是 frame buffer 的座標。故我還需要再設定 /boot/config.txt 的 frame buffer 解析度,讓兩者匹配。所以我又加上下列設定:

# 對付黑邊
disable_overscan=1

# frame buffer 寬高
framebuffer_width=1920
framebuffer_height=1080

再度重開機使設定生效就校正完成了。我的 X Window 正確地使用 1920x1080 解析度,而 omxplayer 播放時的影像內容座標也剛好匹配 X Window 中的座標位置。

如果這樣還不能校正 omxplayer 的顯示座標,可以再嘗試加上 overscan_scale=1

我也順便調整了 GPU 使用的記憶體數量。若按「Raspberry Pi 使用者手冊」所述方法(p.125),需要改變 start.elf 。不過我現在使用的 OS 版本,可以修改 /boo/config.txt 中的 gpu_mem 達成目的。我不需要 3D 繪圖,但要求播放 1080p 影片,經我測試後,設為 gpu_mem=64 即可。

參考資源:

相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/27765371.html