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

制作二维码的平台青岛网站优化联系方式

制作二维码的平台,青岛网站优化联系方式,网站建设与管理实验心得,网页怎么打不开一、引言 通过FFmpeg命令可以判断出某个文件是否为AnnexB格式的H.264裸流#xff1a; 所以FFmpeg是怎样判断出某个文件是否为AnnexB格式的H.264裸流呢#xff1f;它内部其实是通过h264_probe函数来判断的。从文章《FFmpeg源码#xff1a;av_probe_input_format3函数分析》中…一、引言 通过FFmpeg命令可以判断出某个文件是否为AnnexB格式的H.264裸流 所以FFmpeg是怎样判断出某个文件是否为AnnexB格式的H.264裸流呢它内部其实是通过h264_probe函数来判断的。从文章《FFmpeg源码av_probe_input_format3函数分析》中我们可以知道 FFmpeg中实现容器格式检测的函数是av_probe_input_format3函数其内部通过循环while ((fmt1 av_demuxer_iterate(i))) 拿到所有容器格式对应的AVInputFormat结构然后通过score fmt1-read_probe(lpd)语句执行不同容器格式对应的解析函数根据是否能被解析以及匹配程度来判断出这是哪种容器格式。而AnnexB格式的H.264裸流对应的解析函数就是h264_probe函数。 二、h264_probe函数的定义 h264_probe函数定义在FFmpeg源码本文演示用的FFmpeg源码版本为5.0.3的源文件libavformat/h264dec.c中 #define MAX_SPS_COUNT 32 #define MAX_PPS_COUNT 256static int h264_probe(const AVProbeData *p) {uint32_t code -1;int sps 0, pps 0, idr 0, res 0, sli 0;int i, ret;int pps_ids[MAX_PPS_COUNT1] {0};int sps_ids[MAX_SPS_COUNT1] {0};unsigned pps_id, sps_id;GetBitContext gb;for (i 0; i 2 p-buf_size; i) {code (code 8) p-buf[i];if ((code 0xffffff00) 0x100) {int ref_idc (code 5) 3;int type code 0x1F;static const int8_t ref_zero[] {2, 0, 0, 0, 0, -1, 1, -1,-1, 1, 1, 1, 1, -1, 2, 2,2, 2, 2, 0, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2};if (code 0x80) // forbidden_bitreturn 0;if (ref_zero[type] 1 ref_idc)return 0;if (ref_zero[type] -1 !ref_idc)return 0;if (ref_zero[type] 2) {if (!(code 0x100 !p-buf[i 1] !p-buf[i 2]))res;}ret init_get_bits8(gb, p-buf i 1, p-buf_size - i - 1);if (ret 0)return 0;switch (type) {case 1:case 5:get_ue_golomb_long(gb);if (get_ue_golomb_long(gb) 9U)return 0;pps_id get_ue_golomb_long(gb);if (pps_id MAX_PPS_COUNT)return 0;if (!pps_ids[pps_id])break;if (type 1)sli;elseidr;break;case 7:skip_bits(gb, 14);if (get_bits(gb, 2))return 0;skip_bits(gb, 8);sps_id get_ue_golomb_long(gb);if (sps_id MAX_SPS_COUNT)return 0;sps_ids[sps_id] 1;sps;break;case 8:pps_id get_ue_golomb_long(gb);if (pps_id MAX_PPS_COUNT)return 0;sps_id get_ue_golomb_long(gb);if (sps_id MAX_SPS_COUNT)return 0;if (!sps_ids[sps_id])break;pps_ids[pps_id] 1;pps;break;}}}ff_tlog(NULL, sps:%d pps:%d idr:%d sli:%d res:%d\n, sps, pps, idr, sli, res);if (sps pps (idr || sli 3) res (sps pps idr))return AVPROBE_SCORE_EXTENSION 1; // 1 more than .mpgreturn 0; } 其作用就是检测某个文件是否为AnnexB格式的H.264裸流文件。 形参pd输入型参数为AVProbeData类型的指针。 AVProbeData结构体声明在libavformat/avformat.h中 /*** This structure contains the data a format has to probe a file.*/ typedef struct AVProbeData {const char *filename;unsigned char *buf; /** Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */int buf_size; /** Size of buf except extra allocated bytes */const char *mime_type; /** mime_type, when known. */ } AVProbeData; p-filename为需要被推测格式的文件的路径。 p-buf指向“存放从路径为p-filename的文件中读取出来的二进制数据”的缓冲区。 p-buf_size缓冲区p-buf的大小单位为字节。注FFmpeg判断某个文件是否为H.264裸流时不会读取完整个H.264裸流文件只会读取它前面的一部分比如最开始的2048个字节。只要根据前面的这些字节就足够判断出它的格式了所以p-buf_size的值一般就是2048。 p-mime_type一般为NULL可忽略。 返回值返回一个类型为整形的分值。返回0表示该文件完全不符合AnnexB格式的H.264裸流文件的格式。返回AVPROBE_SCORE_EXTENSION 1也就是51表示该文件比较符合AnnexB格式的H.264裸流文件的格式但还需要在av_probe_input_format3函数中执行其它容器格式对应的解析函数来进行对比最终通过最高分来确定到底是哪种容器格式。 三、h264_probe函数的内部实现原理 h264_probe函数中首先通过下面语句让变量code被赋值为十进制的4294967295也就是十六进制的0xFFFFFFFF。具体可以参考《为什么有符号数0XFFFF FFFF代表-1》 uint32_t code -1; 然后通过下面语句初始化局部变量。其中变量sps表示该路H.264码流中spsSequence parameter set的数量pps表示该路H.264码流中ppsPicture parameter set的数量变量idr表示该路H.264码流中IDR SLICECoded slice of an IDR picture的数量变量sli表示该路H.264码流中非IDR SLICECoded slice of a non-IDR picture的数量 int sps 0, pps 0, idr 0, res 0, sli 0; 检测到0x000001或0x00000001的起始码时意味读取到了某个NALU的开头将其NALU Header中的nal_ref_idc和nal_unit_type读取出来分别存贮到变量ref_idc和变量type中 for (i 0; i 2 p-buf_size; i) {code (code 8) p-buf[i];if ((code 0xffffff00) 0x100) {int ref_idc (code 5) 3;int type code 0x1F;//... 从文章《音视频入门基础H.264专题4——NALU Headerforbidden_zero_bit、nal_ref_idc、nal_unit_type简介》中可以知道NALU Header中的forbidden_zero_bit 的值应为0。所以如果检测到forbidden_zero_bit 的值为1h264_probe函数返回0表示该文件完全不符合H.264裸流文件的格式 if (code 0x80) // forbidden_bitreturn 0; 我们再来看看下面语句是什么意思 static const int8_t ref_zero[] {2, 0, 0, 0, 0, -1, 1, -1,-1, 1, 1, 1, 1, -1, 2, 2,2, 2, 2, 0, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2};//...if (ref_zero[type] 1 ref_idc)return 0;if (ref_zero[type] -1 !ref_idc)return 0;if (ref_zero[type] 2) {if (!(code 0x100 !p-buf[i 1] !p-buf[i 2]))res;}语句 if (ref_zero[type] 1 ref_idc)return 0; 的意思是根据H.264官方文档《T-REC-H.264-202108-I!!PDF-E.pdf》第65页中的表格下面表格中的红框里面的NALU重要性低它们的nal_ref_idc值应为0。如果它们的值大于0则h264_probe函数返回0表示该文件完全不符合H.264裸流文件的格式 语句 if (ref_zero[type] -1 !ref_idc)return 0; 的意思是下面红框里面的NALU重要性高它们的nal_ref_idc值应为1到3。如果它们的值为0则h264_probe函数返回0表示该文件完全不符合H.264裸流文件的格式 初始化GetBitContext结构体使得接下来可以按位读取这路H.264码流中的数据。如果初始化失败h264_probe函数返回0表示该文件完全不符合H.264裸流文件的格式关于init_get_bits8函数可以参考《FFmpeg中位操作相关的源码GetBitContext结构体init_get_bits函数、get_bits1函数和get_bits函数分析》 ret init_get_bits8(gb, p-buf i 1, p-buf_size - i - 1); if (ret 0)return 0; 然后如果上述读取到的NALU的NALU Header中的nal_unit_type为7表示该NALU为sps会执行下面语句 switch (type) { //... case 7:skip_bits(gb, 14);if (get_bits(gb, 2))return 0;skip_bits(gb, 8);sps_id get_ue_golomb_long(gb);if (sps_id MAX_SPS_COUNT)return 0;sps_ids[sps_id] 1;sps;break; //... } 上面代码块中语句 if (get_bits(gb, 2))return 0; 的意思是读取sps中的reserved_zero_2bits属性。根据H.264官方文档第44页reserved_zero_2bits的值应为0如果它不为0h264_probe函数返回0表示该文件完全不符合H.264裸流文件的格式 上面代码块中语句 sps_id get_ue_golomb_long(gb); if (sps_id MAX_SPS_COUNT)return 0; 的意思是读取sps中的seq_parameter_set_id属性。根据H.264官方文档第74页seq_parameter_set_id属性的取值范围为0 ~ 31(包括0 ~ 31)所以如果读取出来的seq_parameter_set_id大于MAX_SPS_COUNT也就是大于32h264_probe函数返回0表示该文件完全不符合H.264裸流文件的格式注个人认为这部分的FFmpeg源码写得有bug应该是 if(sps_id MAX_SPS_COUNT)才对吧因为根据官方文档seq_parameter_set_id不能为32 h264_probe函数中nal_unit_type为其它值时的处理跟sps的大同小异这里就不说了。 最后通过下面语句判断该路H.264码流中如果存在sps存在pps并且存在IDR SLICE或者非IDR SLICE的数量大于3个则返回AVPROBE_SCORE_EXTENSION 1也就是返回51意味着该文件比较符合AnnexB格式的H.264裸流文件格式 if (sps pps (idr || sli 3) res (sps pps idr))return AVPROBE_SCORE_EXTENSION 1; // 1 more than .mpgreturn 0;
http://www.zqtcl.cn/news/696401/

