FFmpeg获取摄像头数据并编码为H.264

来源:互联网 发布:看漫画软件mangameeya 编辑:程序博客网 时间:2024/06/03 22:59
       ffmpeg的视音频编解码功能非常强大,可以说包括了所有的视音频编码标准。在这里我主要是调用ffmpeg工程里的ffmpeg.exe文件,调用之后,会自动完成编码的操作。内部编码的具体流程,以后再慢慢的看。


1.介绍

       先介绍下ffmpeg里面的三个exe文件。

       我们打开ffmpeg的官网,下载时会发现有三个版本,分别是Dev、Shared、Static。Dev是开发版本,里面包含有库文件(.lib)和头文件(.h),但是没有exe文件。Shared文件夹里面有ffmpeg.exe、ffplay.exe、ffprobe.exe,除此之外还有一些dll文件,比如说avcodec-58.dll、avdevice-58.dll等。它的exe文件比较小,运行时需要调用dll的功能。Static文件夹里面只有三个exe,dll文件被集成在exe里面了,所以它的exe文件比较大。Shared版本和Static版本可以在命令行中打开,我们打开系统命令行界面,切换目录,就可以运行。

       ffmpeg.exe:用于转码的应用程序。举个例子,我们把input.avi转码为output.h264,代码如下:

ffmpeg -i input.avi -b:v 640k output.ts

       内部的具体参数可以参考这里。


       ffplay.exe:用于播放的应用程序。一个简单的播放例子:

ffplay test.avi  

       具体的使用方法和快捷键可以参考雷神的博客这里。


       ffprobe.exe:用于查看文件格式的应用程序。


2.环境配置

        具体的环境配置可以参考这里。


3.调用摄像头

       环境配置好后,我们先尝试用ffmpeg调用自己的摄像头。

       可以打开命令行程序,跳转到ffmpeg.exe的文件夹,输入以下命令调用摄像头。也可以利用C++的winexec()函数打开摄像头,程序如下。

       命令行命令:

       在VS工程里打开摄像头的代码:

#include <stdio.h>#include <windows.h>int main(int, char**){char* CommandVedio = "ffplay -f dshow -i video=""HD Pro Webcam C920";    WinExec(CommandVedio, SW_SHOW);return 0;}

      关于winexec()函数的解释,我在这里有分析。点击打开链接

      "HD Pro Webcam C920"是我的摄像头名称,如果不知道,可以用以下的命令来获取自己的设备称号。

ffmpeg -list_devices true -f dshow -i dummy  

       运行后,会出现下面的结果。这里的video devices和audio devices就是自己的视频和音频设备。

       除了上面的方式外,我们也可以利用VFW读取摄像头的数据。

ffplay -f vfwcap -i 0  


4.编码

       调用摄像头后,将其编码为H.264,只需要在原来的基础上添加几个命令即可。

ffmpeg -f dshow -i video="HD Pro Webcam C920" -vcodec libx264 mycamera.h264  

       或者这样



ffmpeg -f vfwcap -i 0 -vcodec libx264 mycamera.h264 

       和上面一样,如果想在VS工程里运行,代码如下

#include <stdio.h>#include <windows.h>int main(int, char**){char* opencamera = "ffmpeg -f vfwcap -i 0 -vcodec libx264 mycamera.h264";//char* opencamera = "ffmpeg -f dshow -i video=""HD Pro Webcam C920"" -vcodec libx264 mycamera.h264 ";    WinExec(opencamera, SW_SHOW);return 0;}

       编码后的h264文件保存在VS的工程目录下,其实这里不仅仅可以生成h264,也可以改为mycamera.avi/mkv等格式。

       这里只是学会了如何调用ffmpeg.exe文件进行编码,对于内部的编码流程,以及许多重要的函数,并没有做太多了解。 ffmpeg的编码过程其实是调用了libx264库完成的,所以我们可以不需要ffmpeg的源代码,直接调用libx264库,将输入的YUV数据编码为h264,这也是自己接下来的学习任务。


阅读全文
0 0