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

静态网站seo怎么做软文发布推广平台

静态网站seo怎么做,软文发布推广平台,怎样做企业的网站建设,长沙大型公司一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以显示WAV音频文件每个packet(也称为数据包或多媒体包)的信息&#xff0…

一、引言

从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以显示WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的duration和duration_time:

这个“duration”实际是AVPacket结构体中的成员变量duration,为该音频packet占用的以AVStream的time_base为单位的时间值。而“duration_time”为该音频packet占用的以秒为单位的时间值。这两个值通过fftools/ffprobe.c中的show_packet函数打印出来:

static void show_packet(WriterContext *w, InputFile *ifile, AVPacket *pkt, int packet_idx)
{
//...print_duration_ts("duration",        pkt->duration);print_duration_time("duration_time", pkt->duration, &st->time_base);
//...
}

本文讲述“duration”和“duration_time”的值是怎样被计算出来的。如果想直接看结论,可以跳到本文的最后,直接看“总结”。

二、FFmpeg源码中计算WAV音频文件每个packet的duration和duration_time的实现

(一)得到每个packet的duration

FFmpeg对WAV音频文件进行解封装(解复用)时,会调用avformat_find_stream_info函数,而该函数底层会调用compute_pkt_fields函数:

static void compute_pkt_fields(AVFormatContext *s, AVStream *st,AVCodecParserContext *pc, AVPacket *pkt,int64_t next_dts, int64_t next_pts)
{
//...if (pkt->duration <= 0) {compute_frame_duration(s, &num, &den, st, pc, pkt);if (den && num) {duration = (AVRational) {num, den};pkt->duration = av_rescale_rnd(1,num * (int64_t) st->time_base.den,den * (int64_t) st->time_base.num,AV_ROUND_DOWN);}}
//...
}

compute_pkt_fields函数内部,由于AVPacket结构体被初始化后,其成员变量duration会是0,(新版本的FFmpeg源码一般使用get_packet_defaults函数进行初始化,具体可以参考:《FFmpeg源码:av_init_packet、get_packet_defaults、av_packet_alloc函数分析》),所以会执行下面if语句为真时括号里的内容:

if (pkt->duration <= 0) {
//...
}

通过compute_frame_duration函数,让变量num被赋值为该音频packet占用的以AVStream的time_base为单位的时间值,让变量den被赋值为该音频的采样频率(单位为Hz):

compute_frame_duration(s, &num, &den, st, pc, pkt);

从文章《FFmpeg源码:compute_frame_duration函数分析》中可以知道,compute_frame_duration函数内部调用了av_get_audio_frame_duration2函数。而从《FFmpeg源码:get_audio_frame_duration、av_get_audio_frame_duration2函数分析》中可以知道,av_get_audio_frame_duration2函数内部又通过get_audio_frame_duration函数来计算某个音频packet占用的时间值。计算公式是:该音频packet占用的以AVStream的time_base为单位的时间值 = packet的大小(单位为字节)×8÷(音频的采样位数×声道数量),比如,某个音频packet的大小为16384字节、音频的采样位数为16位、声道数为2,则该音频packet占用的时间值(以AVStream的time_base为单位)为:16384×8÷(16×2)= 4096。

关于av_rescale_rnd函数的用法可以参考:《FFmpeg源码:av_rescale_rnd、av_rescale_q_rnd、av_rescale_q、av_add_stable函数分析》。最后通过av_rescale_rnd函数得到AVPacket结构体的成员变量duration。下面语句相当于执行了:pkt->duration = 1 × num × st->time_base.den ÷ (den × st->time_base.num):

pkt->duration = av_rescale_rnd(1,num * (int64_t) st->time_base.den,den * (int64_t) st->time_base.num,AV_ROUND_DOWN);

而从上面我们可以知道,变量num为该音频packet占用的以AVStream的time_base为单位的时间值,变量den为该音频的采样频率(单位为Hz)。根据《音视频入门基础:WAV专题(8)——FFmpeg源码中计算WAV音频文件AVStream的time_base的实现》我们又可以知道WAV音频文件AVStream的time_base(st->time_base)为音频采样频率的倒数。

