浅析Camera视频实时采集中涉及的参数配置
作者: |
蒋东国 |
时间: |
2017年1月20日 星期五 |
应用来源: |
mpu |
博客地址: |
http://blog.youkuaiyun.com/andrexpert/article/details/54631629 |
1.录制视频
(1)帧率(frame rate):在1秒钟时间里传输的图片数量,也可以理解为图形处理器每秒钟能够刷新几次,一般NTSC①是30,PAL②是25,单位FPS 或Hz。它影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。如果码率为变量,则帧率也会影响体积,帧率越高,每秒钟经过的画面越多,需要的码率也越高,体积也越大。
(2)关键帧(key frame):任何动画要表现运动或变化,至少前后要给出两个不同的关键状态,而中间状态的变化和衔接电脑可以自动完成,即表示关键状态的帧叫做关键帧。
(3)过渡帧(interim frame):在两个关键帧之间,电脑自动完成过渡画面的帧叫做过渡帧。
(4)码率(bit rate):视频中比特率又被称为码率,是指码率就是数据传输时单位时间传送的数据位数,单位是kbps即千位每秒(=1000*1bps)。它可以表示经过编码(压缩)后的音、视频数据每秒钟需要用多少个比特来表示,比特率越高,传输数据就越大,音、视频的质量就越好,但编码后的文件就越大。常见的视频码率使用场景:
* 16kbps:可视电话质量
* 128-384kbps:视频会议系统质量
* 1.25Mbps:VCD质量(使用MPEG1压缩)
* 5Mbps:DVD质量(使用MPEG2压缩)
* 8-15Mbps:高清晰度电视(HDTV) 质量(使用H.264压缩)
* 29.4 Mbps:HD DVD质量
* 40Mbps:蓝光光碟质量(使用MPEG2、H.264或VC-1压缩)
注意:码率的单位换算与网速的单位换算区别
1000 bit/s = 1 kbit/s (一千位每秒) 1024B/s = 1KB/s
1000 kbit/s = 1 Mbit/s (一兆或一百万位每秒) 1024KB/s = 1MB/s
1000 Mbit/s = 1 Gbit/s (一吉比特或十亿位每秒) 1024MB/s = 1GB/s
(5)清晰度(sharpness):指影像上各细部影纹及其边界的清晰程度。在码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰。在分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。
(6)分辨率(resolution ratio):就是屏幕图像的精密度,显示器所能显示的像素的多少。可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉点的数目。以分辨率为1024×768的屏幕来说,(即每一条水平线上包含有1024个像素点,共有768条线,总像素1024x768个),即扫描列数为1024列,行数为768行。分辨率影响图像大小,与图像大小成正比:分辨率越高,图像越大;分辨率越低,图像越小。
实例演示:使用MediaCodec将Camera采集图像编码为MP4格式视频
/**
*@decrible 视频录像,使用MediaRecorder
*
* Create by jiangdongguo on 2017-1-6 上午9:27:47
*/
public class VideoRecordRunnable implements Runnable {
private static final String filePath = Environment
.getExternalStorageDirectory().getAbsolutePath()+ File.separator+ System.currentTimeMillis() + ".mp4";
private MediaRecorder mMediaRecorder;
private Camera mCamera;
private SurfaceHolder mHolder;
public VideoRecordRunnable(Camera mCamera,SurfaceHolder mHolder) {
this.mCamera = mCamera;
this.mHolder = mHolder;
}
private void initMediaRecorder() {
if(mMediaRecorder == null){
mMediaRecorder = new MediaRecorder();
}else{
mMediaRecorder.reset();
}
//需要调unlock,否则会报异常
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mMediaRecorder.setProfile(profile);
mMediaRecorder.setOutputFile(filePath);
mMediaRecorder.setPreviewDisplay(mHolder.getSurface());
}
@Override
public void run() {
initMediaRecorder();
// 使配置生效
try {
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
stopMediaRecord();
} catch (IOException e) {
e.printStackTrace();
stopMediaRecord();
}
}