linux视频采集命令 linux视频处理

FFmpeg有什么用? FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等,核心功能作用如下 。
视频采集功能
ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可
以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用 。
ffmpeg在Linux下的视频采集
在Linux平台上,ffmpeg对V4L2的视频设备提供了很好的支持,如:
./ffmpeg -t 10 -f video4linux2 -s 176*144 -r 8 -i /dev/video0 -vcodec h263 -f rtp rtp://192.168.1.105:5060/tmp/ffmpeg.sdp
以上命令表示:采集10秒钟视频,对video4linux2视频设备进行采集,采集QCIF(176*144)的视频,每秒8帧,视频设备为/dev/video0,视频编码为h263,输出格式为RTP,后面定义了IP地址及端口( 百事网),将该码流所对应的SDP文件重定向到/tmp/ffmpeg.sdp中,将此SDP文件上传到流媒体服务器就可以实现直播了 。
ffmpeg在windows下的视频采集
在windows下关于ffmpeg视频采集的资料非常少,但是ffmpeg还是支持windows下视频采集的 。ffmpeg支持windows下video for windows(VFW)设备的视频采集,不过VFW设备已经过时,正在被WDM的视频设备所取代,但是ffmpeg还没有支持WDM的计划,不过好像有将WDM转为VFW的工具,因此ffmpeg还是可以在windows下进行视频采集的 。
视频格式转换功能
ffmpeg视频转换功能 。视频格式转换,比如可以将多种视频格式转换为flv格式,可不是视频信号转换。
ffmpeg可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod等),例如可以将摄录下的视频avi等转成视频网站所采用的flv格式 。
视频截图功能
对于选定的视频,截取指定时间的缩略图 。视频抓图,获取静态图和动态图,不提倡抓gif文件;因为抓出的gif文件大而播放不流畅 。
给视频加水印功能
使用ffmpeg 视频添加水印(logo) 。
如何实现嵌入式Linux下USB摄像头视频采集在linux下所有设备都是文件 。所以对摄像头的操作其实就是对文件的操作 。USB摄像头的设备文件就是在/dev目录下的video0(假如只有一个摄像头) 。在linux下操作摄像头就是使用v4l2对摄像头进行视频的操作,操作步骤如下
1. 打开设备文件 。
int fd=open(”/dev/video0″,O_RDWR);
2. 取得设备的capability , 看看设备具有什么功能,比如是否具有视频输入,或者音频输入输出等 。VIDIOC_QUERYCAP,struct v4l2_capability
v4l2_std_id std;
do {
ret= ioctl(fd, VIDIOC_QUERYSTD, std);
} while (ret == -1errno == EAGAIN);
switch (std) {
case V4L2_STD_NTSC:
//……
case V4L2_STD_PAL:
//……
}
3. 选择视频输入,一个视频设备可以有多个视频输入 。VIDIOC_S_INPUT,struct v4l2_input(可不要)
4. 设置视频的制式和帧格式,制式包括PAL,NTSC,帧的格式个包括宽度和高度等 。
VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format
struct v4l2_format fmt;
memset ( fmt, 0, sizeof(fmt) );
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 320;
fmt.fmt.pix.height = 240;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
if (ioctl(fd, VIDIOC_S_FMT, fmt)0)
{
printf("set format failed\n");
//return 0;
}
5. 向驱动申请帧缓冲,一般不超过5个 。struct v4l2_requestbuffers
struct v4l2_requestbuffers req;
memset(req, 0, sizeof (req));
req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
if (ioctl(fd,VIDIOC_REQBUFS,req) == -1)
{
perror("VIDIOC_REQBUFS error \n");
//return -1;
}
6.申请物理内存
将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制 。将申请到的帧缓冲全部入队列 , 以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer

推荐阅读