当前位置: 首页 > news >正文

FFmpeg的AVIOPROBE

文章目录

    • 定义

可能你一直有疑问,ffmpeg的avformat是怎么提前知道码流是编码格式或者容器?恭喜你,看到这里,你找到答案了,在这里,ffmpeg通过这些probe函数来提前获取码流的编码格式。

看到下面的avs2_probe没有,这个就是es流进来后,avformat通过后缀avs/avs2来探测的,可能你觉得我说的前言不搭后语,对不起了,后面有时间慢慢来整理吧。

FF_DEF_RAWVIDEO_DEMUXER(avs2, "raw AVS2-P2/IEEE1857.4", avs2_probe, "avs,avs2", AV_CODEC_ID_AVS2)

下面的截图暂时了ES流进来后通过这个probe来探测是否正确
在这里插入图片描述

定义

其实这个宏是用来定义AVInputFormat的,

#define FF_DEF_RAWVIDEO_DEMUXER(shortname, longname, probe, ext, id)\
FF_DEF_RAWVIDEO_DEMUXER2(shortname, longname, probe, ext, id, AVFMT_GENERIC_INDEX)#define FF_DEF_RAWSUB_DEMUXER(shortname, longname, probe, ext, id, flag)\
const AVInputFormat ff_ ## shortname ## _demuxer = {\.name           = #shortname,\.long_name      = NULL_IF_CONFIG_SMALL(longname),\.read_probe     = probe,\.read_header    = ff_raw_subtitle_read_header,\.read_packet    = ff_raw_read_partial_packet,\.extensions     = ext,\.flags          = flag,\.raw_codec_id   = id,\.priv_data_size = sizeof(FFRawDemuxerContext),\.priv_class     = &ff_raw_demuxer_class,\
};

另外我们可以看看MP4的定义

static const AVClass mov_class = {.class_name = "mov,mp4,m4a,3gp,3g2,mj2",.item_name  = av_default_item_name,.option     = mov_options,.version    = LIBAVUTIL_VERSION_INT,
};const AVInputFormat ff_mov_demuxer = {.name           = "mov,mp4,m4a,3gp,3g2,mj2",.long_name      = NULL_IF_CONFIG_SMALL("QuickTime / MOV"),.priv_class     = &mov_class,.priv_data_size = sizeof(MOVContext),.extensions     = "mov,mp4,m4a,3gp,3g2,mj2,psp,m4b,ism,ismv,isma,f4v",.flags_internal = FF_FMT_INIT_CLEANUP,.read_probe     = mov_probe,.read_header    = mov_read_header,.read_packet    = mov_read_packet,.read_close     = mov_read_close,.read_seek      = mov_read_seek,.flags          = AVFMT_NO_BYTE_SEEK | AVFMT_SEEK_TO_PTS | AVFMT_SHOW_IDS,
};

好了就到此为止,单独列出来说的主要原因是这个probe非常重要,可以说决定了后面容器demux和codec的选择。

相关文章:

  • vue中哪些数组的方法可以做到响应式
  • 高并发如何实现单用户信息查询接口
  • 现代C++ 实现单例模式
  • Windows 11上边两个空格导致我多熬了1个多小时
  • TOGAF—架构(Architecture)项目管理
  • npm ,yarn 更换使用国内镜像源,阿里源,清华大学源
  • Tomcat 十大安全优化方法(详解版)
  • 浅析LDPC软解码对SSD延迟的影响-part1
  • 浅入浅出理解MySQL和InnoDB
  • 安装python
  • 【PHP】openssl_encrypt、openssl_decrypt对称加密解密
  • 【ArcGIS微课1000例】0079:ArcGIS Earth根据经纬坐标生成点shapefile
  • 初识Pandas函数是Python的一个库(继续更新...)
  • 在Linux上配置全局HTTP代理的详细步骤
  • Parade Series - Message Interaction
  • @angular/forms 源码解析之双向绑定
  • Angular 响应式表单之下拉框
  • Docker下部署自己的LNMP工作环境
  • JDK9: 集成 Jshell 和 Maven 项目.
  • PHP 7 修改了什么呢 -- 2
  • React as a UI Runtime(五、列表)
  • Vue全家桶实现一个Web App
  • web标准化(下)
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 爬虫模拟登陆 SegmentFault
  • 前端
  • 前嗅ForeSpider教程:创建模板
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • - 转 Ext2.0 form使用实例
  • 2017年360最后一道编程题
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # 达梦数据库知识点
  • # 计算机视觉入门
  • #QT(智能家居界面-界面切换)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (day 12)JavaScript学习笔记(数组3)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (一)插入排序
  • (一)基于IDEA的JAVA基础10
  • (转)h264中avc和flv数据的解析
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET gRPC 和RESTful简单对比
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .netcore如何运行环境安装到Linux服务器
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net连接oracle数据库
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @Mapper作用
  • @Not - Empty-Null-Blank
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题