ffmpeg —— v4l2获取摄像头图像

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;
}

运行结果:

image-20210508233416019注意:打开设备/dev/video0需要root权限

查看图像:yuy2格式,1280x720


参考:av_find_input_format和avformat_open_input函数分析

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值