【VLC核心一】播放流程梳理->live555收流+ffmpeg:AVCodec解码

一、前言

VLC播放音视频的核心流程梳理,从live555收流到ffmpeg解码的整套流程

涉及到MultiFramedRTPSource、RTPSource、FramedSource、live555、es_out、decoder、video、clock、video_output、araw、mtime、dec、input、output、filters、directx等核心类。

二、核心点备注
1、RTPSource中使用报文时间戳与当前时间计算抖动的核心代码

unsigned arrival = (timestampFrequency*timeNow.tv_sec);//音频8000,视频90000
    arrival += (unsigned)
((2.0*timestampFrequency*timeNow.tv_usec + 1000000.0)/2000000);
            // note: rounding
    int transit = arrival - rtpTimestamp;
    if (fLastTransit == (~0)) fLastTransit = transit; // hack for first time
    int d = transit - fLastTransit;
    fLastTransit = transit;
    if (d < 0) d = -d;
    fJitter += (1.0/16.0) * ((double)d - fJitter);

2、RTPSource中使用报文时间戳差值计算出timeval 类型的presentationTime的核心代码

// Return the 'presentation time' that corresponds to "rtpTimestamp":
  if (fSyncTime.tv_sec == 0 && fSyncTime.tv_usec == 0) {
    // This is the first timestamp that we've seen, so use the current
    // 'wall clock' time as the synchronization time. (This will be
    // corrected later when we receive RTCP SRs.)
    fSyncTimestamp = rtpTimestamp;
    fSyncTime = timeNow;
  }

  int timestampDiff = rtpTimestamp - fSyncTimestamp;
      // Note: This works even if the timestamp wraps around
      // (as long as "int" is 32 bits)

  // Divide this by the timestamp frequency to get real time://视频timeDiff =0.040000000000000001
  double timeDiff = timestampDiff/(double)timestampFrequency;
  // Add this to the 'sync time' to get our result:
  unsigned const million = 1000000;
  unsigned seconds, uSeconds;
  if (timeDiff >= 0.0) {
    seconds = fSyncTime.tv_sec + (unsigned)(timeDiff);
    uSeconds = fSyncTime.tv_usec
      + (unsigned)((timeDiff - (unsigned)timeDiff)*million);
    if (uSeconds >= million) {
      uSeconds -= million;
      ++seconds;
    }
  } else {
    timeDiff = -timeDiff;
    seconds = fSyncTime.tv_sec - (unsigned)(timeDiff);
    uSeconds = fSyncTime.tv_usec
      - (unsigned)((timeDiff - (unsigned)timeDiff)*million);
    if ((int)uSeconds < 0) {
      uSeconds += million;
      --seconds;
    }
  }

3、live555.cpp中将timeval转换为微秒级时间戳i_pts的要点

int64_t i_pts = (int64_t)pts.tv_sec * INT64_C(1000000) +
        (int64_t)pts.tv_usec;
/* XXX Beurk beurk beurk Avoid having negative value XXX */
    i_pts &= INT64_C(0x00ffffffffffffff);

<span style="color:#3333FF;">1)注意避免翻转为负数 2、block里i_pts+1,i_dts根据sdp中的packetization-mode=1字段判断</span>

4、处理H.264视频的要点

1)丢帧策略可以设置丢B帧、非参考帧、除关键帧以外所有帧等,可以在处理延时的情况下加速解码,尝试赶上发流速度,是明智之举;

2)如果存在过期的帧,且当前时间减第一个过期帧的时间>5S,则认为该帧过期时间太长,直接释放;如果统计的过期帧数>4且<12,则设置ffmpeg的解码器丢帧策略;

3)解码后得到pts,如果frame_rate和frame_rate_base>0,或者p_context->time_base.den > 0计算获得下一帧的pts,更新p_sys->i_pts,用于下一帧解码时校验数据;

