热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ffmpegyuv数据采集

1.打开视频设备staticAVFormatContext*open_dev(){intret0;charerrors[1024]{0,};AVFormatContext*fm

1.打开视频设备

static AVFormatContext* open_dev()
{int ret &#61; 0;char errors[1024] &#61;{0,};AVFormatContext *fmt_ctx &#61; NULL;AVDictionary *options&#61; NULL;//0:0 前面的0是视频设备&#xff0c;后面的0是音频设备&#xff0c;这里只采集视频//0 是机器摄像头//1 是桌面char * devicename &#61; "0";//av_register_all();// 1.注册所有的编解码器和音视频格式avdevice_register_all();//2.选取mac对应的avfoundation库//mac 上使用avfoundation&#xff0c;windows上面使用directshow&#xff0c;linux使用alsaAVInputFormat *iformat &#61; av_find_input_format("avfoundation");//video_size 指定分辨率的大小av_dict_set(&options,"video_size","640x480", 0);av_dict_set(&options,"framerate","30", 0);av_dict_set(&options,"pixel_format","nv12", 0);//av_dict_set(&options,"list_devices","true",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){ // 读取成功// 将数据写入文件//&#xff08;宽x高&#xff09;x&#xff08;yuv420&#61;1.5/yuv422&#61;2/yuv444&#61;3&#xff09;字节//fwrite的第三个形参长度是以为字节为单位的//nv12是yuv420的一种存储格式fwrite(pkt.data,1,460800, outfile);// 释放资源&#xff0c;此处必须释放&#xff0c;每次av_read_frame都会增加引用计数&#xff0c;av_packet_unref释放引用计数&#xff0c;等到引用计数为0的时候&#xff0c;资源被释放av_packet_unref(&pkt);}else if (ret &#61;&#61; AVERROR(EAGAIN)){ // 资源临时不可用//此处会引起cpu占用率过高continue;}else{ // 其他错误//errbuf[1024];//av_strerror(ret, errbuf, sizeof (errbuf));//av_log(NULL, AV_LOG_INFO, "errbuf is %s \n",errbuf);break;}// 必须要加&#xff0c;释放pkt内部的资源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;估计是默认的格式


推荐阅读
  • ffmpeg  spydroid jrtplib
    2019独角兽企业重金招聘Python工程师标准手机上采用Spydroid程序。https:github.comfyhertzspydroid-ipcamera先用libcu ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
author-avatar
恋若寒1999
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有