音視頻開發(fā)之旅(64) - 部分android手機(jī)上編碼的視頻在ios上無法播放

目錄

  1. 問題描述
  2. 問題分析
  3. 問題原因
  4. 問題解決
  5. 資料
  6. 收獲

一躺盛、問題描述

用小米11 錄制視頻上傳后省骂,在iPhone的Safari瀏覽器或者應(yīng)用的H5中無法播放,而android設(shè)備上的確實(shí)可以正常播放劫谅。

同樣的操作绰咽,在一些其他android的手機(jī)上傳的視頻眼坏,在ios端卻可以正常的播放拂玻。

二、問題分析

拿到(能播放和不能播放)兩個視頻宰译。分析下這兩個視頻有什么差異檐蚜。

通過MediaInfo查看兩個視頻的基本信息

不能播放的視頻

{
"@type": "Video",
"StreamOrder": "1",
"ID": "2",
"Format": "AVC",
"Format_Profile": "High",
"Format_Level": "6",
"Format_Settings_CABAC": "Yes",
"Format_Settings_RefFrames": "1",
}

能播放的視頻

{
"@type": "Video",
"Format": "AVC",
"Format_Profile": "Main",
"Format_Level": "3.1",
"Format_Settings_CABAC": "Yes",
}

可以很明顯的看到兩個視頻的Profile和Level不同。

通過ffmpeg把不能播放的視頻進(jìn)行轉(zhuǎn)碼囤屹,修改profile和level的值熬甚,進(jìn)行本地快速驗證逢渔。

ffmpeg -i input.mp4 -profile:v main -level 4.2 output.mp4

ffmpeg -i input.mp4 -profile:v high -level 5.1 output.mp4

ffmpeg -i input.mp4 -profile:v high -level 6  output.mp4

發(fā)現(xiàn)只有l(wèi)evel大于等于6肋坚,在ios上就不能播放。

三、問題原因

我們先來看下Profile和Level是什么智厌?

3.1 Profile

H.264有四種畫質(zhì)級別,分別是baseline, extended, main, high: 
  1诲泌、Baseline Profile:基本畫質(zhì)。支持I/P 幀铣鹏,只支持無交錯(Progressive)和CAVLC敷扫; 
  2、Extended profile:進(jìn)階畫質(zhì)诚卸。支持I/P/B/SP/SI 幀葵第,只支持無交錯(Progressive)和CAVLC;(用的少) 
  3合溺、Main profile:主流畫質(zhì)卒密。提供I/P/B 幀,支持無交錯(Progressive)和交錯(Interlaced)棠赛, 也支持CAVLC 和CABAC 的支持哮奇; 
  4、High profile:高級畫質(zhì)睛约。在main Profile 的基礎(chǔ)上增加了8x8內(nèi)部預(yù)測鼎俘、自定義量化、 無損視頻編碼和更多的YUV 格式辩涝; 
   
   H.264 Baseline profile贸伐、Extended profile和Main profile都是針對8位樣本數(shù)據(jù)、4:2:0格式(YUV)的視頻序列怔揩。
   
  在相同配置情況下棍丐,High profile(HP)可以比Main profile(MP)降低10%的碼率。 
  根據(jù)應(yīng)用領(lǐng)域的不同沧踏,Baseline profile多應(yīng)用于實(shí)時通信領(lǐng)域歌逢,Main profile多應(yīng)用于流媒體領(lǐng)域,High profile則多應(yīng)用于廣電和存儲領(lǐng)域翘狱。

維基百科上有對應(yīng)的表:


3.2 level

level是一組特定的約束秘案,表示一個profile所需的編解碼性能。指定編解碼器可能使用的最大圖像分辨率潦匈、幀率和比特率阱高。一個符合給定level的解碼器必須能夠解碼為該level和所有低level編碼的所有比特流。

在MediaCodecInfo中有定義各種類型的值


綜上茬缩,我們可以知道Profile和Level是影響著視頻編碼的質(zhì)量和效率赤惊。有些設(shè)備不支持高Profile、level的編碼凰锡。所以需要綜合考慮兼容性和視頻質(zhì)量未舟。

通過查看代碼發(fā)現(xiàn)圈暗,android端的視頻編碼時,僅對Profile做了閥值限制裕膀,Level沒有判斷處理员串,就像小米11手機(jī)對應(yīng)解碼器信息返回的Level時6,這樣編碼出來的視頻在某些不支持的該level解碼的設(shè)備上就無法解碼播放昼扛。

3.3 擴(kuò)展

另外通過查找資源寸齐,發(fā)現(xiàn)android在7.0之前的系統(tǒng),編碼時profile只能是Baseline抄谐,如果不是系統(tǒng)會強(qiáng)制的設(shè)置為Baseline渺鹦。猜測也是為了兼容性吧。雖然更高的壓縮比帶來很好的收益蛹含,但是兼容性(普適性)是優(yōu)先考慮的點(diǎn)海铆。

