Android 音视频入门 (四)- 记录一次MediaCodec ,非科班生金九银十求职经历

主要是初始化:cameraId和outputSizes属性,前者是相机的ID,后者是相机输出的画幅尺寸。

private fun initCamera() {
//初始化相机的一些参数
val instanceOfCameraUtil = CameraUtils.getInstance(this).apply {
[email protected] = this.cameraManager!!
cameraId = this.getCameraId(false)!! //默认使用后置相机
//获取指定相机的输出尺寸列表
outPutSizes = this.getCameraOutputSizes(cameraId, SurfaceTexture::class.java)!!.get(0)
}
}

假定此时,你的Layout文件中,已经还有一个TextureView(id:textureView),我们需要声明一个TextureView.SurfaceTextureListener

private val mSurfaceTextureListener = object : TextureView.SurfaceTextureListener {
override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture, width: Int, height: Int) {

}

override fun onSurfaceTextureUpdated(surface: SurfaceTexture) {

}

override fun onSurfaceTextureDestroyed(surface: SurfaceTexture): Boolean {
return false
}

override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) {
openCameraPreview(surface, width, height)
}
}

我们需要关注的是第四个重写方法,该方法将在TextureView可用时,被回调,这时,我们就可以根据该方法来构建预览画面了,这部分的代码在网络上很多的帖子中都有做过叙述。需要注意的是,这里并不包含画面对焦等等功能,如果有需要可以自行百度一下。

四. 预览画面的构建

一开始我的设想是构建一个手机竖屏视频全屏播放器,那么(横纵)尺寸一定是:1080 * 1920。这样一来,我们输入编码器的长宽分别是:1080 * 1920,但是,我们在setPreviewCallback获得的照片数据:byte[]数组中,我们的照片是横着摆放的,这样一来,尺寸就变成了:1920 * 1080。这个数据直接送入编码器会导致画面的异常:

所以,这个一维的byte[]数组中存放的nv21数据,我们需要将它对应的位置给旋转90度,这就是rotateYUV420Degree90方法(方法参考文末的【附】ÿ

你可能感兴趣的:(程序员,面试,android,移动开发)