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

唐山免费做网站莱芜吧贴吧最新消息

唐山免费做网站,莱芜吧贴吧最新消息,基于php旅游网站开发源代码,免费做qq互赞网站音视频入门基础#xff1a;H.264专题系列文章#xff1a; 音视频入门基础#xff1a;H.264专题#xff08;1#xff09;——H.264官方文档下载 音视频入门基础#xff1a;H.264专题#xff08;2#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础… 音视频入门基础H.264专题系列文章 音视频入门基础H.264专题1——H.264官方文档下载 音视频入门基础H.264专题2——使用FFmpeg命令生成H.264裸流文件 音视频入门基础H.264专题3——EBSP, RBSP和SODB 音视频入门基础H.264专题4——NALU Headerforbidden_zero_bit、nal_ref_idc、nal_unit_type简介 音视频入门基础H.264专题5——FFmpeg源码中 解析NALU Header的函数分析 音视频入门基础H.264专题6——FFmpeg源码从H.264码流中提取NALU Header、EBSP、RBSP和SODB 音视频入门基础H.264专题7——FFmpeg源码中 指数哥伦布编码的解码实现 音视频入门基础H.264专题8——H.264官方文档的描述符 音视频入门基础H.264专题9——SPS简介 音视频入门基础H.264专题10——FFmpeg源码中存放SPS属性的结构体和解码SPS的函数分析 音视频入门基础H.264专题11——计算视频分辨率的公式 音视频入门基础H.264专题12——FFmpeg源码中通过SPS属性计算视频分辨率的实现 音视频入门基础H.264专题13——FFmpeg源码中通过SPS属性获取视频色彩格式的实现 音视频入门基础H.264专题14——计算视频帧率的公式 音视频入门基础H.264专题15——FFmpeg源码中通过SPS属性获取视频帧率的实现 音视频入门基础H.264专题16——FFmpeg源码中判断某文件是否为H.264裸流文件的实现 音视频入门基础H.264专题17——FFmpeg源码获取H.264裸流文件信息视频压缩编码格式、色彩格式、视频分辨率、帧率的总流程 一、引言 在上一节《音视频入门基础H.264专题14——计算视频帧率的公式》中讲述了通过SPS中的属性计算H.264编码的视频的帧率的公式。本文讲解FFmpeg源码中计算视频帧率的实现。 二、FFmpeg源码中计算视频帧率的实现 从文章《音视频入门基础H.264专题10——FFmpeg源码中存放SPS属性的结构体和解码SPS的函数分析》中我们可以知道FFmpeg源码中通过ff_h264_decode_seq_parameter_set函数解码SPS从而拿到SPS中的属性。 计算视频帧率所需的属性在SPS的VUI parameters视频可用参数中。ff_h264_decode_seq_parameter_set函数通过调用decode_vui_parameters函数解码VUI parameters int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx,H264ParamSets *ps, int ignore_truncation) { //...sps-vui_parameters_present_flag get_bits1(gb);if (sps-vui_parameters_present_flag) {int ret decode_vui_parameters(gb, avctx, sps);if (ret 0)goto fail;}//... } decode_vui_parameters函数中通过下面的这部分代码拿到计算视频帧率所需的属性timing_info_present_flag、num_units_in_tick、time_scale static inline int decode_vui_parameters(GetBitContext *gb, void *logctx,SPS *sps) { //...sps-timing_info_present_flag get_bits1(gb);if (sps-timing_info_present_flag) {unsigned num_units_in_tick get_bits_long(gb, 32);unsigned time_scale get_bits_long(gb, 32);if (!num_units_in_tick || !time_scale) {av_log(logctx, AV_LOG_ERROR,time_scale/num_units_in_tick invalid or unsupported (%u/%u)\n,time_scale, num_units_in_tick);sps-timing_info_present_flag 0;} else {sps-num_units_in_tick num_units_in_tick;sps-time_scale time_scale;}sps-fixed_frame_rate_flag get_bits1(gb);}//... } 然后在FFmpeg源码的源文件libavcodec/h264_parser.c的parse_nal_units函数中通过如下代码得到视频帧率 static inline int parse_nal_units(AVCodecParserContext *s,AVCodecContext *avctx,const uint8_t * const buf, int buf_size) {//...for (;;) {switch (nal.type) {case H264_NAL_SPS:ff_h264_decode_seq_parameter_set(nal.gb, avctx, p-ps, 0);break;//...case H264_NAL_IDR_SLICE://...if (sps-timing_info_present_flag) {int64_t den sps-time_scale;if (p-sei.unregistered.x264_build 44U)den * 2;av_reduce(avctx-framerate.den, avctx-framerate.num,sps-num_units_in_tick * avctx-ticks_per_frame, den, 1 30);}//... }//...} } 可以看到在FFmpeg源码的parse_nal_units函数中最终是通过语句 av_reduce(avctx-framerate.den, avctx-framerate.num,sps-num_units_in_tick * avctx-ticks_per_frame, den, 1 30); 计算出视频帧率的。 上述函数av_reduce的实参avctx-ticks_per_frame是结构体AVCodecContext的成员变量它会被设置为每帧的时基的时钟数。默认值为1如果编解码器是H.264或MPEG-2会被设置为2 typedef struct AVCodecContext {/*** For some codecs, the time base is closer to the field rate than the frame rate.* Most notably, H.264 and MPEG-2 specify time_base as half of frame duration* if no telecine is used ...** Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2.*/int ticks_per_frame; } 用户需要获取H.264编码的视频的媒体信息时会调用avformat_find_stream_info函数而该函数内部会调用h264_decode_init函数让avctx-ticks_per_frame被初始化为2也就是说对于H.264avctx-ticks_per_frame的值就是2 static av_cold int h264_decode_init(AVCodecContext *avctx) { //...if (avctx-ticks_per_frame 1) {if(h-avctx-time_base.den INT_MAX/2) {h-avctx-time_base.den * 2;} elseh-avctx-time_base.num / 2;}avctx-ticks_per_frame 2; //... } 所以在parse_nal_units函数中语句 av_reduce(avctx-framerate.den, avctx-framerate.num,sps-num_units_in_tick * avctx-ticks_per_frame, den, 1 30); 等价于 av_reduce(avctx-framerate.den, avctx-framerate.num,sps-num_units_in_tick * 2, den, 1 30); 而den的值为sps-time_scale。所以上述语句等价于 av_reduce(avctx-framerate.den, avctx-framerate.num,sps-num_units_in_tick * 2, sps-time_scale, 1 30); av_reduce函数是用来计算视频帧率的其源码定义在FFmpeg源码libavutil/rational.c中 int av_reduce(int *dst_num, int *dst_den,int64_t num, int64_t den, int64_t max) {AVRational a0 { 0, 1 }, a1 { 1, 0 };int sign (num 0) ^ (den 0);int64_t gcd av_gcd(FFABS(num), FFABS(den));if (gcd) {num FFABS(num) / gcd;den FFABS(den) / gcd;}if (num max den max) {a1 (AVRational) { num, den };den 0;}while (den) {uint64_t x num / den;int64_t next_den num - den * x;int64_t a2n x * a1.num a0.num;int64_t a2d x * a1.den a0.den;if (a2n max || a2d max) {if (a1.num) x (max - a0.num) / a1.num;if (a1.den) x FFMIN(x, (max - a0.den) / a1.den);if (den * (2 * x * a1.den a0.den) num * a1.den)a1 (AVRational) { x * a1.num a0.num, x * a1.den a0.den };break;}a0 a1;a1 (AVRational) { a2n, a2d };num den;den next_den;}av_assert2(av_gcd(a1.num, a1.den) 1U);av_assert2(a1.num max a1.den max);*dst_num sign ? -a1.num : a1.num;*dst_den a1.den;return den 0; } 所以语句 av_reduce(avctx-framerate.den, avctx-framerate.num,sps-num_units_in_tick * 2, sps-time_scale, 1 30); 相当于执行了公式视频帧率 time_scale / (2 * num_units_in_tick)。然后把得到的视频帧率的分子和分母分别存放到avctx-framerate.den和avctx-framerate.num中返回。
http://www.w-s-a.com/news/663201/

