Android 音视频入门 (四)- 记录一次MediaCodec + MediaMuxer的使用

=======

调用Android Camera组件,获取预览时的byte[]数组,之后渲染到Activity的TextureView中,同时采用MediaCodec进行AVC(即H264)编码,使用MediaMuxer进行打包,生成MP4文件。

二. 架构设计

整个功能模块分为如下几个子功能:

  1. 相机组件的使用(权限申请、预览画面的获取、尺寸设置等等,暂时不包括对焦,因为主要是编码功能)
  2. TextureView的使用(将预览画面渲染到屏幕上)
  3. MediaCodec的使用(MediaFormat的选择、bufferQueue等等)
  4. MediaMuxer的使用(混合器,混合H264视频码流和音频码流,音频码流暂时还没加入,后期有时间再加入)

三. 相机组件

这里采用的是Android.Hardware.Camera类,注意区分Android.graphic.CameraAndroid.Hardware.Camera2,前者是用于3D图形绘制的工具,而后者是新的Camera操作类,这里选择的是第一代的Camera。

首先最重要的一件事就是在清单中,申请权限。

拿到权限后,我们需要对 Camera进行初始化:

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

private fun initCamera() {
//初始化相机的一些参数
val instanceOfCameraUtil = CameraUtils.getInstance(this).apply {
this@CameraActivity.cameraManager = 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可用时,被回调,这时,我们就可以根据该方法来构建预览画面了,这部分的代码在网络上很多的帖子中都有做过叙述。需要注意的是,这里并不包含画面对焦等等功能,如果有需要可以自行百度一下。

  • 27
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值