当前位置: 首页 > 编程日记 > 正文

FFmpeg通过摄像头实现对视频流进行解码并显示测试代码(旧接口)

这里通过USB摄像头(注:windows7/10下使用内置摄像头,linux下接普通的usb摄像头(Logitech))获取视频流,然后解码,最后再用opencv显示。用到的模块包括avformat、avcodec和avdevice。libavdevice库是libavformat的一个补充库(complementary library)。主要涉及到的接口函数包括:注:其中一些接口是被废弃的旧接口

1. avdevice_register_all:初始化libavdevice库并注册所有输入输出设备;

2. av_find_input_format:根据输入格式的名字查找AVInputFormat,在测试代码中,windows平台使用”vfwcap”(video for windows capture),linux平台使用”v4l2”(Video4Linux2);

3. avformat_alloc_context:分配AVFormatContext;

4. avformat_open_input:打开输入流并读取header;

5. avformat_find_stream_info:读取媒体文件的数据包以获取流信息;

6. 通过AVFormatContext中AVStream查找视频/音频流索引,这里在windows10下获取到的编码类型为mjpeg即AV_CODEC_ID_MJPEG,像素格式为yuv422p即AV_PIX_FMT_YUVJ422P;在linux或windows7下获取到的编码类型为rawvideo即AV_CODEC_ID_RAWVIDEO,像素格式yuyv422即AV_PIX_FMT_YUYV422;可见摄像头类型不同获取到的编码类型和像素格式可能也不同;

7. avcodec_find_decoder:由codec ID查找已注册的解码器;

8. avcodec_open2:初始化AVCodecContext;

9. av_frame_alloc:分配一个AVFrame并设置它的字段为默认值;

10. av_malloc:为一个AVPacket分配内存块;

11. sws_getContext:分配一个SwsContext;

12. av_read_frame:获取流即packet(AVPacket);

13. avcodec_decode_video2:解码视频帧,从流数据到图像数据;

14. sws_scale:转换图像格式;

15. av_free_packet:释放AVPacket;

16. av_frame_free:释放由av_frame_alloc分配的AVFrame;

17. sws_freeContext:释放由sws_getContext分配的SwsContext;

18. av_free:释放由av_malloc分配的AVPacket;

19. avformat_close_input:关闭打开的AVFormatContext并释放。

测试代码(test_ffmpeg_decode_show.cpp):

#include "funset.hpp"
#include <stdio.h>
#include <iostream>
#include <memory>
#include <fstream>#ifdef __cplusplus
extern "C" {
#endif#include <libavdevice/avdevice.h>
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
#include <libavutil/mem.h>
#include <libavutil/imgutils.h>#ifdef __cplusplus
}
#endif#include <opencv2/opencv.hpp>int test_ffmpeg_decode_show_old()
{avdevice_register_all();#ifdef _MSC_VERconst char* input_format_name = "vfwcap";const char* url = "";
#elseconst char* input_format_name = "video4linux2";const char* url = "/dev/video0";
#endifAVInputFormat* input_fmt = av_find_input_format(input_format_name);AVFormatContext* format_ctx = avformat_alloc_context();int ret = avformat_open_input(&format_ctx, url, input_fmt, nullptr);if (ret != 0) {fprintf(stderr, "fail to open url: %s, return value: %d\n", url, ret);return -1;}ret = avformat_find_stream_info(format_ctx, nullptr);if (ret < 0) {fprintf(stderr, "fail to get stream information: %d\n", ret);return -1;}int video_stream_index = -1;for (int i = 0; i < format_ctx->nb_streams; ++i) {const AVStream* stream = format_ctx->streams[i];if (stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {video_stream_index = i;fprintf(stdout, "type of the encoded data: %d, dimensions of the video frame in pixels: width: %d, height: %d, pixel format: %d\n",stream->codecpar->codec_id, stream->codecpar->width, stream->codecpar->height, stream->codecpar->format);}}if (video_stream_index == -1) {fprintf(stderr, "no video stream\n");return -1;}AVCodecContext* codec_ctx = format_ctx->streams[video_stream_index]->codec;AVCodec* codec = avcodec_find_decoder(codec_ctx->codec_id);if (!codec) {fprintf(stderr, "no decoder was found\n");return -1;}ret = avcodec_open2(codec_ctx, codec, nullptr);if (ret != 0) {fprintf(stderr, "fail to init AVCodecContext: %d\n", ret);return -1;}AVFrame* frame = av_frame_alloc();AVPacket* packet = (AVPacket*)av_malloc(sizeof(AVPacket));SwsContext* sws_ctx = sws_getContext(codec_ctx->width, codec_ctx->height, codec_ctx->pix_fmt, codec_ctx->width, codec_ctx->height, AV_PIX_FMT_BGR24, 0, nullptr, nullptr, nullptr);if (!frame || !packet || !sws_ctx) {fprintf(stderr, "fail to alloc\n");return -1;}int got_picture = -1;std::unique_ptr<uint8_t[]> data(new uint8_t[codec_ctx->width * codec_ctx->height * 3]);cv::Mat mat(codec_ctx->height, codec_ctx->width, CV_8UC3);int width_new = 320, height_new = 240;cv::Mat dst(height_new, width_new, CV_8UC3);const char* winname = "usb video1";cv::namedWindow(winname);while (1) {ret = av_read_frame(format_ctx, packet);if (ret < 0) {fprintf(stderr, "fail to av_read_frame: %d\n", ret);continue;}if (packet->stream_index == video_stream_index) {ret = avcodec_decode_video2(codec_ctx, frame, &got_picture, packet);if (ret < 0) {fprintf(stderr, "fail to avcodec_decode_video2: %d\n", ret);av_free_packet(packet);continue;}if (got_picture) {uint8_t* p[1] = { data.get() };int dst_stride[1] = { frame->width * 3 };sws_scale(sws_ctx, frame->data, frame->linesize, 0, codec_ctx->height, p, dst_stride);mat.data = data.get();cv::resize(mat, dst, cv::Size(width_new, height_new));cv::imshow(winname, dst);}}av_free_packet(packet);int key = cv::waitKey(25);if (key == 27) break;}cv::destroyWindow(winname);av_frame_free(&frame);sws_freeContext(sws_ctx);av_free(packet);avformat_close_input(&format_ctx);fprintf(stdout, "test finish\n");return 0;
}