相关文章:

  • 韶关市建设工程造价网站网络营销的平台有哪些
  • 网站建设费大概多少钱成都网站建设低价
  • 做表格的网站东莞常平房价
  • 国家级建设网站高密做网站哪家强价位
  • 江西省新的建设厅三类人员网站做标记网站
  • 做最精彩绳艺网站产品设计培训
  • 营销型网站建设品牌深圳网络推广最新招聘
  • 单位网站等级保护必须做吗广州app软件开发公司
  • 免费flash网站模板怎么仿网站链接
  • 泉州网站建设哪家好平面设计转行做什么比较好
  • 忘记网站备案账号设计一个网站
  • 国内购物网站哪个最好海珠营销网站建设报价
  • 小型网站搭建logo免费制作
  • dede 网站模板哈尔滨房产信息网官方网站
  • 设计师个人作品集模板班级优化大师网页版登录
  • 高端网站建设教学网站开发前期准备工作
  • 网站评论列表模板设计官网的
  • 怎么做可以访问网站ui设计自学学的出来吗
  • 网站如何接入支付宝软件开发工作内容描述
  • 廊坊网站建设搭建整合营销传播的效果表现为
  • 网站服务器在本地是指园林绿化
  • 公司网站建设需要什么科目网站代运营价格
  • 网站建设前的ER图ppt模板图片 背景
  • 做一个网站花多少钱网站导航营销步骤
  • 仙桃网站定制做房产网站能赚钱吗
  • 西安网站制作模板最新源码
  • 南京江宁网站建设大学高校网站建设栏目
  • 模板网站建设明细报价表做网站第一
  • 公司网站建设系统软件开发 上海
  • 怎么让公司建设网站固安县建设局网站