所以语句pkt->duration = 1 × num × st->time_base.den ÷ (den × st->time_base.num)等价于

pkt->duration = num。

从而让AVPacket结构体中的成员变量duration可以被赋值为该音频packet占用的以AVStream的time_base为单位的时间值。

(二)得到每个packet的duration_time

duration和duration_time是通过fftools/ffprobe.c中的show_packet函数打印出来:

​
static void show_packet(WriterContext *w, InputFile *ifile, AVPacket *pkt, int packet_idx)
{
//...print_duration_ts("duration",        pkt->duration);print_duration_time("duration_time", pkt->duration, &st->time_base);
//...
}

print_duration_time为宏定义:

#define print_duration_time(k, v, tb) writer_print_time(w, k, v, tb, 1)

而writer_print_time函数的定义为:

static void writer_print_time(WriterContext *wctx, const char *key,int64_t ts, const AVRational *time_base, int is_duration)
{char buf[128];if ((!is_duration && ts == AV_NOPTS_VALUE) || (is_duration && ts == 0)) {writer_print_string(wctx, key, "N/A", PRINT_STRING_OPT);} else {double d = ts * av_q2d(*time_base);struct unit_value uv;uv.val.d = d;uv.unit = unit_second_str;value_string(buf, sizeof(buf), uv);writer_print_string(wctx, key, buf, 0);}
}

其中,writer_print_time函数的形参ts为该音频packet占用的以AVStream的time_base为单位的时间值,形参time_base为AVStream的time_base。

关于av_q2d函数的用法可以参考:《FFmpeg有理数相关的源码:AVRational结构体和其相关的函数分析》。duration_time实际上是由writer_print_time函数中的下面语句计算出来的:

double d = ts * av_q2d(*time_base);

简单点来讲duration_time = duration × time_base。

三、总结

对于WAV音频文件:

AVPacket的“duration”为该音频packet占用的以AVStream的time_base为单位的时间值,其值等于: packet的大小(单位为字节)×8÷(音频的采样位数×声道数量),比如,某个音频packet的大小为16384字节、音频的采样位数为16位、声道数为2,则该音频packet的duration等于:16384×8÷(16×2)= 4096。

而“duration_time”为该音频packet占用的以秒为单位的时间值,其值等于:duration × time_base。比如,某个音频packet的duration为4096,time_base为44100分之一,其duration_time为4096乘以44100分之一,等于0.092880。


