摄像头原始数据读取——ffmpeg(av_read_frame)
摄像头原始数据读取——ffmpeg(av_read_frame)
测试代码test.cpp
#include <iostream>
#include <stdio.h>
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
#include "libavdevice/avdevice.h"
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include "libavutil/avutil.h"
#include <libavfilter/avfilter.h>
#include <libavutil/log.h>
#ifdef __cplusplus
};
#endif
int main(int argc, char *argv[])
{
int count=0;
AVPacket pack_data;
AVFormatContext *fmt_ctx = NULL;
AVDictionary *video_args = NULL;
AVInputFormat *inputformat=NULL;
avdevice_register_all();
inputformat = av_find_input_format("video4linux2");
//设置视频设备格式参数
av_dict_set(&video_args, "video_size", "1280x720", 0);
av_dict_set(&video_args, "framerate", "10", 0);
av_dict_set(&video_args, "pixel_format", "yuyv422", 0);
std::string video_dev_name = "/dev/video0";
//打开视频设备,并设置参数
int ret = avformat_open_input(&fmt_ctx, video_dev_name.c_str(), inputformat, &video_args);
if(ret < 0)
{
char errors[1024];
av_strerror(ret, errors, 1024);
std::cerr<<"failed to open video capture device:"<<errors<<std::endl;
return -1;
}
//读取视频帧数据
while((av_read_frame(fmt_ctx, &pack_data) == 0) && (count++ < 100))
{
std::string yuvfile="picture_yuv/"+std::to_string(count)+".yuv";
FILE *yuv_pic_file = fopen(yuvfile.c_str(), "wb+");
fwrite(pack_data.data, 1, pack_data.size, yuv_pic_file);
fclose(yuv_pic_file);
av_packet_unref(&pack_data); // release package data
}
return 0;
}