他說的一定對嗎?-請保持獨立思考的習慣
實際工作中,我們經常會向其他同事諮詢一些技術問題。但是,他給出的答案一定是正確的嗎?
近期項目組遇到這麼個問題,Android平台上軟體解碼RTSP實時視頻流CPU佔用率較高,打算切換到硬體解碼。但是在調用硬體解碼介面的時候返回失敗,原因是視頻流的解析度信息未知,結果又自動切換回了軟解。
那麼,基於RTSP傳輸的視頻流,一般可以從哪裡獲取解析度信息呢?
1.RTSP報文中的SDP,一般會有SPS、PPS信息,這裡可以拿到(具體術語不展開介紹,感興趣自行搜索)。
2.RTP擴展頭:RTP協議允許對頭部進行擴展,當然擴展信息你愛填啥就填啥,並不限於解析度信息,相當於私有信息。
3.碼流中的SPS信息。實際實現中,很多公司都會把SPS、PPS信息穿插在碼流中,一般的做法是SPS、PPS緊挨著I幀,並且位於I幀的前面(位於前面的好處是解碼庫拿到該信息,就可以解碼緊挨著的I幀,否則緊挨著的I幀就要被緩存起來或者丟掉)。有些實現是每個I幀前面都有SPS、PPS,有些實現是僅當視頻信息變化時才插入SPS、PPS。
詢問解碼庫同事,說解析度信息是從RTP擴展頭部獲取的。我們設備端沒有擴展RTP頭,所以取不到解析度信息,導致硬解失敗。這個答覆聽起來挺有道理的,但是仔細想想經不起推敲啊:
1.硬解拿不到解析度信息,軟解就拿到了?如果軟解也拿不到,為何又能解碼?
2.公司的解碼庫經常用來對接第三方設備,別人的設備不一定填充RTP擴展頭,即使填充了,格式也未必和我司的定義一致。難道我們的解碼庫解不了第三方的視頻流?這和事實不符啊。
3.之前調試的設備,從抓包信息看,也並未填充RTP擴展頭,但是卻可以用硬解。
帶著這些疑問再次詢問解碼庫同事,終於得到了合理的答覆:
1.如果存在RTP擴展頭,他們優先從擴展頭獲取解析度信息
2.如果沒有擴展頭,他們就從碼流中的SPS獲取解析度信息
*註:這裡有個遺憾,我們居然沒有使用RTSP報文中的SDP。*
問題依然存在,為何硬解獲取不到解析度,軟解能獲取到呢?
抓包看下吧。原來第一個I幀前無SPS、PPS信息,而後面每個I幀前面都有SPS、PPS。排查設備端代碼發現,RTP封裝庫中,在發第一個I幀的時候,把SPS、PPS信息丟了!!!
通過這次事件可以看到,別人提供給你的信息不一定是準確的,甚至有可能是錯誤的。他不一定是有意給你提供不準確的信息,有可能僅僅是因為他對問題理解的局限性,對相關知識的熟悉程度。為了避免被不準確的信息所害,我們一定要保持獨立思考的習慣,多問幾個為什麼。
TAG:coderhuo |