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

三原网站建设网站建设后期费用

三原网站建设,网站建设后期费用,建一个类似淘宝的网站需要多少钱,网页设计尺寸高度一、引言 在《音视频入门基础#xff1a;FLV专题#xff08;9#xff09;——Script Tag简介》中对Script Tag进行了简介#xff0c;本文讲述FFmpeg源码中是怎样解码FLV文件的Script Tag#xff0c;拿到里面的信息。 二、flv_read_packet函数 从《音视频入门基础#x…一、引言 在《音视频入门基础FLV专题9——Script Tag简介》中对Script Tag进行了简介本文讲述FFmpeg源码中是怎样解码FLV文件的Script Tag拿到里面的信息。 二、flv_read_packet函数 从《音视频入门基础FLV专题8——FFmpeg源码中解码Tag header的实现》可以知道FFmpeg源码中使用flv_read_packet函数来读取每个Tag的信息该函数的前半部分实现了解码Tag header获取其TagType属性的功能。然后根据TagType属性的值判断该Tag为音频Tag、视频Tag还是脚本Tag。根据Tag的类型分别执行不同的解码操作 if (type FLV_TAG_TYPE_AUDIO) {//...} else if (type FLV_TAG_TYPE_VIDEO) {//...}else if (type FLV_TAG_TYPE_META) {//...}else{//...}//... 从《音视频入门基础FLV专题9——Script Tag简介》可以知道 Script Tag  Tag header  SCRIPTDATA 未加密的情况下SCRIPTDATA  ScriptTagBody 而FFmpeg源码截止源码版本7.0.1会统一把FLV文件当做未加密来处理。 所以FFmpeg源码中Script Tag  Tag header  ScriptTagBody 如果在flv_read_packet函数的前半部分判断出该Tag为Script Tag脚本Tagflv_read_packet函数中会执行如下逻辑解码Script Tag的ScriptTagBody else if (type FLV_TAG_TYPE_META) {stream_typeFLV_STREAM_TYPE_SUBTITLE;if (size 13 1 4) { // Header-type metadata stuffint type;meta_pos avio_tell(s-pb);type flv_read_metabody(s, next);if (type 0 dts 0 || type 0) {if (type 0 flv-validate_count flv-validate_index[0].pos next flv-validate_index[0].pos - 4 next) {av_log(s, AV_LOG_WARNING, Adjusting next position due to index mismatch\n);next flv-validate_index[0].pos - 4;}goto skip;} else if (type TYPE_ONTEXTDATA) {avpriv_request_sample(s, OnTextData packet);return flv_data_packet(s, pkt, dts, next);} else if (type TYPE_ONCAPTION) {return flv_data_packet(s, pkt, dts, next);} else if (type TYPE_UNKNOWN) {stream_type FLV_STREAM_TYPE_DATA;}avio_seek(s-pb, meta_pos, SEEK_SET);}}else {av_log(s, AV_LOG_DEBUG,Skipping flv packet: type %d, size %d, flags %d.\n,type, size, flags); skip:if (avio_seek(s-pb, next, SEEK_SET) ! next) {// This can happen if flv_read_metabody above read past// next, on a non-seekable input, and the preceding data has// been flushed out from the IO buffer.av_log(s, AV_LOG_ERROR, Unable to seek to the next packet\n);return AVERROR_INVALIDDATA;}ret FFERROR_REDO;goto leave; //... leave: //...return ret;} 下面我们分析上述代码块中解码ScriptTagBody的原理。 三、flv_read_packet函数中解码ScriptTagBody的原理 从 《音视频入门基础FLV专题8——FFmpeg源码中解码Tag header的实现》中可以知道上述代码块中局部变量size存贮该Tag的Tag data的长度当该Tag为Script Tag时它的Tag data就是ScriptTagBody所以此时局部变量size存贮ScriptTagBody的长度 ​else if (type FLV_TAG_TYPE_META) {stream_typeFLV_STREAM_TYPE_SUBTITLE;if (size 13 1 4) { // Header-type metadata stuff//...} ​ 从《音视频入门基础FLV专题9——Script Tag简介》可以知道 ScriptTagBody  Name Value ScriptTagBody的Name  1字节的值为2的Type  2字节的StringLength  可变长的StringData ScriptTagBody的Value  1字节的值为8的Type 4字节的ECMAArrayLength Variables数组 3字节的终止符值固定为009 FLV文件中必然有一个名称为“onMetadata”的Script Tag。当Script Tag为“onMetadata”时ScriptTagBody的Name的StringData必为10个字节“onMetadata”总共10个字节。 所以当Script Tag为“onMetadata”时ScriptTagBody的Name  1字节的值为2的Type  2字节的StringLength 10字节的StringData“onMetadata”这时ScriptTagBody的Name固定为13字节。 ScriptTagBody的Value  1字节的值为8的Type 4字节的ECMAArrayLength Variables数组 3字节的终止符值固定为009ScriptTagBody的Value必然不小于(1 4 3)个字节。  所以整个ScriptTagBody必然不小于(13 1 4 3)个字节。 所以flv_read_packet函数解码ScriptTagBody时首先判断ScriptTagBody长度是否大于13 1 4个字节如果不大于不执行解码ScriptTagBody的操作。[个人认为FFmpeg源码中if (size 13 1 4)这部分判断不够严谨没有考虑到3字节终止符的情况应该改为if (size 13 1 4 3)] if (size 13 1 4) { // Header-type metadata stuff//...} 通过avio_tell函数得到该Script Tag的ScriptTagBody的第一个字节相对于FLV文件的文件首的偏移字节数赋值给局部变量meta_pos。关于avio_tell函数的用法可以参考《FFmpeg源码avio_tell函数分析》 meta_pos avio_tell(s-pb); 执行语句 int type; //... type flv_read_metabody(s, next); flv_read_metabody函数定义如下。可以看到flv_read_metabody函数中首先通过语句type avio_r8(ioc)得到该Tag的ScriptTagBody的Name中的Type然后通过语句amf_get_string(ioc, buffer, sizeof(buffer))得到ScriptTagBody的Name中的StringData。最后通过语句amf_parse_object(s, astream, vstream, buffer, next_pos, 0)解析ScriptTagBody的Value。从《音视频入门基础FLV专题13——FFmpeg源码中解析任意Type值的SCRIPTDATAVALUE类型的实现》中可以知道当Script Tag的名称为“onMetadata”时通过amf_parse_object函数可以解析出部分元数据属性duration、videodatarate、audiodatarate等。当amf_parse_object函数解析成功时flv_read_metabody函数返回0 static int flv_read_metabody(AVFormatContext *s, int64_t next_pos) {FLVContext *flv s-priv_data;AMFDataType type; //...// first object needs to be onMetaData stringtype avio_r8(ioc);if (type ! AMF_DATA_TYPE_STRING ||amf_get_string(ioc, buffer, sizeof(buffer)) 0)return TYPE_UNKNOWN; //...// parse the second object (we want a mixed array)if (amf_parse_object(s, astream, vstream, buffer, next_pos, 0) 0)return -1;return 0; } 所以flv_read_packet函数中如果Script Tag的名称为“onMetadata”并且解析ScriptTagBody的Value成功type的值为0 type flv_read_metabody(s, next); 该Tag为Script Tag时Tag header中的Timestamp必为0所以dts为0。所以满足条件“type 0 dts 0”执行下面大括号中的内容。执行语句goto skip if (type 0 dts 0 || type 0) {if (type 0 flv-validate_count flv-validate_index[0].pos next flv-validate_index[0].pos - 4 next) {av_log(s, AV_LOG_WARNING, Adjusting next position due to index mismatch\n);next flv-validate_index[0].pos - 4;}goto skip;} 从《音视频入门基础FLV专题8——FFmpeg源码中解码Tag header的实现》中可以知道局部变量next为该Tag对应的PreviousTagSize相对于文件首的偏移单位为字节。通过avio_seek函数把AVIOContext的文件位置指针移动到该Tag对应的PreviousTagSize处关于avio_seek函数的用法可以参考《FFmpeg源码avio_seek函数分析》。如果移动失败或者实际移动到的位置不是PreviousTagSize表示出错了flv_read_packet函数返回AVERROR_INVALIDDATA。如果没有出错flv_read_packet函数返回FFERROR_REDO skip:if (avio_seek(s-pb, next, SEEK_SET) ! next) {// This can happen if flv_read_metabody above read past// next, on a non-seekable input, and the preceding data has// been flushed out from the IO buffer.av_log(s, AV_LOG_ERROR, Unable to seek to the next packet\n);return AVERROR_INVALIDDATA;}ret FFERROR_REDO;goto leave; //... leave: //...return ret; 宏FFERROR_REDO定义如下表示数据被消耗但被丢弃被忽略的流或垃圾数据。当使用flv_read_packet函数读取名称为“onMetadata”的Script Tag时因为该Tag不是音频Tag或视频Tag不包含实际的音视频数据所以读取成功时flv_read_packet函数会返回FFERROR_REDO /*** Returned by demuxers to indicate that data was consumed but discarded* (ignored streams or junk data). The framework will re-call the demuxer.*/ #define FFERROR_REDO FFERRTAG(R,E,D,O) 四、总结 1.flv_read_packet函数的作用是读取每个Tag的信息即解码某个Tag。该函数首先会解码Tag header获取其TagType。然后根据TagType的值判断该Tag为音频Tag、视频Tag还是脚本Tag。根据Tag的类型分别执行不同的解码操作。 2.该Tag为Script Tag脚本Tag的情况下flv_read_packet函数返回一个负数FFERROR_REDO是正常的表示数据被消耗但被丢弃。
http://www.w-s-a.com/news/49506/