执行结果如下:

GitHub:https://github.com//fengbingchun/OpenCV_Test

相关文章:

IOS数据存储之文件沙盒存储

前言&#xff1a; 之前学习了数据存储的NSUserDefaults&#xff0c;归档和解档&#xff0c;对于项目开发中如果要存储一些文件&#xff0c;比如图片&#xff0c;音频&#xff0c;视频等文件的时候就需要用到文件存储了。文件沙盒存储主要存储非机密数据&#xff0c;大的数据。 …

剖析Focal Loss损失函数: 消除类别不平衡+挖掘难分样本 | CSDN博文精选

作者 | 图像所浩南哥来源 | CSDN博客论文名称&#xff1a;《 Focal Loss for Dense Object Detection 》论文下载&#xff1a;https://arxiv.org/pdf/1708.02002.pdf论文代码&#xff1a;https://github.com/facebookresearch/Detectron/tree/master/configs/12_2017_baselines…

windows下mysql开启慢查询

mysql在windows系统中的配置文件一般是my.ini,我的路径是c:\mysql\my.ini,你根据自己安装mysql路径去查找[mysqld]#The TCP/IP Port the MySQL Server will listen onport3306#开启慢查询log-slow-queries E:\Program Files\MySQL\MySQL Server 5.5\mysql_slow_query.loglong_…

FFmpeg通过摄像头实现对视频流进行解码并显示测试代码(新接口)

在https://blog.csdn.net/fengbingchun/article/details/93975325 中给出了通过旧接口即FFmpeg中已废弃的接口实现通过摄像头获取视频流然后解码并显示的测试代码&#xff0c;这里通过使用FFmpeg中的新接口再次实现通过的功能&#xff0c;主要涉及到的接口函数包括&#xff1a;…

iOS经典讲解之获取沙盒文件路径写入和读取简单对象

#import "RootViewController.h" interface RootViewController () end 实现文件&#xff1a; implementation RootViewController - (void)viewDidLoad { [super viewDidLoad]; [self path]; [self writeFile]; [self readingFi…

Google最新论文:Youtube视频推荐如何做多目标排序

作者 | 深度传送门来源 | 深度传送门&#xff08;ID:deep_deliver&#xff09;导读&#xff1a;本文是“深度推荐系统”专栏的第十五篇文章&#xff0c;这个系列将介绍在深度学习的强力驱动下&#xff0c;给推荐系统工业界所带来的最前沿的变化。本文主要介绍下Google在RecSys …

Jmeter 笔记

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库&#xff0c; FTP 服务器&#…

王贻芳院士:为什么中国要探究中微子实验?

