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

广西住房建设厅网站首页网站导航自适应

广西住房建设厅网站首页,网站导航自适应,美食网页设计模板布局图,帝国cms搭建个人网站一、引言 通过FFmpeg命令#xff1a; ./ffmpeg -i XXX.ts 可以判断出某个文件是否为TS文件#xff1a; 所以FFmpeg是怎样判断出某个文件是否为TS文件呢#xff1f;它内部其实是通过mpegts_probe函数来判断的。从《FFmpeg源码#xff1a;av_probe_input_format3函数和AVI…一、引言 通过FFmpeg命令 ./ffmpeg -i XXX.ts 可以判断出某个文件是否为TS文件 所以FFmpeg是怎样判断出某个文件是否为TS文件呢它内部其实是通过mpegts_probe函数来判断的。从《FFmpeg源码av_probe_input_format3函数和AVInputFormat结构体分析FFmpeg源码5.0.3版本》和《7.0.1版本的FFmpeg源码中av_probe_input_format3函数和AVInputFormat结构体的改变》中可以知道FFmpeg源码中实现容器格式检测的函数是av_probe_input_format3函数其内部通过循环while ((fmt1 av_demuxer_iterate(i))) 拿到所有容器格式对应的AVInputFormat结构然后通过score fmt1-read_probe(lpd)语句执行不同容器格式对应的解析函数根据是否能被解析以及匹配程度来判断出这是哪种容器格式。而TS文件对应的解析函数就是mpegts_probe函数。 二、mpegts_probe函数的定义 mpegts_probe函数定义在FFmpeg源码本文演示用的FFmpeg源码版本为7.0.1的源文件libavformat/mpegts.c中 static int mpegts_probe(const AVProbeData *p) {const int size p-buf_size;int maxscore 0;int sumscore 0;int i;int check_count size / TS_FEC_PACKET_SIZE; #define CHECK_COUNT 10 #define CHECK_BLOCK 100if (!check_count)return 0;for (i 0; icheck_count; iCHECK_BLOCK) {int left FFMIN(check_count - i, CHECK_BLOCK);int score analyze(p-buf TS_PACKET_SIZE *i, TS_PACKET_SIZE *left, TS_PACKET_SIZE , 1);int dvhs_score analyze(p-buf TS_DVHS_PACKET_SIZE*i, TS_DVHS_PACKET_SIZE*left, TS_DVHS_PACKET_SIZE, 1);int fec_score analyze(p-buf TS_FEC_PACKET_SIZE *i, TS_FEC_PACKET_SIZE *left, TS_FEC_PACKET_SIZE , 1);score FFMAX3(score, dvhs_score, fec_score);sumscore score;maxscore FFMAX(maxscore, score);}sumscore sumscore * CHECK_COUNT / check_count;maxscore maxscore * CHECK_COUNT / CHECK_BLOCK;ff_dlog(0, TS score: %d %d\n, sumscore, maxscore);if (check_count CHECK_COUNT sumscore 6) {return AVPROBE_SCORE_MAX sumscore - CHECK_COUNT;} else if (check_count CHECK_COUNT sumscore 6) {return AVPROBE_SCORE_MAX/2 sumscore - CHECK_COUNT;} else if (check_count CHECK_COUNT maxscore 6) {return AVPROBE_SCORE_MAX/2 sumscore - CHECK_COUNT;} else if (sumscore 6) {return 2;} else {return 0;} } 该函数的作用就是检测某个文件是否为TS文件。 形参p输入型参数为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的TS文件中读取出来的二进制数据”的缓冲区。 p-buf_size缓冲区p-buf的大小单位为字节。注FFmpeg判断某个文件的格式时不会读取完整个文件只会读取它前面的一部分比如最开始的2048个字节。只要根据前面的这些字节就足够判断出它的格式了所以p-buf_size的值一般就是2048。 p-mime_type一般为NULL可忽略。 返回值返回一个类型为整形的分值。返回0表示该文件完全不符合TS格式。返回的值越接近100表示该文件越符合TS格式。 三、analyze函数的定义 mpegts_probe函数中会调用analyze函数analyze函数定义如下 static int analyze(const uint8_t *buf, int size, int packet_size,int probe) {int stat[TS_MAX_PACKET_SIZE];int stat_all 0;int i;int best_score 0;memset(stat, 0, packet_size * sizeof(*stat));for (i 0; i size - 3; i) {if (buf[i] 0x47) {int pid AV_RB16(buf1) 0x1FFF;int asc buf[i 3] 0x30;if (!probe || pid 0x1FFF || asc) {int x i % packet_size;stat[x];stat_all;if (stat[x] best_score) {best_score stat[x];}}}}return best_score - FFMAX(stat_all - 10*best_score, 0)/10; } 该函数的作用是检测buf指向的码流的前size个字节检测其是否符合每个transport packet又称TS包TS分组、传输流报文的长度固定为packet_size个字节的TS格式。返回一个类型为整形的分值返回的值越接近100表示越符合对应的TS格式。 从《音视频入门基础MPEG2-TS专题3——TS Header简介》可以知道TS格式有三种分别为transport packet长度固定为188、192和204字节。 analyze函数中首先会定义一个元素个数为TS_MAX_PACKET_SIZE值为204的数组stat。因为加上了FEC前向纠错的情况下一个transport packet长度为204字节而普通的MPEG2-TS传输流中一个transport packet长度固定为188字节。所以一个transport packet的最大长度为204字节所以定义数组stat的元素个数为TS_MAX_PACKET_SIZE值为204字节 int stat[TS_MAX_PACKET_SIZE];int stat_all 0;int i;int best_score 0;memset(stat, 0, packet_size * sizeof(*stat)); 判断是否读取到了值为0x47的同步字节 if (buf[i] 0x47) 如果读取到了同步字节读取TS Header中的PID属性赋值给变量pid读取TS Header中的adaptation_field_control属性将该属性的值经过运算赋值给变量asc int pid AV_RB16(buf1) 0x1FFF;int asc buf[i 3] 0x30; 如果不是探测格式!probe或该transport packet为空包pid 0x1FFF或适配域存在标志大于0asc通过取余运算判断对应的二进制数据是否符合transport packet长度为packet_size个字节的TS格式 if (!probe || pid 0x1FFF || asc) {int x i % packet_size;stat[x];stat_all;if (stat[x] best_score) {best_score stat[x];}} 不断循环每符合一次“transport packet长度为packet_size个字节”的条件时就让分值累加。最后返回最终得到的分值该分值表示符合对应的TS格式的程度 for (i 0; i size - 3; i) {//...}return best_score - FFMAX(stat_all - 10*best_score, 0)/10; 四、mpegts_probe函数的内部实现分析 宏TS_FEC_PACKET_SIZE、TS_DVHS_PACKET_SIZE、TS_PACKET_SIZE定义如下分别对应transport packet长度固定为188、192和204字节的TS格式 #define TS_FEC_PACKET_SIZE 204 #define TS_DVHS_PACKET_SIZE 192 #define TS_PACKET_SIZE 188 #define TS_MAX_PACKET_SIZE 204 mpegts_probe函数中会调用analyze函数。从上面对analyze函数的分析我们可以知道 1.语句int score analyze(p-buf TS_PACKET_SIZE     *i, TS_PACKET_SIZE     *left, TS_PACKET_SIZE     , 1)的作用是检测“p-buf TS_PACKET_SIZE*i”指向的码流符合transport packet长度固定为188字节的TS格式的程度将对应的分数赋值给变量score。 2.语句int dvhs_score analyze(p-buf TS_DVHS_PACKET_SIZE*i, TS_DVHS_PACKET_SIZE*left, TS_DVHS_PACKET_SIZE, 1)的作用是检测“p-buf TS_DVHS_PACKET_SIZE*i”指向的码流符合transport packet长度固定为192字节的TS格式的程度将对应的分数赋值给变量dvhs_score 。 3.语句int fec_score   analyze(p-buf TS_FEC_PACKET_SIZE *i, TS_FEC_PACKET_SIZE *left, TS_FEC_PACKET_SIZE , 1)的作用是检测“p-buf TS_FEC_PACKET_SIZE *i”指向的码流符合transport packet长度固定为204字节的TS格式的程度将对应的分数赋值给变量fec_score   int score analyze(p-buf TS_PACKET_SIZE *i, TS_PACKET_SIZE *left, TS_PACKET_SIZE , 1);int dvhs_score analyze(p-buf TS_DVHS_PACKET_SIZE*i, TS_DVHS_PACKET_SIZE*left, TS_DVHS_PACKET_SIZE, 1);int fec_score analyze(p-buf TS_FEC_PACKET_SIZE *i, TS_FEC_PACKET_SIZE *left, TS_FEC_PACKET_SIZE , 1); 取变量score、dvhs_score、fec_score的最大值即该码流最符合的那种TS格式的分数赋值给变量score score FFMAX3(score, dvhs_score, fec_score);sumscore score;maxscore FFMAX(maxscore, score); 返回最终表示符合程度的分数 sumscore sumscore * CHECK_COUNT / check_count;maxscore maxscore * CHECK_COUNT / CHECK_BLOCK;ff_dlog(0, TS score: %d %d\n, sumscore, maxscore);if (check_count CHECK_COUNT sumscore 6) {return AVPROBE_SCORE_MAX sumscore - CHECK_COUNT;} else if (check_count CHECK_COUNT sumscore 6) {return AVPROBE_SCORE_MAX/2 sumscore - CHECK_COUNT;} else if (check_count CHECK_COUNT maxscore 6) {return AVPROBE_SCORE_MAX/2 sumscore - CHECK_COUNT;} else if (sumscore 6) {return 2;} else {return 0;} 五、总结 从上面我们可以知道FFmpeg检测某个文件是否为TS文件是通过判断是否读取到了同步字节以及同步字节之间的transport packet长度是否固定为188或192或204个字节实现的。
http://www.eeditor.cn/news/126202/