相关文章:

  • 网站建设实训记录企业网站建设运营
  • 视频网站文案住房和城乡建设部门
  • 汕头网站排名推广新余门户网站开发
  • 湖南智能网站建设哪家好wordpressμ
  • 公司网站备案必须是企业信息么睢宁县凌城做网站的
  • 上海网站建设公司 珍岛宁波免费自助建站模板
  • 南昌知名的网站建设公司南京网站开发选南京乐识赞
  • 外贸网站建设 深圳seo怎么提升关键词的排名
  • 网站推广效果的评价google关键词
  • 模板网站建站哪家好做微信充值网站
  • 抽奖的网站怎么做的广州小程序定制开发
  • 网站的文件夹建设企业网站公积金
  • 做网站的的价位网站建设 考试题目
  • 深圳比邻网站建设北京优化服务
  • 菏泽网站建设哪家好电子商务网络安全
  • 仿一个网站广州网站建设正规公司
  • 网站建设 目的seo网站关键词排名快速
  • 什么叫做响应式网站自媒体全平台发布
  • 企业网站 案例哪里需要人做钓鱼网站
  • 厚街东莞网站建设网站开发者调试模式
  • 网站推广营销联系方式wordpress adminlte
  • 哪些网站可以做文字链广告卖水果网站建设的策划书
  • 雕刻业务网站怎么做企业qq官网
  • 新华书店的做的数字阅读网站wordpress编辑器格式
  • jq做6个网站做什么好广西临桂建设局网站
  • 网站新闻图片尺寸南京网站设计公司
  • 重庆seo建站网站服务器 安全
  • 咸宁做网站的公司桂林网站建设兼职
  • 教做网站网站开发行业分析
  • 忻州网站建设培训友情链接交换形式有哪些