4)每次ffmpeg解码后,使用clock机制将pts流时间戳转换为系统时间,然后检查转换后的时间是否过期,过期算法为:判断显示时间<=mdate() 说明已过期,累加过期帧数;备注:*pi_ts0 >= mdate() + i_ts_delay + i_ts_buffering + i_ts_bound(  i_ts_bound默认值为9s)

5)最后在送渲染队列前使用clock::input_clock_ConvertTS将时戳拉伸到播放rate对应区间。

5、处理音频的要点

1)计算比特率和样本数 unsigned samples = (8 * p_block->i_buffer) / framebits;

2)通过采样数计算时间增量 mtime_t date_Increment( date_t *p_date, uint32_t i_nb_samples )

3)a、发现正确的播放频率  b、重新制作音频帧。核心流程如下:

1、仅正常播放速率支持音频播放,否则丢弃
2、if ( start_date != VLC_TS_INVALID && start_date < now )期望时间戳帧已严重过期,重刷音频缓存数据,停止重采样(主要发生在用户暂停或解码器错误)
3、if ( p_buffer->i_pts < now + AOUT_MIN_PREPARE_TIME )帧已过期,直接丢弃;AOUT_MIN_PREPARE_TIME为40ms
4、mtime_t drift = start_date - p_buffer->i_pts;偏移量drift = 期望播放时间戳-当前帧的实际时间戳,drift<0说明帧滞后来了,drift>0说明帧提前来了;
5、if( drift < -i_input_rate * 3 * AOUT_MAX_PTS_ADVANCE / INPUT_RATE_DEFAULT )如果偏移量<-3*40ms,则停止缓冲,停止重采样。预设值。
6、if( drift > +i_input_rate * 3 * AOUT_MAX_PTS_DELAY / INPUT_RATE_DEFAULT )如果偏移量>3*60ms,缓冲太晚,直接丢弃
7、if ( ( p_input->i_resampling_type == AOUT_RESAMPLING_NONE ) && ( drift < -AOUT_MAX_PTS_ADVANCE || drift > +AOUT_MAX_PTS_DELAY ) && p_input->i_nb_resamplers > 0 )drift漂移量<-40ms或>60ms,则重新发现播放频率.即滞后40ms或提前60ms(主要原因是:1、输入时钟偏移有误2、用户短暂暂停 3、输出端有点延时,丢失了一点同步--费解,4、现网有部分摄像头的采样率和码流里的时间戳不匹配,也会导致该问题)
8、根据偏移结果微调采样频率
9、p_buffer->i_pts = start_date;最终将期望时间戳送渲染;

三、核心流程时序图

时间: 2024-10-23 03:37:56

【VLC核心一】播放流程梳理-&gt;live555收流+ffmpeg:AVCodec解码的相关文章

【VLC核心二】clock管理流程