使用MediaCodec編碼時,通常是這樣設(shè)置的

先配置MediaCodecInfo的profile信息 然后賦給MediaFormat
codec.configure(format,null,null,MediaCodec.CONFIGURE_FLAG_ENCODE);
最后設(shè)置給MediaCodec

編碼得到的碼流都是baseline profile的

這是由于android sdk本身的限制導(dǎo)致的

ACodec.cpp里的對應(yīng)處理如下:
if (h264type.eProfile != OMX_VIDEO_AVCProfileBaseline) {
        ALOGW("Use baseline profile instead of %d for AVC recording",
            h264type.eProfile);
        h264type.eProfile = OMX_VIDEO_AVCProfileBaseline;
    }


在Android 7.0之后才移除了這段代碼挣惰。也就是說要想使用MP要求Android系統(tǒng)版本在7.0及其以上卧斟。

四、問題解決方案

4.1 方案一: 用戶上傳后先經(jīng)過服務(wù)端的轉(zhuǎn)碼后憎茂,再下發(fā)給用戶

用戶上傳的視頻可能差別很大(封裝格式珍语、編碼格式、采樣率竖幔、碼率板乙、幀率、分辨率拳氢、YUV存儲格式等等)募逞,有些播放器可能對某些視頻支持的不太好。比如:有些設(shè)備不支持HEVC的解碼馋评、有些解碼器不支持MPEG-4的編碼格式放接、有些播放器只支持YUV420P的格式、有些播放器對于幀率很高的視頻卡頓留特、有些播放器不支持播放4K等高清視頻 等等
針對上述情況纠脾,一種比較通用的做法是。用戶上傳后先經(jīng)過服務(wù)端的轉(zhuǎn)碼后蜕青,再下發(fā)給其他用戶苟蹈。進(jìn)而保證視頻再各種設(shè)備上的兼容性。

4.2 方案二右核、編碼時的profie和level設(shè)置上線閥值

profile 最大值設(shè)置為 MediaCodecInfo.CodecProfileLevel.AVCProfileHigh
Level 最大值設(shè)置為 MediaCodecInfo.CodecProfileLevel.AVCLevel52
當(dāng)從解碼器中遍歷的MediaCodecInfo.CodecProfileLevel的profie和level上述閥值時慧脱,用上述最大值。進(jìn)而保證在各種設(shè)備的兼容性贺喝。

方案1是更加通用的解決方案菱鸥,方案2則是腳痛醫(yī)腳的方案宗兼。

五、 資料

  1. H.264 and H.265 (HEVC)
  2. ffmpeg 常用命令
  3. H264編碼profile & level控制
  4. Using ffprobe to get info from a file in a nice JSON format
  5. Android MediaCodec參數(shù)筆記_
  6. Android MediaCodec h264編碼無法設(shè)為high profile

六采缚、收獲

通過本篇的學(xué)習(xí)

  1. 分析解決部分android設(shè)備上編碼的視頻针炉,ios不能播放的問題
  2. 進(jìn)一步熟悉Profile挠他、Level的意義

感謝你的閱讀
歡迎關(guān)注公眾號“音視頻開發(fā)之旅”扳抽,一起學(xué)習(xí)成長。
歡迎交流

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末殖侵,一起剝皮案震驚了整個濱河市贸呢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拢军,老刑警劉巖楞陷,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茉唉,居然都是意外死亡固蛾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門度陆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艾凯,“玉大人,你說我怎么就攤上這事懂傀≈菏” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵蹬蚁,是天一觀的道長恃泪。 經(jīng)常有香客問我,道長犀斋,這世上最難降的妖魔是什么贝乎? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮叽粹,結(jié)果婚禮上糕非,老公的妹妹穿的比我還像新娘。我一直安慰自己球榆,他們只是感情好朽肥,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著持钉,像睡著了一般衡招。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上每强,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天始腾,我揣著相機(jī)與錄音州刽,去河邊找鬼。 笑死浪箭,一個胖子當(dāng)著我的面吹牛穗椅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奶栖,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼匹表,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宣鄙?” 一聲冷哼從身側(cè)響起袍镀,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冻晤,沒想到半個月后苇羡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鼻弧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年设江,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攘轩。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡叉存,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撑刺,到底是詐尸還是另有隱情鹉胖,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布够傍,位于F島的核電站甫菠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冕屯。R本人自食惡果不足惜寂诱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望安聘。 院中可真熱鬧痰洒,春花似錦、人聲如沸浴韭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽念颈。三九已至泉粉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗡靡。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工跺撼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讨彼。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓歉井,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哈误。 傳聞我的和親對象是個殘疾皇子哩至,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容