mplayer 音视频同步原理

mplayer播放时的大循环过程为:
while(!mpctx->eof){

  fill_audio_out_buffers();//音频stream的读取,解码,播放
  update_video(&blit_);//视频stream的读取,解码,过滤处理
  sleep_until_update(&time_, &aq_sleep_time);//计算延迟时间并睡眠等待
  mpctx->video_out->flip_page();//视频的播放
  adjust_sync_and_print_status(_time_remaining, time_);//根据音视频的PTS做同步矫正处理

}

音视频同步方法为
1)音频播放playsize = mpctx->audio_out->play(sh_audio->a_out_buffer, playsize,  playflags);  后,根据数据大小算出时间并累计
mpctx->delay += playback_speed*playsize/(double)ao_data.bps;
2)视频解码前,用累计延迟时间剪掉本祯视频的时间mpctx->delay -= _time;
3)计算声音延迟时间*time_ = delay - mpctx->delay / playback_speed;
其中float delay = mpctx->audio_out->get_delay();为距当前声音OUTPUT BUF里数据被全部播放完为止所需的时间。
4)播放视频同步完成,所以视频的播放是完全根据声卡最后的数据输出来同步的。
5)计算出当前音视频PTS差double AV_delay = a_pts - audio_delay - v_pts;再算出矫正值x = (AV_delay + timing_error * playback_speed) * 0.1f;最后把矫正的时间加到延迟累计中mpctx->delay+=x;。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值