this!!.setPreviewSize(mPreviewSize.height, mPreviewSize.width)
this.setPictureSize(mPreviewSize.height, mPreviewSize.width)
this.previewFormat = CAMERA_COLOR_FORMAT
}
/**
- Camera作为生产者,生产的图像数据,交给SurfaceTexture处理。
- 或者是进一步渲染
- 或者是显示,这里设置的PreviewTexture自然是显示。
- 这里的surfaceTexture实际上是当我们‘预览’TextureView可用的时候,被回调的这个回调函数中提供了一个钩子:surfaceTexture
- 这个surfaceTexure将会作为显示的载体,直接被显示出来。
*/
mCameraDevice.setPreviewTexture(surfaceTexture)
mCameraDevice.setPreviewCallback { data, camera ->
//注意:照片的宽高是反着的,曰,而不是日
if (::mHandler.isInitialized) {
mHandler.post {
//把横版视频分辨率:1920 * 1080 转换成竖版: 1080 * 1920
val verticalData = ImageFormatUtils.rotateYUV420Degree90(data, mPreviewSize.height,mPreviewSize.width)
onFrameAvailable(verticalData)
}
}
}
mCameraDevice.startPreview()
}
五. 编码器的声明
鉴于各种设备DSP芯片的区别,各种设备支持的色彩格式等等参数也有不同,在这里我就使用在小米10上高通865可用的色彩格式之一:COLOR_FormatYUV420SemiPlanar,即NV21,接下来,我们初始化MediaCodec
和MediaMuxer
。具体支持的格式需要真正运行时动态地去判断、获取。
如果设备的DSP芯片比较差,支持的格式也更少,硬解码是无法使用的,因此也应该适时地引入手段进行软件解码(FFmpeg等等)。这里仅例举MediaCodec的使用。格式必须配套,不配套的话会导致:色彩和位置之间的偏差、偏色、花屏等等各种问题。
private val MEDIA_TYPE = MediaFormat.MIMETYPE_VIDEO_AVCprivate
val MEDIACODEC_COLOR_FORMAT = MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar//接受的编NV21
private fun initEncoder() {
val supportedColorFormat = ImageFormatUtils.getSupportColorFormat()//获取支持的色彩格式
try {
mMediaCodec = MediaCodec.createEncoderByType(MEDIA_TYPE)
mMediaFormat = MediaFormat.createVideoFormat(MEDIA_TYPE,mPreviewSize.width,mPreviewSize.heigh