要想拍摄出高清无码,摄像头很关键。
摄像头有两个重要的参数,一个是分辨率,一个是帧频。
附: 设备测试demo源码下载
Size就是摄像头的分辨率,MaxFrameRate是指摄像头采集能达到的最大帧频。
当然,我这个摄像头比较low,录制高清无码肯定是不行的。
附: 设备测试demo源码下载
现在选定的是1280*720,帧频为30fps。
录制得到的视频的参数信息如下:
附: 视频录制demo源码下载
明明摄像头能达到30fps,为什么实际录制的是视频只有13fps呢?
什么方法来做到实时查看摄像头采集达到的帧频值呢?
很简单。
1.先设置一个计数器来记录采集得到的帧数。
2.创建一个轮询线程来显示帧数每秒的增量,即是fps值。
private ICapturer audioCapturer;//音频采集器 private ICapturer videoCapturer;//视频采集器 private VideoFileMaker videoFileMaker;//视频录制器 private Thread examineFrameCount;//帧数轮询线程 private int frameCount = 0;//采集得到的图片帧计数 private int deltaFrameCount = 0;//一段时间内帧数增量 private int frameRate = 30; // 采集视频的帧频 private bool sizeRevised = false;// 是否需要将图像帧的长宽裁剪为4的整数倍
视频采集事件处理方法代码:
void Form1_ImageCaptured(Bitmap img) { this.frameCount++; this.DisplayVideo((Bitmap)img.Clone()); Bitmap imgRecorded = img; if (this.sizeRevised) // 对图像进行裁剪, MFile要求录制的视频帧的长和宽必须是4的整数倍。 { imgRecorded = ESBasic.Helpers.ImageHelper.RoundSizeByNumber(img, 4); img.Dispose(); } this.videoFileMaker.AddVideoFrame(imgRecorded); //快速释放内存 if (this.frameCount % (2 * this.frameRate) == 0) { this.frameCount = 0; GC.Collect(); } }
轮询方法的代码:
private void SearchCount(object tag)//轮询方法 { while (true) { int referenceCount = this.frameCount; System.Threading.Thread.Sleep(1000); this.deltaFrameCount = this.frameCount - referenceCount; this.ShowCount(); } }
这样,我们就能查看摄像头采集的帧频的实时值了。
摄像头标定的最大帧频,指的是峰值;而录制生成的文件的帧频,指的是均值。而且,摄像头实际能达到的采集帧频与画面的明暗和变化程度都有关。画面越明亮,画面变化程度越小,录制得到的帧频的值越大。