相关文章:

  • 深圳网站开发ucreator售后服务 网站建设
  • 做网站的语北京比较好的it公司
  • 长春建站模板制作php项目开发案例源码
  • 绍兴seo外包公司山东网站建设优化
  • php做网站知乎境外网站icp备案
  • 做seo网站图片怎么优化地坪漆东莞网站建设技术支持
  • wordpress theme forest济南优化网站排名
  • 简述网站的制作步骤合肥网站建设需
  • 网站备案的程序哪里能买精准客户电话
  • 白云网站建设网站版式
  • 做美食有哪些网站科技公司介绍
  • 网站后台被百度蜘蛛抓取哪个做网站比较好
  • 企业建设网站的需求分析百度免费发布信息平台
  • 网站建设交易中心上海装修公司排行榜
  • 桂林论坛网站有哪些在线设计平台用户分析
  • wap网站的开发去加网 wordpress
  • 博客网站建设设计论文总结php mysql做网站登录
  • 海南智能网站建设公司wordpress 如何使用php版本号
  • 河南网站开发培训app 软件开发
  • 购物网站功能介绍一流的高密网站建设
  • 电影网站怎么做优化wordpress 去掉w
  • 永久网站空间标书制作员工资很低吗
  • 做网站用到ps么淘宝优惠网站怎么做
  • jsp 淘宝网站验证码 设计搜索引擎排名
  • pdf怎么做电子书下载网站北京成立公司
  • 网站后台附件无法上传阿克苏建设网站
  • 网站和网址有什么不同佛山狮山网站建设
  • 有免费的微网站是什么可以做长图的网站
  • 南昌手机建站模板18种禁用软件黄app
  • 备案的域名做电影网站wordpress伪静态cdn配置