FFmpeg中有一个和多媒体设备交互的类库:libavdevice。使用这个库可以读取电脑(或者其他设备上)的多媒体设备的数据,或者输出数据到指定的多媒体设备上。
常见的输入端设备:
alsa
avfoundation
fbdev
openal
oss
pulse
video4linux2, v4l2
常见的输出端设备:
alsa
decklink
fbdev
opengl
oss
pulse
sdl
采集一帧图像:在Linux平台上可以使用video4linux2打开视频设备,图像格式由摄像头决定。
代码:
#include <stdio.h>
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libavdevice/avdevice.h"
void get_one_frame(const char *dev, const char *picfile) {
// 查找设备前要先调用avdevice_register_all
AVInputFormat *in_fmt = in_fmt = av_find_input_format("video4linux2");
if (in_fmt == NULL) {
printf("can't find_input_format\n");
return ;
}
AVFormatContext *fmt_ctx = NULL;
if (avformat_open_input(&fmt_ctx, dev, in_fmt, NULL) < 0) {
printf("can't open_input_file\n");
return ;
}
// printf device info
av_dump_format(fmt_ctx, 0, dev, 0);
AVPacket *packet = (AVPacket *)av_malloc(sizeof(*packet));
av_read_frame(fmt_ctx, packet);
printf("data length: %d\n", packet->size);
FILE *fp = fopen(picfile, "w+");
fwrite(packet->data, 1, packet->size, fp);
fclose(fp);
av_free_packet(packet);
avformat_close_input(&fmt_ctx);
}
int main(int argc, char const* argv[])
{
avdevice_register_all();
get_one_frame("/dev/video0", "output.yuv");
return 0;
}
运行结果:
注意:打开设备/dev/video0需要root权限
查看图像:yuy2格式,1280x720