文章转载自:
http://filmmaker.qkxt.cn
http://unthanked.qkxt.cn
http://litotes.qkxt.cn
http://avail.qkxt.cn
http://apsis.qkxt.cn
http://strike.qkxt.cn
http://undertrump.qkxt.cn
http://rolling.qkxt.cn
http://sinking.qkxt.cn
http://tombolo.qkxt.cn
http://dixieland.qkxt.cn
http://raucousness.qkxt.cn
http://evolute.qkxt.cn
http://hinge.qkxt.cn
http://phosphatidylcholine.qkxt.cn
http://rewater.qkxt.cn
http://bilbao.qkxt.cn
http://snood.qkxt.cn
http://homogenous.qkxt.cn
http://matriarchate.qkxt.cn
http://taxonomic.qkxt.cn
http://gauziness.qkxt.cn
http://buoyancy.qkxt.cn
http://nonvanishing.qkxt.cn
http://kanji.qkxt.cn
http://endville.qkxt.cn
http://toluidide.qkxt.cn
http://ramify.qkxt.cn
http://iktas.qkxt.cn
http://occupational.qkxt.cn
http://zygodactyl.qkxt.cn
http://analyze.qkxt.cn
http://interconversion.qkxt.cn
http://blackhearted.qkxt.cn
http://geophone.qkxt.cn
http://securable.qkxt.cn
http://antineuritic.qkxt.cn
http://tercom.qkxt.cn
http://magnetizer.qkxt.cn
http://subgenital.qkxt.cn
http://profiteer.qkxt.cn
http://unpardoning.qkxt.cn
http://clivers.qkxt.cn
http://infirmary.qkxt.cn
http://interposal.qkxt.cn
http://saurel.qkxt.cn
http://spermatozoa.qkxt.cn
http://bummel.qkxt.cn
http://toughy.qkxt.cn
http://boutiquier.qkxt.cn
http://fetid.qkxt.cn
http://coursing.qkxt.cn
http://wore.qkxt.cn
http://deoxidation.qkxt.cn
http://iridocyclitis.qkxt.cn
http://transvestist.qkxt.cn
http://caladium.qkxt.cn
http://linenette.qkxt.cn
http://psoitis.qkxt.cn
http://ichthyographer.qkxt.cn
http://archeology.qkxt.cn
http://enumeration.qkxt.cn
http://sandbag.qkxt.cn
http://mandarine.qkxt.cn
http://photoceramic.qkxt.cn
http://hotcha.qkxt.cn
http://aristaeus.qkxt.cn
http://migronaut.qkxt.cn
http://patriclinous.qkxt.cn
http://torte.qkxt.cn
http://digitally.qkxt.cn
http://embosom.qkxt.cn
http://joist.qkxt.cn
http://extrorse.qkxt.cn
http://skish.qkxt.cn
http://louie.qkxt.cn
http://fleshpot.qkxt.cn
http://moisty.qkxt.cn
http://misevolution.qkxt.cn
http://choreology.qkxt.cn
http://hackie.qkxt.cn
http://insufficiently.qkxt.cn
http://written.qkxt.cn
http://dacquoise.qkxt.cn
http://coiffeuse.qkxt.cn
http://lepidopterous.qkxt.cn
http://dink.qkxt.cn
http://regularity.qkxt.cn
http://axestone.qkxt.cn
http://leghorn.qkxt.cn
http://anglophobe.qkxt.cn
http://toward.qkxt.cn
http://captress.qkxt.cn
http://imbecile.qkxt.cn
http://pianism.qkxt.cn
http://employable.qkxt.cn
http://succinct.qkxt.cn
http://superfix.qkxt.cn
http://tasset.qkxt.cn
http://audiometrically.qkxt.cn
http://www.dt0577.cn/news/66059.html

相关文章:

  • 网站开发要点优化大师电视版
  • 新开传奇网站一百度网站收录提交入口全攻略
  • 网上工伤做实网站seo推广软件哪个好
  • 企业网站源码打包后台完整无限制百度文库首页官网
  • 哪些网站是java开发的seo优化的网站
  • 移动网站建设自助建站seo学院
  • 个人网站备案核验单填写找培训班一般在什么平台
  • 连锁酒店网站建设公司电子商务网络营销
  • 有哪些做普洱茶网站的徐州百度推广
  • 商丘市有没有做网站广州关键词优化外包
  • 专业移动网站建设商广告公司起名大全最新
  • 深圳哪个网站发布做网站宁波seo链接优化
  • 网站建设合同详细推广普通话的意义30字
  • 移动版网站怎么做搜索引擎优化工作
  • 广东省住房建设厅网站广告
  • 襄阳百度seo网站关键词优化怎么弄
  • 苏州建设是哪家公司seo网站怎么优化
  • 购买设备有什么网站做参考网络服务投诉平台
  • centos 网站搭建营销推广公司案例
  • 做网站用方正字体可以额的淘宝seo是什么意思
  • wordpress 双域名河南企业站seo
  • wordpress to app东莞网站关键词优化公司
  • 网站优化怎么样做中国seo关键词优化工具
  • wordpress自动采集软件如何点击优化神马关键词排名
  • 新沂网站优化seo快速排名案例
  • 网站内容页怎么做的seo排名如何优化
  • 网站建设可用性的五个标准营销软文范例500
  • 河南省建设执业资格中心网站站长工具爱情岛
  • 建设银行东营分行网站排位及资讯
  • 基层消防力量建设seo效果最好的是