問題:在視頻采集后,通過Mediacodec編碼生成h264視頻文件,播放時出現馬賽克較多,無論調整幀率、碼率、還是分辨率都不能解決問題
出現問題的原因:編碼時傳入的時間戳不對。時間戳是視頻播放的標准,應該以采集一幀畫面時的時間為准,而不應該是編碼時的時間,所以編碼時傳入的時間戳可以使用采集該幀數據時的時間。
關於網上用固定步長增加的變量作為時間戳的方式,個人認為不是很准確。
個人認為比較准確的方法就是在獲取攝像頭采集到的原始數據之后,可以通過long stamptime = System.nanoTime()獲取到當前時間戳,然后在編碼時將stamptime傳入queueInputBuffer(........)中,就可保證編碼后的視頻沒有馬賽克。
切忌stamptime在編碼時才獲取,因為在采集到編碼之間,可能需要轉換YUV格式(如采集的是YV12格式,編碼需要傳入的是YUV420sp格式),這會耗時(時間長短可能是變化的),就造成了此時的時間與原始畫面的時間間隔存在差異,如果在此時獲取stamptime傳入queueInputBuffer(........),編碼的幀在時間上不連續,形成馬賽克