基于FFmpeg的Dxva2硬解码及Direct3D显示(二)
解析视频源
说明:这篇博文分为“获取视频流”和“解析视频流”两个部分,使用的是FFmpeg4.1的版本,与网上流传的低版本的API有一定的区别。
获取视频流
首先需要创建一个AVFormatContext对象,其包含了很多视频的基本信息;
m_pFmtCtx = avformat_alloc_context();
打开视频源,可以通过rtsp协议,也可以直接打开本地视频文件,或者读取内存中的数据。
通过rtsp协议:
// 以下两种rtsp格式都是可以的,主码流:main,子码流:sub,这里拉取h.264裸码流
//const char * rtsp = "rtsp://admin:密码@相机ip/main/Channels/1";
const char * rtsp = "rtsp://admin:密码@相机ip:554/h264/ch1/main/av_stream"; AVDictionary* options = NULL;
av_dict_set(&options, "stimeout", "20000", 0); // 连接超时
av_dict_set(&options, "rtsp_transport", "tcp", 0); // 设置tcp连接,默认为udp,在网络环境不好的情况下可能会丢包 // 打开视频源
avformat_open_input(&m_pFmtCtx, rtsp, NULL, &options);
打开本地文件:
const char * fileName = "C://localfile.mp4"; // 打开视频源
avformat_open_input(&m_pFmtCtx, fileName, NULL, NULL);
读取内存中的数据:
unsigned char * pIOBuffer = (unsigned char *)av_malloc(32768); // 其它大小也是可行的 // 第一个参数是为AVIOContext申请的内存地址
// 第二个参数是每次读取数据的大小,如无要求一般设为4kb
// 第三个参数是buffer是否可写
// 第四个参数是refilling(填写)buffer数据回调函数
// 第五个参数是将buffer写入磁盘的回调函数
// 第六个参数是移动读写指针的位置回调函数
AVIOContext * pAVIO = avio_alloc_context(pIOBuffer, 32768, 0, NULL, ReadData, NULL, NULL); // ReadData 为自己实现的回调函数 m_pFmtCtx->pb = pAVIO;
// 打开视频源
avformat_open_input(&m_pFmtCtx, "", NULL, NULL);
解析视频流
查找视频流并获得对应的软解码器。
// 解析数据流信息
avformat_find_stream_info(m_pFmtCtx, NULL);
// 查找视频流
// AVCodec * m_pDecoder; // 解码器
int m_videoIndex = av_find_best_stream(m_pFmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, &m_pDecoder, 0); // AVStream * m_pVideoStream; // 视频流
m_pVideoStream = m_pFmtCtx->streams[m_videoIndex];
初始化解码器上下文
// AVCodecContext * m_pDecoderCtx;
m_pDecoderCtx = avcodec_alloc_context3(m_pDecoder);
// 初始化
avcodec_parameters_to_context(m_pDecoderCtx, m_pVideoStream->codecpar);
// 打开解码器,亦即初始化 m_pDecoderCtx
avcodec_open2(m_pDecoderCtx, m_pDecoder, NULL);
初始化解码器上下文的帧率
m_pDecoderCtx->framerate = av_guess_frame_rate(m_pFmtCtx, m_pVideoStream, NULL);
基于FFmpeg的Dxva2硬解码及Direct3D显示(二)的更多相关文章
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(四)
初始化硬解码上下文 目录 初始化硬解码上下文 创建解码数据缓冲区 创建IDirectXVideoDecoder视频解码器 设置硬解码上下文 解码回调函数 创建解码数据缓冲区 这一步为了得到 LPDIR ...
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(一)
目录 前言 名词解释 代码实现逻辑 前言 关于视频软解码的资料网上比较多了,但是关于硬解可供参考的资料非常之有限,虽然总得来说软解和硬解的基本逻辑一样,但是实现细节上的差别还是比较多的.虽然目前功能已 ...
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(五)
解码及显示 目录 解码及显示 解码 显示 资源清理 解码 循环读取视频帧 AVPacket packet = { 0 }; while (av_read_frame(m_pFmtCtx, &p ...
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(三)
初始化Direct3D 目录 初始化Direct3D 创建Direct3D物理设备对象实例 创建Direct3D渲染设备实例 创建Direct3D视频解码服务 Direct3D渲染可以通过Surfac ...
- 使用C#+FFmpeg+DirectX+dxva2硬件解码播放h264流
本文门槛较高,因此行文看起来会乱一些,如果你看到某处能会心一笑请马上联系我开始摆龙门阵 如果你跟随这篇文章实现了播放器,那你会得到一个高效率,低cpu占用(单路720p视频解码播放占用1%左右cpu) ...
- 【视频开发】 ffmpeg支持的硬解码接口
To enable DXVA2, use the --enable-dxva2 ffmpeg configure switch. To test decoding, use the following ...
- [原]ffmpeg编译android 硬解码支持库 libstagefright
最近花了一天时间将ffmpeg/tools/build_stagefright执行成功,主要是交叉编译所需要的各种动态库的支持没链接上,导致各种报错,基本上网络上问到的问题我都碰到了,特此记录下来. ...
- 【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)
原文:基于NVIDIA显卡的硬编解码的一点心得 (完结) 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器 ...
- 最简单的基于FFMPEG的封装格式转换器(无编解码)
本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(相应.avi,.flv,.mkv,.mp4文件).须要注意的是,本程序并不进行视 ...
随机推荐
- 实验六 DIV+CSS的综合应用
实验六 DIV+CSS的综合应用 [实验目的] 1.掌握DIV布局的方法: 2.利用CSS对DIV进行美化: 3.利用CSS对文本图像等网页元素进行美化 [实验环境] 连接互联网的PC ,Win7操作 ...
- 多测师讲解自动化测试_rf运行无日志(解决方法)_高级讲肖sir
rf运行无日志(解决方法) 出现现象: 方法: 1.先在套件里面导入OperatingSystem库 2.在套件中新建一个关键字套件点击右键选择new user keyword关键 字的名称为:kil ...
- 【纯水题】CF 833A The Meaningless Game
题目大意 洛谷链接 现在两个人做游戏,每个人刚开始都是数字\(1\),谁赢了就能乘以\(k^2\),输的乘以\(k\),现在给你最终这两个人的得分,让你判断是否有这个可能,有可能的话输出Yes,否则输 ...
- Kibana详细入门教程
Kibana详细入门教程 目录 一.Kibana是什么 二.如何安装 三.如何加载自定义索引 四.如何搜索数据 五.如何切换中文 六.如何使用控制台 七.如何使用可视化 八.如何使用仪表盘 一.K ...
- selenium-绕过登录
第一种方式:chrome-debug 1.现在终端输入一下命令,启动Chrome-debug模式 #windows a.首先将chrome的环境添加到PATH中 b.进入cmd 命令栏,输入:chro ...
- Business Partner - 供应商与客户的集成 - S/4HANA(1)
本文基于S/4HANA 1511版本,同时大部分内容适用于S/4HANA i.e1610/1709/1809. 本文旨在为全新实施的BP配置,或从ECC到S/4HANA的供应商客户主数据迁移提供信息支 ...
- LeakCanary检测内存泄漏
内存泄漏原因: 线程造成的内存泄漏 Handler造成的内存泄漏 单例导致内存泄露 静态变量导致内存泄露 非静态内部类导致内存泄露 未取消注册(BroadcastReceiver )或回调导致内存泄露 ...
- Oracle一些常用操作语句
--创建oracle登录用户 create user CHECKDATAUSER identified by "bsoft" default tablespace PBPG ...
- E. Tree Queries 解析(思維、LCA)
Codeforce 1328 E. Tree Queries 解析(思維.LCA) 今天我們來看看CF1328E 題目連結 題目 給你一棵樹,並且給你\(m\le2e5\)個詢問(包含\(k\)個點) ...
- CodeForces 1093F Vasya and Array
题意 给一个长度为 \(n\) 的整数序列 \(a\),其中 \(a_i\) 要么为 \(-1\),要么为 \(1\sim k\) 中的整数. 求出将所有 \(-1\) 替换为 \(1\sim k\) ...