解析视频源

说明:这篇博文分为“获取视频流”和“解析视频流”两个部分,使用的是FFmpeg4.1的版本,与网上流传的低版本的API有一定的区别。

获取视频流

  1. 首先需要创建一个AVFormatContext对象,其包含了很多视频的基本信息;

    m_pFmtCtx = avformat_alloc_context();
  2. 打开视频源,可以通过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);

解析视频流

  1. 查找视频流并获得对应的软解码器。

    // 解析数据流信息
    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];
  2. 初始化解码器上下文

    // 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);
  3. 初始化解码器上下文的帧率

    m_pDecoderCtx->framerate = av_guess_frame_rate(m_pFmtCtx, m_pVideoStream, NULL);

基于FFmpeg的Dxva2硬解码及Direct3D显示(二)的更多相关文章

  1. 基于FFmpeg的Dxva2硬解码及Direct3D显示(四)

    初始化硬解码上下文 目录 初始化硬解码上下文 创建解码数据缓冲区 创建IDirectXVideoDecoder视频解码器 设置硬解码上下文 解码回调函数 创建解码数据缓冲区 这一步为了得到 LPDIR ...

  2. 基于FFmpeg的Dxva2硬解码及Direct3D显示(一)

    目录 前言 名词解释 代码实现逻辑 前言 关于视频软解码的资料网上比较多了,但是关于硬解可供参考的资料非常之有限,虽然总得来说软解和硬解的基本逻辑一样,但是实现细节上的差别还是比较多的.虽然目前功能已 ...

  3. 基于FFmpeg的Dxva2硬解码及Direct3D显示(五)

    解码及显示 目录 解码及显示 解码 显示 资源清理 解码 循环读取视频帧 AVPacket packet = { 0 }; while (av_read_frame(m_pFmtCtx, &p ...

  4. 基于FFmpeg的Dxva2硬解码及Direct3D显示(三)

    初始化Direct3D 目录 初始化Direct3D 创建Direct3D物理设备对象实例 创建Direct3D渲染设备实例 创建Direct3D视频解码服务 Direct3D渲染可以通过Surfac ...

  5. 使用C#+FFmpeg+DirectX+dxva2硬件解码播放h264流

    本文门槛较高,因此行文看起来会乱一些,如果你看到某处能会心一笑请马上联系我开始摆龙门阵 如果你跟随这篇文章实现了播放器,那你会得到一个高效率,低cpu占用(单路720p视频解码播放占用1%左右cpu) ...

  6. 【视频开发】 ffmpeg支持的硬解码接口

    To enable DXVA2, use the --enable-dxva2 ffmpeg configure switch. To test decoding, use the following ...

  7. [原]ffmpeg编译android 硬解码支持库 libstagefright

    最近花了一天时间将ffmpeg/tools/build_stagefright执行成功,主要是交叉编译所需要的各种动态库的支持没链接上,导致各种报错,基本上网络上问到的问题我都碰到了,特此记录下来. ...

  8. 【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)

    原文:基于NVIDIA显卡的硬编解码的一点心得 (完结) 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器 ...

  9. 最简单的基于FFMPEG的封装格式转换器(无编解码)

    本文介绍一个基于FFMPEG的封装格式转换器.所谓的封装格式转换,就是在AVI,FLV,MKV,MP4这些格式之间转换(相应.avi,.flv,.mkv,.mp4文件).须要注意的是,本程序并不进行视 ...

随机推荐

  1. 树状数组(BIT)—— 一篇就够了

    树状数组(BIT)-- 一篇就够了 前言.内容梗概 本文旨在讲解: 树状数组的原理(起源,原理,模板代码与需要注意的一些知识点) 树状数组的优势,缺点,与比较(eg:线段树) 树状数组的经典例题及其技 ...

  2. MeteoInfoLab脚本示例:读取远程文件

    利用Unidata netCDF Java库对远程文件的读取能力(OpenDAP, ADDE, THREDDS等),可以读取远程文件并绘图.脚本程序: fn = 'http://monsoondata ...

  3. 2020年9月程序员工资统计,平均14459元!你给程序员拖后腿了吗?https://jq.qq.com/?_wv=1027&k=JMPndqoM

    2020年9月全国招收程序员362409人.2020年9月全国程序员平均工资14459元,工资中位数12500元,其中95%的人的工资介于5250元到35000元. 工资与上个月持平,但是岗位有所增加 ...

  4. 利用RNN进行中文文本分类(数据集是复旦中文语料)

    利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料) 1.训练词向量 数据预处理参考利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料) ,现在我们有了分词 ...

  5. Dubbo系列之 (七)网络层那些事(2)

    辅助链接 Dubbo系列之 (一)SPI扩展 Dubbo系列之 (二)Registry注册中心-注册(1) Dubbo系列之 (三)Registry注册中心-注册(2) Dubbo系列之 (四)服务订 ...

  6. 1-1Java概述

    001_Java语言发展史 Sun公司:Stanford University Network  002Java跨平台原理 平台:指的是操作系统Windows,Mac,Linux等. 总结:在需要运行 ...

  7. H5移动端实现图片上传

    转至 :https://blog.csdn.net/qq_37610423/article/details/84319410 效果图: 我在用这个的时候发现博主少写了一些东西,导致功能无法实现,所以我 ...

  8. CC2530定时器模模式最大值计算

    首先假设 频率: f 分频系数: n 间隔定时: s 周期: T 模模式最大值: N 因为 T = 1 / f 所以 s = ( n / f ) * N  =  n * N / f 由此可得 计算模模 ...

  9. 源码安装中./configure的使用

    在linux中安装源码,在源码目录下使用 ./configure --prefix=xxx  --with=xxx 其中configure是一个可执行脚本, --prefix 选项就是配置安装的路径, ...

  10. Python包安装及使用指南

    这里长期更新一些Python第三方包的安装教程,以及使用教程... Pygame 安装教程: Windows: 首先,查看已安装的Python版本:访问https://www.lfd.uci.edu/ ...