一.背景
1.問題視頻在iphone7p等機(jī)型上:視頻無法正常播放(黑屏),音頻正常播放即寒。
2.問題視頻在iphone XR機(jī)型上:音視頻均能正常播放堆缘。
二.斷點(diǎn)分析
1.問題視頻在iphone7p上創(chuàng)建VideoToolBox
解碼器成功溜宽,解碼失斉鲂住(解碼中失敗IJKPlayer
不能自動(dòng)切換FFmpeg
軟解碼)故俐,視頻畫面無法正常播放分瘾。
解碼失敗錯(cuò)誤碼:
kVTVideoDecoderBadDataErr = -12909
胎围。
2.問題視頻在iphone XR上創(chuàng)建VideoToolBox
解碼器失敗,IJKPlayer
自動(dòng)切換FFmpeg
軟解碼,軟解碼成功白魂,視頻畫面正常播放汽纤。
解碼器創(chuàng)建失敗錯(cuò)誤碼:
kVTVideoDecoderMalfunctionErr = -12911
3.以上現(xiàn)象說明此視頻無法使用VideoToolBox
硬解碼。
VideoToolBox
為蘋果官方提供的編解碼庫福荸,使用GPU硬編解碼蕴坪。官方文檔對(duì)錯(cuò)誤碼未提供更詳細(xì)的信息。
三.格式分析
1.使用ffprobe
分析問題視頻的碼流格式敬锐,包完整性等均未發(fā)現(xiàn)問題辞嗡。
2.使用ffprobe
分析問題視頻與正常視頻格式,對(duì)比發(fā)現(xiàn)滞造,正常視頻為幀編碼,掃描方式為逐行掃描栋烤。問題視頻為場(chǎng)編碼谒养,掃描方式為隔行掃描。
逐行掃描視頻的表示方法為:720p明郭,1080p买窟,p是progressive“逐行”的縮寫。
隔行掃描視頻的表示方法為:720i薯定,1080i始绍,i是interlace“交錯(cuò)”的縮寫。
四.驗(yàn)證VideoToolBox
是否支持場(chǎng)編碼
1.測(cè)試一:將幀編碼視頻轉(zhuǎn)碼為場(chǎng)編碼格式視頻(逐行轉(zhuǎn)隔行)话侄。
測(cè)試二:將問題視頻轉(zhuǎn)碼為幀編碼視頻(隔行轉(zhuǎn)逐行)亏推。
使用
FFmpeg
命令行:
逐行轉(zhuǎn)隔行:
ffmpeg -i input.mp4 -aspect 16:9 -c:v h264 -b:v 4000k -minrate 4000k -maxrate 4000k -bufsize 2000k -dc 9 -flags +ilme+ildct -alternate_scan 1 -top 0 output.mp4隔行轉(zhuǎn)逐行:
ffmpeg -i input.mp4 -aspect 16:9 -c:v h264 -b:v 4000k -minrate 1000k -maxrate 2000k -bufsize 2000k -dc 9 -deinterlace output.mp4
2.轉(zhuǎn)碼后使用MediaInfo
工具檢查是否轉(zhuǎn)碼成功。
逐行視頻在“掃描方式”處顯示“逐行掃描”或“progressive”年堆。
隔行視頻在“掃描方式”處顯示“MBAFF”或“interlace”等吞杭。“掃描順序”為“奇數(shù)場(chǎng)優(yōu)先”等(逐行掃描無奇偶場(chǎng)概念)变丧。
3.導(dǎo)入IJKPlayer
驗(yàn)證芽狗,幀編碼(逐行掃描)視頻硬解碼成功。場(chǎng)編碼(隔行掃描)視頻解碼失敗痒蓬。
(后續(xù)會(huì)增加測(cè)試視頻樣本量童擎,確保驗(yàn)證的可靠性)
五.解決方案
1.iOS端解決方案:在VideoToolBox
解碼器創(chuàng)建前判斷視頻為場(chǎng)編碼還是幀編碼,若為場(chǎng)編碼攻晒,則直接走硬解碼器創(chuàng)建失敗流程顾复,切換為FFmpeg
軟解碼,避免出現(xiàn)硬解碼創(chuàng)建成功而解碼失敗的問題炎辨。
判斷方法:提取H264
中的SPS
序列參數(shù)集信息捕透。根據(jù)SPS
的句法,通過frame_mbs_only_flag
,mb_adaptive_frame_field_flag
乙嘀,field_pic_flag
三個(gè)字段判斷末购。
2.服務(wù)端解決方案:將場(chǎng)編碼視頻轉(zhuǎn)碼為幀編碼。
實(shí)際上虎谢,如果是會(huì)議或培訓(xùn)等畫面內(nèi)容變動(dòng)不大的視頻盟榴,使用幀編碼更為合適,可有效去除空間冗余婴噩,畫面更清晰擎场。