一.前言 clock管理是vlc播放音视频的重要部分,从live555收流到decoder解码到render渲染,整个播放过程中均需依赖clock机制. 二.涉及的类文件 src\input\input.c modules\access\live555.cpp src\input\es_out.c src\input\decoder.c src\input\clock.c 三.clock核心点备注 1.live555::CmdExecuteControl(ES_OUT_SET_PCR,p_sys

vlc使用ffmepg get_buffer2流程

一.综述: 在设计播放器1.0时,曾使用vtune和VS自带的性能分析工具测试,对于播放器这样的软件其核心流程分为收流&拼帧.解码.渲染三大块,其中收流&拼帧在大并发模式下不是性能瓶颈.渲染模块使用D3D渲染,渲染操作本身仅占用3%左右的CPU时间.而解码和拷贝操作是非常耗费CPU的.对于ffmpeg解码优化,本文不做赘述,后续详细展开.此处仅讨论内存拷贝优化方案 二.内存拷贝优化方案 1.业界通用播放器一般均使用内存池pool的设计思路,根据分辨率大小申请内存块,一旦申请后,由内存池统一

怡海软件:破解ERP、CRM实施中流程梳理的问题

流程繁琐,效率低下,成本过高,交期延误,客户流失,人员流失--诸多的问题困惑企业,也造成为数不少的企业夭折.因此,如何提高效率.减少浪费.降低成本.加强对关键制造环节的监控,将成为许多企业管理的重点,而优化流程则是达到以上管理效果的一个重要手段.以下内容适用于ERP.CRM等实施中流程梳理的问题: 但很多企业在开展流程优化时,却常常遇到"劳而无功"的尴尬. 经常会有负责流程梳理工作的经理们抱怨说,我们辛辛苦苦地组织了公司流程梳理工作,各项流程都进行了图示化,并将流程中的职责.权限.相关

当卖家进入淘宝:一场从分工开始的流程梳理

初进淘宝的卖家心底都怀着青春期的干劲和对未来的憧憬,给一个舞台,他们就能站上去像马丁?路德金那样,慷慨激昂地感慨一番:"我有一个梦想,XXX天后可以冲钻;我有一个梦想XXX月后可以冲冠;我有一个梦想,XXX年后可以有自己的品牌--"只是随着他们店铺的成长,越来越多的问题开始凸现,仓库管理之痛也无法避免. 某四皇冠卖家,就在仓库管理中遇见了自身的瓶颈:库存投入资金太大,周转率不高;仓库堆放得乱七八糟,衣服.裤子满地乱飞.下班后,售后部有衣服,质检部有衣服,走廊过道上有衣服,客服那也有衣服

VLC音频重采样Audio resample核心流程梳理

Hadoop核心-HDFS读写流程

HDFS写数据步骤: 1. client发起文件上传请求,通过RPC与NameNode建立连接,NameNode检查目标文件是否已经存在,父目录是否存在,并检查用户是否有相应的权限,若检查通过, 会为该文件创建一个新的记录,否则的话文件创建失败,客户端得到异常信息, 2. client通过请求NameNode,第一个block应该传输到哪些DataNode服务器上; 3. NameNode根据配置文件中指定的备份(replica)数量及机架感知原理进行文件分配,返回可用的DataNode的地址

移动端的播放器设计经验:与VLC的考量点完全不同

移动播放器面临的情况: 1.渲染时按照时间戳渲染 2.播放端来的流是抖动不平滑的,可快可慢,可能延时只来一帧,后紧跟N帧. VLC针对抖动的处理方式 1.收流时在收到第一帧TS1的时候取本地绝对时间,作为绝对时戳absPts1,第二帧TS2到来时取本地绝对时戳absPts2.差值计算absDvalue = absPts2 - absPts1  TsDvalue = Ts2-Ts1 ,如果absDvalue > TsDvalue 说明数据延时到来,否则时提前到来.这种方式的缺陷是:以第一帧作为参考

基于Live555,ffmpeg的RTSP播放器直播与点播

基于Live555,ffmpeg的RTSP播放器直播与点播 多路RTSP高清视频播放器下载地址:http://download.csdn.net/detail/u011352914/6604437多路RTSP播放器源码下载地址:http://download.csdn.net/detail/u011352914/6603251多路RTSP播放器SDK说明下载地址:http://download.csdn.net/detail/u011352914/6603271详细完整资料下载地址:http:/

VLC播放RTSP视频延迟问题

之前写过一篇关于在Linux平台上编译Android平台上VLC播放器源代码的文章,vlc这款播放器非常优秀而且是开源的,它的核心是开源视频编解码库ffmpeg.而且这款播放器还支持RTSP协议,这个主要是用开源的live555来实现的,live555这个库以后还需要认真研习. 一:PC端(Windows平台)VLC播放RTSP视频延迟问题解决 前几天用PC平台上的VLC播放RTSP流媒体时延迟时间较长,存在1s左右的延迟,效果不是很好,后来查了资料,发现这个延迟时间是可以修改的. 找到工具->