目前通過圖像識(shí)別的方式區(qū)分視頻類型,并已完成應(yīng)用層的實(shí)現(xiàn),識(shí)別率很高
相比通過獲取視頻文件特征標(biāo)識(shí)的方式?
優(yōu)點(diǎn):
1.不用修改系統(tǒng)的MediaScanner?所以不用升級(jí)系統(tǒng)
2.視頻文件中一般只有mp4文件有metadata?其中box和uuid之類的特征標(biāo)識(shí)并沒有標(biāo)準(zhǔn)行業(yè)規(guī)范 所以通過圖像識(shí)別的方式 沒有文件格式和視頻編解碼的限制
缺點(diǎn):
1.比獲取視頻文件特征標(biāo)識(shí)的方式速度慢
基本思路
1.對(duì)一個(gè)視頻 根據(jù)播放時(shí)長(zhǎng)平均取若干幀圖像 根據(jù)每幀圖像識(shí)別后 返回的類型 做加權(quán) 最后權(quán)值大于40%?則為該類型
2.判斷流程:
先判斷左右眼3d? --- true ---?返回3d類型 --- false ---?
判斷上下眼3d --- true ---?返回3d類型--- false ---?
判斷全景?--- true ---?返回全景--- false --- 返回2d
3.判斷左右眼3d:取圖像最中間一列像素 作為基準(zhǔn)線 判斷該列和其右邊一列是否有連續(xù)性 如果不連續(xù) 則為左右眼3d
但很多3d視頻左右眼寬度不相等 所以一次判斷不是 還需要多判斷幾次 即左右各移動(dòng)兩次 每次移動(dòng)一列
4.判斷上下眼3d:取圖像最中間一行像素 作為基準(zhǔn)線 判斷該行和其下面一行是否有連續(xù)性 如果不連續(xù) 則為上下眼3d
但很多3d視頻上下眼高度不相等 所以一次判斷不是 還需要多判斷幾次 即上下各移動(dòng)兩次 每次移動(dòng)一行
5.判斷全景視頻:由于全景視頻是360度的 所以圖像最左邊一列(第0列)和最右邊一列(第n-1列) 必然可以連接起來 所以判斷這兩列是否有連續(xù)性 如果連續(xù) 則為全景視頻
后面發(fā)現(xiàn)還存在如下問題
1.視頻取幀速度慢 取一幀需要幾百毫秒 所以性能瓶頸不在算法的時(shí)間復(fù)雜度 而是調(diào)用系統(tǒng)函數(shù)取視頻幀慢
2.加權(quán)閥值40%?不合適 如果取兩幀 則權(quán)重閥值為0了 至少應(yīng)為50%?取幀的數(shù)量會(huì)影響耗時(shí)
3.如果視頻有片頭或片尾 比如黑色畫面 顯示演員列表之類的 對(duì)于圖像判斷連續(xù)性及加權(quán)結(jié)果 有很大影響
4.無論左右眼還是上下眼3d?很多視頻 中間會(huì)有間隙或黑線 視頻分辨率越高則間隙或黑線所占像素的行列越多 所以僅僅移動(dòng)像素行列兩次 是沒用的
5.視頻畫面很暗 則對(duì)判斷像素的連續(xù)性 有影響
我的解決辦法及優(yōu)化
1.跳過視頻時(shí)長(zhǎng)的前后10%的時(shí)間段 認(rèn)為是片頭或片尾 對(duì)視頻中間的時(shí)間段取幀
2.取10幀或者取1幀 其實(shí)大部分情況下 在圖像上的特征沒有區(qū)別?3d視頻左右或上下有對(duì)稱性 全景最左和最右可以連接起來 所以只取1幀 不考慮加權(quán) 耗時(shí)減少一個(gè)量級(jí)
3.在不影響識(shí)別結(jié)果的情況下 對(duì)原始的視頻幀圖像進(jìn)行等比例壓縮 減少實(shí)時(shí)的內(nèi)存占用 更少的像素判斷次數(shù) 耗時(shí)減少
4.每個(gè)視頻文件 不用每次應(yīng)用啟動(dòng)都進(jìn)行識(shí)別 可以緩存文件的hash值和視頻類型的識(shí)別結(jié)果 后面啟動(dòng)不需要再識(shí)別之前已經(jīng)識(shí)別過的視頻文件 只需讀取緩存過的識(shí)別結(jié)果
5.判斷左右眼3d改為: 取左右眼各自區(qū)域圖像的最中間一列像素 判斷兩列像素是否有連續(xù)性 如果連續(xù) 即說明圖像對(duì)稱 則為左右眼3d?但很多3d視頻左右眼寬度不相等 所以一次判斷不是 還需要多判斷幾次 即右眼區(qū)域圖像左右各移動(dòng)兩次 每次移動(dòng)一列 這樣就不需要判斷取圖像中間列 即不存在有黑線和間隙的問題
6.判斷上下眼3d改為: 取上下眼各自區(qū)域圖像的最中間一行像素 判斷兩行像素是否有連續(xù)性 如果連續(xù) 即說明圖像對(duì)稱 則為上下眼3d?但很多3d視頻上下眼高度不相等 所以一次判斷不是 還需要多判斷幾次 即下眼區(qū)域圖像上下各移動(dòng)兩次 每次移動(dòng)一行 這樣就不需要判斷取圖像最中間行 即不存在有黑線和間隙的問題
目前依然存在的問題
1.視頻畫面很暗 則對(duì)判斷像素的連續(xù)性 有影響
2.經(jīng)測(cè)試 調(diào)用系統(tǒng)函數(shù)對(duì)視頻取幀 在樂視X2和S2的安卓6.0以上 存在兼容性問題
還需要做的優(yōu)化
1.不用系統(tǒng)函數(shù)對(duì)視頻取幀 改用第三方FFMPEG編解碼庫 并將其中取幀的部分提取出來 提高取幀速度
Q : 如何判斷兩列(行)像素連續(xù)性或相似性
A :?
1.依次取出該列(行)的像素顏色值 對(duì)顏色值做位運(yùn)算(要考慮各通道占位ARGB8888、RGB565、RGB444) 取出RGB三通道的值 兩列(行)相同索引像素的RGB值分別求均值(兩列或行差值的絕對(duì)值累加求和/該列或行的像素?cái)?shù)) 取RGB三通道中的最大均值
2.同上 再對(duì)RGB三通道分別求方差(( 兩列或行差值的絕對(duì)值-兩列或行的均值)的平方的累加求和/該列或行的像素?cái)?shù)) 取RGB三通道中的最大方差
3.求出的最大均值或最大方差 若超過閥值 則說明無連續(xù)性或低相似性