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

上海空灵网站设计设计图纸用什么软件

上海空灵网站设计,设计图纸用什么软件,快速仿站网站建设,免费制作个人网页摘要:本文主要详细描述FFmpeg中封装时写packet到媒体文件的函数av_interleaved_write_frame的实现。   关键字:av_interleaved_write_frame   读者须知:读者需要熟悉ffmpeg的基本使用。 1 基本调用流程 av_interleaved_write_frame的基本…

  摘要:本文主要详细描述FFmpeg中封装时写packet到媒体文件的函数av_interleaved_write_frame的实现。
  关键字av_interleaved_write_frame
  读者须知:读者需要熟悉ffmpeg的基本使用。

1 基本调用流程

  av_interleaved_write_frame的基本调用流程图如下。
在这里插入图片描述

  首先就是根据输入数据是否为空选择调用的函数,如果为空就会调用interleaved_write_packet刷新数据,否则调用write_packets_common写数据。
  write_packets_common中,check_packet检查输入的数据和期望写入的媒体流是否能够对上。prepare_input_packet对输入数据进行修正,如果pts和dts其中之一为NOPTS则设置为对方的值,以及如果设置了is_intra_only则每一帧都会设置标志位AV_PKT_FLAG_KEY。而check_bitstream就是调用s->oformat->check_bitstream检查流是否符合对应的格式。最后才是调用write_packet_common进行写数据。如果有设置filter的话就调用write_packets_from_bsfs处理。

  write_packet_common会根据输入的参数是否需要交织存储来调用具体的函数写packet。非交织的情况下就会调用write_packet,该函数内部实际调用的s->oformat->write_packets->oformat->write_uncoded_frame写文件,后者处理裸流。
  interleaved_write_packet内,如果AVOuputFormat设置了对应的函数指针则直接调用s->oformat->interleave_packet写文件,否则就用FFmpeg提供的ff_interleave_packet_per_dts。我们重点看下这个函数实现。

2 ff_interleave_packet_per_dts

  音视频交织就是,将音频数据和视频数据存储到文件时,按照几帧音频几帧视频的方式存储,这样在处理流数据时就不会发生频繁的seek导致一些性能问题。音视频交织的视频对于网络播放也比较友好。
在这里插入图片描述

  ff_interleave_packet_per_dts只是针对当前的两个流的packet的时间戳进行比较避免在文件存储过程中距离太远导致解封转时要频繁seek文件。最终封装文件写入到磁盘还是需要write_packet。该函数首先将送入的pkt插入到缓存队列中,然后在从当前缓存队列中选出一帧返回调用write_packet进行写入。
  在看ff_interleave_add_packet函数的实现之前,我们先简单看下帧比较函数interleave_compare_dts的实现,该函数用来比较两个packet的dts。如果非音频流就是调用的av_compare_ts进行比较,否则会根据当前音频流是否有preload去除preload的偏移:

int preload  = st ->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
int preload2 = st2->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
if (preload != preload2) {int64_t ts, ts2;preload  *= s->audio_preload;preload2 *= s->audio_preload;//preload不同时需要减掉preload的偏移ts = av_rescale_q(pkt ->dts, st ->time_base, AV_TIME_BASE_Q) - preload;ts2= av_rescale_q(next->dts, st2->time_base, AV_TIME_BASE_Q) - preload2;if (ts == ts2) {ts  = ((uint64_t)pkt ->dts*st ->time_base.num*AV_TIME_BASE - (uint64_t)preload *st ->time_base.den)*st2->time_base.den- ((uint64_t)next->dts*st2->time_base.num*AV_TIME_BASE - (uint64_t)preload2*st2->time_base.den)*st ->time_base.den;ts2 = 0;}comp = (ts2 > ts) - (ts2 < ts);
}

  重点就是下面的代码,从当前buffer中找到当前帧的插入位置然后插入到packet的链表中。

if (st->internal->last_in_packet_buffer) {next_point = &(st->internal->last_in_packet_buffer->next);
} else {next_point = &s->internal->packet_buffer;
}
//省略部分代码.......
if (*next_point) {if (chunked && !(pkt->flags & CHUNK_START))goto next_non_null;if (compare(s, &s->internal->packet_buffer_end->pkt, pkt)) {while (   *next_point&& ((chunked && !((*next_point)->pkt.flags&CHUNK_START))|| !compare(s, &(*next_point)->pkt, pkt)))next_point = &(*next_point)->next;if (*next_point)goto next_non_null;} else {next_point = &(s->internal->packet_buffer_end->next);}
}

  插入成功后回到ff_interleave_packet_per_dts中,从当前的packet链表的头结点拿到一阵返回给write_packet写入。

http://www.yayakq.cn/news/397997/

相关文章:

  • 做电影网站怎么挣钱如何做热词网站
  • 现在很多网站都是wordpress网站国际推广
  • 试看30秒做受小视频网站学习网站开发技术
  • 建设工程施工合同范本哪个网站网站建设 gei l f
  • 网站建设中忽略的字体侵权行为wordpress文章上头条
  • jsp网站开发实例标题栏软文营销的经典案例
  • 北京网站建设哪家好上海猎头公司对个人怎么收费
  • 保定手机网站赣州市建设工程造价管理网站
  • 天津营销网站建设百度网站的安全建设方案
  • 做app和做网站相同和区别wordpress首页导航添加
  • 学做美食看哪个网站搜外滴滴友链
  • 腾讯云做的网站会被拦截么做外贸营销网站销售咋样
  • 去国外做移动支付网站吗网站建站教程
  • 网站改版提交给百度没内容的网站怎么优化
  • 中兴路由器做网站个人网站做淘客
  • 高中作文网站做一个营销型的网站多少钱
  • 大型网站开发技术网站模板定做
  • pc手机模板网站建设沃航科技网站开发
  • 网站顶部公告代码唯品会一家做特卖的网站 分析
  • 一个公司建设网站wordpress只有一个主题
  • 门户网站内容维护流程庆阳网站建设推广
  • 哪些网站可以做任务挣钱外贸网站建站n
  • 游戏游戏大全seo关键词优化提高网站排名
  • wordpress add_query_var优化算法
  • 做别人一摸一样的网站犯法吗营口网站seo
  • 移动互联网的主要特点怎么优化整站
  • 百度站长平台申请提交链接微信上微网站怎么做的
  • 响应式做的比较好的网站正能量网站大全
  • 长沙多用户商城网站建设网站用cms
  • 江山市城乡建设局网站宿迁市区建设局网站