1.打开视频设备
static AVFormatContext* open_dev()
{int ret &#61; 0;char errors[1024] &#61;{0,};AVFormatContext *fmt_ctx &#61; NULL;AVDictionary *options&#61; NULL;char * devicename &#61; "0";avdevice_register_all();AVInputFormat *iformat &#61; av_find_input_format("avfoundation");av_dict_set(&options,"video_size","640x480", 0);av_dict_set(&options,"framerate","30", 0);av_dict_set(&options,"pixel_format","nv12", 0);ret &#61; avformat_open_input(&fmt_ctx, devicename, iformat,&options);if(ret < 0){av_strerror(ret, errors, 1024);fprintf(stderr, "Failed to open device,[%d]%s\n",ret,errors);return NULL;}return fmt_ctx;
}&#96;在这里插入代码片&#96;
2.yuv数据采集
void rec_video()
{int ret &#61; 0;AVFormatContext *fmt_ctx &#61; NULL;AVPacket pkt;av_log_set_level(AV_LOG_DEBUG);rec_status &#61; 1;char *out &#61;"/users/test/Downloads/video.yuv";FILE * outfile &#61; fopen(out,"wb&#43;");fmt_ctx &#61; open_dev();if(NULL &#61;&#61; fmt_ctx){av_log(NULL, AV_LOG_DEBUG, "&#61;&#61;&#61;&#61;&#61;ERROR&#61;&#61;&#61;&#61;&#61;&#61;!\n");goto __ERROR;}av_log(NULL, AV_LOG_DEBUG, "test 11111111!\n");while(rec_status){ret &#61; av_read_frame(fmt_ctx, &pkt);if (ret &#61;&#61; 0){ fwrite(pkt.data,1,460800, outfile);av_packet_unref(&pkt);}else if (ret &#61;&#61; AVERROR(EAGAIN)){ continue;}else{ break;}av_packet_unref(&pkt);}__ERROR:if(outfile){fclose(outfile);}if(fmt_ctx){avformat_close_input(&fmt_ctx);}av_log(NULL, AV_LOG_DEBUG, "finish!\n");return;
}
播放&#xff1a;
ffplay -pix_fmt nv12 -s 640x480 video.yuv
不指定格式时&#xff0c;播放出来的时黑白色的&#xff0c;估计是默认的格式