不依賴頻道文件實(shí)現(xiàn) DVB 直接播放)
1. 頻道文件與直接調(diào)諧的區(qū)別傳統(tǒng)方案的流程是搜索頻道 ↓ 導(dǎo)出頻道文件 ↓ 系統(tǒng)預(yù)置頻道文件 ↓ 開機(jī)導(dǎo)入 ↓ 根據(jù)文件中的 PID 播放頻道文件通常包含頻率符號(hào)率調(diào)制方式節(jié)目號(hào)視頻 PID音頻 PID。這種方案啟動(dòng)速度快但依賴具體地區(qū)和運(yùn)營商。如果頻點(diǎn)發(fā)生變化或者需要驗(yàn)證底層 Tuner、Demod 和 Demux 是否能夠獨(dú)立工作就需要采用直接調(diào)諧方式。直接調(diào)諧的基本流程是輸入頻率和制式參數(shù) ↓ 配置 Tuner ↓ 配置 Demod 并等待鎖定 ↓ 將 MPEG-TS 送入 Demux ↓ 過濾 PAT/PMT ↓ 解析音視頻 PID ↓ 啟動(dòng)解碼播放需要注意“不使用頻道文件”并不代表完全不需要節(jié)目表。如果事先不知道音視頻 PID仍然需要通過 PAT 和 PMT 動(dòng)態(tài)發(fā)現(xiàn)節(jié)目。2.sample_dvbplay的作用項(xiàng)目中的測試程序位于device/hisilicon/bigfish/sdk/sample/dvbplay程序會(huì)根據(jù)命令行參數(shù)選擇信號(hào)制式并完成前端初始化、鎖頻、節(jié)目搜索和播放。例如 DVB-Csample_dvbplay dvbc 474 6875 64參數(shù)含義通常為474 頻率單位由平臺(tái)約定 6875 符號(hào)率 64 QAM 調(diào)制方式DVB-T、DVB-S 等制式使用的參數(shù)不同具體格式可以查看device/hisilicon/bigfish/sdk/sample/dvbplay/readme_cn.txt程序初始化的大致順序如下HI_UNF_DMX_Init(); HI_UNF_DMX_AttachTSPort(...); HI_UNF_TUNER_Init(); HI_UNF_TUNER_Open(...); HI_UNF_TUNER_SetAttr(...); HI_UNF_TUNER_Connect(...); HIADP_Search_GetAllPmt(...);也就是說程序不是直接“打開一個(gè)頻道”而是先讓前端產(chǎn)生有效 TS再從 TS 中搜索節(jié)目。3. Tuner、Demod 和 Demux 的職責(zé)TunerTuner 負(fù)責(zé)選擇目標(biāo)射頻頻段并完成調(diào)諧。典型配置包括Tuner 類型Tuner I2C 地址頻率符號(hào)率輸出模式。DemodDemod 負(fù)責(zé)對 Tuner 輸出的信號(hào)進(jìn)行解調(diào)恢復(fù) MPEG-TS。典型配置包括Demod 類型Demod I2C 地址I2C 通道復(fù)位 GPIO調(diào)制方式TS 輸出格式。DemuxDemux 接收 TS并根據(jù) PID 和 Section Filter 提取節(jié)目表及音視頻數(shù)據(jù)。常見表包括PAT節(jié)目關(guān)聯(lián)表PMT節(jié)目映射表SDT業(yè)務(wù)描述表EIT節(jié)目事件信息。因此播放失敗時(shí)必須區(qū)分問題發(fā)生在哪一層Tuner 未鎖頻 ≠ Demod 未解調(diào) ≠ Demux 未收到 TS ≠ PAT/PMT 過濾失敗 ≠ 音視頻解碼失敗4. 前端參數(shù)必須與硬件匹配dvbplay.c中會(huì)讀取前端配置并寫入 Tuner 屬性stTunerAttr.enTunerDevType stTunerCfg.u32TunerType; stTunerAttr.u32TunerAddr stTunerCfg.u32TunerI2cAddr; stTunerAttr.enDemodDevType stTunerCfg.u32DemodType; stTunerAttr.u32DemodAddr stTunerCfg.u32DemodI2cAddr; stTunerAttr.enI2cChannel stTunerCfg.u32I2cChNum;因此出現(xiàn)下面的日志時(shí)HI_UNF_TUNER_SetAttr failed應(yīng)優(yōu)先檢查Tuner 類型是否正確Demod 類型是否正確I2C 地址是否正確I2C 通道是否正確復(fù)位 GPIO 是否正確TS 端口是否正確當(dāng)前信號(hào)制式是否匹配。如果日志中的demod_type、demod_addr與硬件原理圖或配置文件不一致程序可能還沒有進(jìn)入真正的節(jié)目搜索階段。5. 如何分析 Demux 超時(shí)如果前端初始化成功但出現(xiàn)HIADP_Search_GetAllPmt failed DMX_DataRead timeout說明問題已經(jīng)進(jìn)入節(jié)目搜索階段。unf_abs.c中的DMX_DataRead()會(huì)調(diào)用HI_UNF_DMX_AcquireBuf(...)從 Demux 通道獲取 Section 數(shù)據(jù)。如果在指定時(shí)間內(nèi)沒有獲得完整的 PAT 或 PMT就會(huì)返回失敗。常見原因包括Demod 沒有鎖定Demod 沒有輸出 TSTS 端口、時(shí)鐘或極性配置錯(cuò)誤Demux 沒有接收到有效數(shù)據(jù)PID 配置錯(cuò)誤Section Filter 的 Match/Mask 設(shè)置錯(cuò)誤實(shí)際調(diào)用了錯(cuò)誤的 Demux 實(shí)現(xiàn)。推薦同時(shí)查看dmesg | grep -iE tuner|demod|lock|signal|ts logcat -b all | grep -iE dvb|demux|pat|pmt|timeout6. 一套實(shí)用排查順序建議按照下面的順序定位確認(rèn)頻率、符號(hào)率和調(diào)制方式 ↓ 確認(rèn) Tuner/Demod 參數(shù) ↓ 確認(rèn)鎖頻狀態(tài) ↓ 確認(rèn) TS 是否進(jìn)入 Demux ↓ 確認(rèn) PAT 是否獲取成功 ↓ 確認(rèn) PMT 是否獲取成功 ↓ 確認(rèn)音視頻 PID ↓ 確認(rèn)解碼器和顯示輸出不要一看到timeout就直接增大超時(shí)時(shí)間。超時(shí)只是“在規(guī)定時(shí)間內(nèi)沒有拿到數(shù)據(jù)”真正原因可能是更早的硬件參數(shù)或數(shù)據(jù)通路錯(cuò)誤。結(jié)語直接調(diào)諧播放的價(jià)值不只是省去頻道文件還可以驗(yàn)證整條 DVB 底層鏈路Tuner → Demod → TS → Demux → PAT/PMT → Decoder當(dāng)這條鏈路被逐層驗(yàn)證后后續(xù)無論采用頻道文件播放、自動(dòng)搜臺(tái)還是實(shí)時(shí)調(diào)諧都能建立在可靠的底層基礎(chǔ)上。