默认情况下,在Neoshine Linux3.0的环境中,直接通过configure配置好项目,并make编译出来的FFMPEG库是不支持v4l2视频接口的,也就是不支持 linux下的视频二代接口v4l2,此时仅支持一代接口v4l;那么为什么会出现这种情况呢?
经过探究,出现这个问题的原因是FFMPEG项目所带的configure文件在进行配置运行时,有一个步骤是检测系统是否支持v4l2,查看configure文件得知其采用的是以下方法--
# check for video4linux2 --- V4L2_PIX_FMT_YUV420
cat > $TMPC << EOF
#include <sys/time.h>
#include <linux/videodev.h>
int dummy = V4L2_PIX_FMT_YUV420; // 检测是否包含了videodev2.h文件;此文件中存在V4L2_PIX_FMT_YUV420定义;(lsosa注)
EOF
$cc -c -o $TMPE $TMPC 2> /dev/null || v4l2="no"
由最后这句shell语句我们可以看出来,只有文件$TMPC编译成功了,我们的FFMPEG库才会加进来对v4l2的支持,那么我们照猫画虎,采用以下的相关步骤进行顺藤摸瓜,查看这里到底出了什么问题,导致最终并没有将v4l2加进来; 在终端中我们运行以下命令:
[root@localhost tmp]# cat > main.c << EOF
> #include <sys/time.h>
> #include <linux/videodev.h>
> int dummy = V4L2_PIX_FMT_YUV420;
> EOF
这段命令是仿上面的一段shell脚本所做,目的是新建一个文件main.c,文件内容是后来输入的部分,文件以EOF结束;
然后编译这个文件:
[root@localhost tmp]# cc -c -o main main.c
In file included from main.c:2:
/usr/include/linux/videodev.h:56: error: syntax error before "ulong"
/usr/include/linux/videodev.h:72: error: syntax error before '}' token
结果出现了以上的错误,原来如此,这就是configure在配置的时候没有将v4l2加进来的问题所在了;
我们打开系统文件:
[root@localhost tmp]# vi /usr/include/linux/videodev.h
查看56行,发现附近并没有ulong的定义,于是寻找其中的头文件,最终在它所包含的<linux/types.h>头文件中发现了 ulong类型的typedef定义,但是为什么这里并没有检测到types文件中的定义,而仍然报这个错误呢?我在这里做了以下尝试,以图寻找原因:
#cd /tmp
#pwd
/tmp
#gcc -C -E /usr/include/linux/videodev.h > main.pre // -C和-E需要联合使用,目的是只是预处理这个文件,并不编译为二进制代码;
#vi main.pre
这是main.pre文件
以下是摘抄了其中的ulong附近的部分预处理代码,通篇再也找不到它的定义了;
struct video_channel
{
int channel;
char name[32];
int tuners;
__u32 flags;
__u16 type;
__u16 norm; /* Norm set by channel */
};
struct video_tuner
{
int tuner;
char name[32];
ulong rangelow, rangehigh; /* Tuner range */
__u32 flags;
# 66 "/usr/include/linux/videodev.h" 3 4
__u16 mode; /* PAL/NTSC/SECAM/OTHER */
__u16 signal; /* Signal strength 16bit scale */
};
struct video_picture
{
__u16 brightness;
__u16 hue;
__u16 colour;
__u16 contrast;
__u16 whiteness; /* Black and white only */
__u16 depth; /* Capture depth */
__u16 palette; /* Palette in use */
# 101 "/usr/include/linux/videodev.h" 3 4
};
既然在此文件中确实没有ulong的定义,也难怪要报上面的那个错误了;至于原因嘛,我经过几次尝试,也仍然没有找到最终的原因 不过,在文件<linux/types.h>中的ulong的定义上方我们可以看到// sysv字样,在往上几行,还可以看到
"The following typedefs are also protected by individual ifdefs for
historical reasons:"
的字样,意思是这几个类型定义由于历史的原因被保护起来了,不能使用,那算了,想其它辙吧;
原因没有找到,但是解决方法还是有的,其中一种较好的解决方法就是将ulong更改为unsigned long类型即可,然后重新configure配置FFMPEG项目,make编译即可;这样就达到了让我们的FFMPEG库支持v4l2的目的;