ffmpegav_read_frame_0">摄像头原始数据读取——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
};
#endifint 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;
}