相关文章:

  • 富拉尔基网站建设火车头wordpress发布图片
  • 吉林省长春市建设局网站龙岩刚刚发生的事
  • 让别人做网站推广需要多少钱平台网站怎么做seo
  • 温州网站推广效果好温州市网站
  • 有机生态农业网站模板网站建设网站建设教程
  • 网站基础建设网站做cdn需要多少钱
  • 广州响应式网站制作常用的网页设计工具
  • 带数字 网站 域名网站功能策划书
  • 河北集团网站建设我要建设一个网站
  • 可以做任务的创意设计网站闵行虹桥网站建设
  • app 排名网站网站兼容设置
  • 央企网站建设机械网站推广怎么做
  • 有没有悬赏做ppt的网站wordpress d8 3.0
  • 做网站 什么语言深圳 网站 传播
  • 酒店要做关于网站ppt怎么做咸阳学校网站建设费用
  • 如何学习做网站建设功能网站价格
  • 宿迁市建设局投诉网站wordpress指定文章评论
  • 企业网站建设要素南郊网站建设报价
  • 设计公司网站应该包括的信息科技企业网站如何建设
  • 手机网站制作设计建网站的论坛
  • 大竹网站建设天津站建站时间
  • 用路由器做网站wordpress文章显示摘要
  • 汉中网站建设公司推荐wordpress 收费阅读
  • ppt模板有哪些网站做生产计划类的网站
  • 深圳做网站优化报价运河建设管理网站
  • 网站的投票 计数模块怎么做上海的室内设计公司
  • 查看网站开发技术如何做好网络宣传
  • 网站备案材料金戈西地那非片
  • 网站后台首页模板做外包胡it网站
  • 网站建设培训学校广州精美网站建设