1.图像的旋转。 在编码之前旋转画面,那么编码时候的宽高,要调整成旋转后的! mAvcEncoder = AvcEncoder( mHeight,mWidth, mFramerate, mBitrate)
旋转视频后的数据,传递给解码器,一定要注意把编码器的宽高要调整,否则会花屏
2.画面质量很差!
因为编码的时候没有设置时间戳!一定要注意这是编码参数中非常重要,但是很多时候会被忽视的参数。没有时间戳画面就会花!
而且时间戳要传入采集时候的时间戳,而不要在编码的时候再传入,因为这中间涉及到转码和上面提到的旋转画面,这些时间的花费都不固定,那么在这些之后传入时间戳,播放的时候就时断时续!所以必须在采集的时候获取时间戳并传入!
比如:
private val onImageAvailableListener = ImageReader.OnImageAvailableListener { reader ->
val stamptime = System.nanoTime()//在所有之前,也就是这里获取时间戳!切记!
val readImage = reader.acquireNextImage()
var data = ImageUtil.getBytesFromImageAsType(readImage,1)
readImage.close()
// mFrames++
val ret = mAvcEncoder!!.offerEncoder(data, mH264Data,stamptime)
if (ret > 0) {
try {
showx("正在发送数据...")
mRtpSenderWrapper!!.sendAvcPacket(mH264Data, 0, ret, 0)
} catch (e: Exception) {
showx("正在发送数据...错误:"+e.toString())
}
}
}