演讲嘉宾 | 王贻芳&#xff08;中国科学院院士、中科院高能物理研究所所长&#xff09;整理 | 德状出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;日前&#xff0c;在2019腾讯科学WE大会期间&#xff0c;中国科学院院士、高能物理研究所所长王贻芳分享了中微子与光电…

一个苹果证书供多台电脑开发使用——导出p12文件

摘要 在苹果开发者网站申请的证书&#xff0c;是授权mac设备的开发或者发布的证书&#xff0c;这意味着一个设备对应一个证书&#xff0c;但是99美元账号只允许生成3个发布证书&#xff0c;两个开发证书&#xff0c;这满足不了多mac设备的使用&#xff0c;使用p12文件可以解决这…

FFmpeg中AVDictionary介绍

FFmpeg中的AVDictionary是一个结构体&#xff0c;简单的key/value存储&#xff0c;经常使用AVDictionary设置或读取内部参数&#xff0c;声明如下&#xff0c;具体实现在libavutil模块中的dict.c/h&#xff0c;提供此结构体是为了与libav兼容&#xff0c;但它实现效率低下&…

RocketMQ3.2.2生产者发送消息自动创建Topic队列数无法超过4个

问题现象RocketMQ3.2.2版本&#xff0c;测试时尝试发送消息时自动创建Topic&#xff0c;设置了队列数量为8&#xff1a;producer.setDefaultTopicQueueNums(8);同时设置broker服务器的配置文件broker.properties&#xff1a;defaultTopicQueueNums16但实际创建后从控制台及后台…

iOS各种宏定义

#ifndef MacroDefinition_h #define MacroDefinition_h //************************ 获取设备屏幕尺寸********************************************** //宽度 #define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width //高度 #define SCREENH_HEIGHT [UIScree…

开源库libuuid简介及使用

