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

网站导航自适应wordpress页面数据库

网站导航自适应,wordpress页面数据库,网站开发进度缓慢,河南网站建设找工作一、引言 通过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.hkea.cn/news/14477078/

相关文章:

  • wordpress 网站重置合肥 网站制作
  • 北京商城网站开发多个端口网站如何做域名重定向
  • 网站建设属于技术活吗专业建网站平台
  • 犀牛云建设网站网站怎么做代码优化
  • 嘉定网站建设上海市人才招聘信息官网
  • 网站规划步骤用自己点电脑做电影网站
  • 培训网站开发哪个好wordpress 仿站步骤
  • 做网站什么软件南充网站建设hulingwl
  • 高端制作网站服务哪里学网站建设推广
  • 四大商业网站外网网站有什么好的推荐
  • php网站 上传团购网站 网上 收费 系统
  • 南京手机网站设计哪里专业o2o的典型电子商务平台
  • 宁夏水利厅建设管理处网站西安建网站的公司
  • 建设服装网站的论文免费做网络推广
  • .net网站方案行业网站建设费用明细
  • 网站模板减肥网络推广文案
  • 广州网站建设设计哪些做直播卖食品的网站有哪些
  • 建立公司网站流程建设网站平台需要什么硬件配置
  • 上海方正大厦网站建设首页图片点击率如何提高
  • 广告公司网站(附falsh及源代码)河北网站建设报价
  • 建设一个属于自己网站宿豫区城乡建设局网站
  • 个人或主题网站建设实验体会重庆网站建设狐灵科技
  • 有什么手机网站工程交易网
  • 网站制作策划帝国cms 网站地址设置
  • 建一个英文网站需要多少钱公司网站建设合规吗
  • 做一个网站成本多少钱域名服务器查询
  • 哪个网站做高中的题好网站开发 工资高吗
  • 沂南网站优化有没有大人和小孩做的网站
  • 没有网站怎样做外贸手机怎么制作游戏软件教程
  • 吴江网站建设公司重庆高端网站设计公司