libuuid是一个开源的用于生成UUID(Universally Unique Identifier&#xff0c;通用唯一标识符)的库&#xff0c;它的源码可从https://sourceforge.net/projects/libuuid/ 下载&#xff0c;最新版本为1.0.3&#xff0c;更新于2013年4月27日&#xff0c;此库仅支持在类Linux下编译…

深度学习会议论文不好找?这个ConfTube网站全都有

BDTC大会官网&#xff1a;https://t.csdnimg.cn/q4TY作者 | 刘畅 出品 | AI科技大本营&#xff08;ID:rgznai1000&#xff09;最近跟身边的硕士生、博士生聊天&#xff0c;发现有一个共同话题&#xff0c;大家都想要知道哪款产品能防止掉头发&#xff1f;养发育发已经成了茶余饭…

Java用for循环Map

为什么80%的码农都做不了架构师&#xff1f;>>> 根据JDK5的新特性,用For循环Map,例如循环Map的Key for(String dataKey : paraMap.keySet()) { System.out.println(dataKey ); } 注意的是,paraMap 是怎么样定义的,如果是简单的Map paraMap new …

iOS 应用发布到AppStore流程

iOS开发者&#xff0c;把开发出来的App上传到App Store是必须的。下面就来详细介绍下具体流程。 方法/步骤 1打开苹果开发者中心 打开后点击&#xff1a;Member Center 2如果你的电脑没有保存密码&#xff0c;则会提示你输入开发者帐号和密码&#xff0c;因为我的电脑已经保存了…

FFmpeg中编码类型为rawvideo无须解码直接显示测试代码

在 https://blog.csdn.net/fengbingchun/article/details/93975325 中介绍过通过FFmpeg可以直接获取usb视频流并解码显示的测试代码&#xff0c;当时通过usb获取到的视频流编码类型为AV_CODEC_ID_RAWVIDEO&#xff0c;像素格式为AV_PIX_FMT_YUYV422&#xff0c;其实编码类型为r…

一场高质量的技术盛会怎样炼成?「2019中国大数据技术大会」蓄势待发,还不快上车?...

2019年12月&#xff0c;一场轰动国内产业界、学术界、科研界及投资领域的顶级科技盛会即将拉开帷幕&#xff0c;它涵盖大数据、人工智能、云计算、AIoT、金融科技、智能制造等十几个前沿领域的热门话题。在过去十二年里&#xff0c;这场盛会从最初仅 60 余人参加的技术沙龙到如…

融合应用11.1.8安装,一步一步的引导

融合应用11.1.8安装,一步一步的引导 融合应用11.1.8 安装并不是简单的与电子商务套件11 i / R12安装。 所以我们需要安装划分为许多步骤。 请注意,11.1.8 11.1.7总统发布供应是几乎相同的。 在同一时间的步骤和一些组件11.1.6和11.1.5相比有所不同。 这里我们有实际使用同一个…

FFmpeg中一个线程获取视频流一个线程执行scale测试代码

在https://blog.csdn.net/fengbingchun/article/details/94712986 中介绍过如果usb视频流编码类型为rawvideo则无需进行解码&#xff0c;可直接通过av_read_frame获取视频流然后再通过sws_scale进行像素格式转换&#xff0c;当在高分辨率情况下&#xff0c;有时达不到实时显示&…

医疗影像处理:去除医疗影像中背景的影响2D/3D【numpy-code】| CSDN博文精选

BDTC大会官网&#xff1a;https://t.csdnimg.cn/q4TY作者 | chestnut--来源 | CSDN博客在医疗影像中特别是CT影像&#xff0c;包含大量的背景&#xff0c;在进行器官分割时&#xff0c;首先去除背景对分割的效果有很好的提升。本博客使用Python处理医疗影像并去除背景的影像。使…

iOS APP提交上架最新流程

iOS APP提交上架最新流程 反复提交的过程中对上架流程熟悉了好多&#xff0c;写篇帖子送给同为菜鸟的你&#xff0c;如果里面有很菜的东西&#xff0c;大牛请自动忽略&#xff0c;毕竟这也是还为菜鸟的我的备忘录呢&#xff01; 首先得描述一下各个证书的定位&#xff0c;作…

Spring mvc Data Redis—Pub/Sub(附Web项目源码)

一、发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候&#xff0c;我们称这个客户端为发布者(publisher)。 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候&#xff0c;我们称这个客户端为订阅者(subscriber)。 为了解耦发布者(publish…

iOS分析崩溃日志

前言 iOS分析定位崩溃问题有很多种方式&#xff0c;但是发布到AppStore的应用如果崩溃了&#xff0c;我们该怎么办呢&#xff1f;通常我们都会在系统中接入统计系统&#xff0c;在系统崩溃的时候记录下崩溃日志&#xff0c;下次启动时将日志发送到服务端&#xff0c;比较好的第…

海思3559A上编译FFmpeg源码操作步骤

1. 从https://github.com/FFmpeg/FFmpeg/releases 下载你需要的版本&#xff1b; 2. 因为ffmpeg编译选项较多&#xff0c;为了更方便的了解有哪些选项&#xff0c;可将编译选项写入到一个文本文件configure_help.txt中&#xff0c;执行&#xff1a; ./configure --help > …

不到顶会现场也能听论文讲解?这个视频集合网站值得收藏

BDTC大会官网&#xff1a;https://t.csdnimg.cn/q4TY作者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai1000&#xff09;最近跟身边的硕士生、博士生聊天&#xff0c;发现有一个共同话题&#xff0c;大家都想要知道哪款产品能防止掉头发&#xff1f;养发育发已经成了茶余饭…

通过cat /proc/cpuinfo看处理器特点

2019独角兽企业重金招聘Python工程师标准>>> 在我的服务器上执行cat /proc/cpuinfo得到如下信息&#xff08;摘录最后一项&#xff0c;从0-23共24项&#xff09;&#xff1a; processor: 23&#xff1a;超线程技术的虚拟逻辑核第24个 vendor_id: GenuineIntel&#…

2016cocoapods安装流程及使用

一&#xff1a;参考安装流程&#xff1a;http://blog.csdn.NET/showhilllee/article/details/38398119/。 二&#xff1a;我的安装步骤。 1:安装cocoapods需要ruby&#xff0c;先查看ruby环境是不是最新版本。如果不是最新版本&#xff0c;需要先升级到最新版本。在终端输入以下…

FFmpeg中拉取rtsp视频流并缩放显示测试代码

之前在https://blog.csdn.net/fengbingchun/article/details/92198857中给出过仅拉取rtsp视频流的测试代码&#xff0c;这里在此代码的基础上进行扩充&#xff0c;包括设置使用多线程进行解码&#xff0c;使用sws_scale函数进行图像格式转换和缩放&#xff0c;并通过OpenCV进行…

全面分析阿里数据中台,小白也能看懂 | CSDN原力计划

扫码参与CSDN“原力计划”作者 | yuanziok来源 | CSDN原力计划获奖作品数据中台被誉为大数据的下一站&#xff0c;由阿里兴起&#xff0c;核心思想是数据共享&#xff0c;2015年阿里提出“大中台&#xff0c;小前台”的策略。2018 年因为“腾讯数据中台论”&#xff0c;中台再度…