mplayer播放时的大循环过程为:
while(!mpctx->eof){
fill_audio_out_buffers();//音频stream的读取,解码,播放
update_video(&blit_frame);//视频stream的读取,解码,过滤处理
sleep_until_update(&time_frame, &aq_sleep_time);//计算延迟时间并睡眠等待
mpctx->video_out->flip_page();//视频的播放
adjust_sync_and_print_status(frame_time_remaining,
time_frame);//根据音视频的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 -=
frame_time;
3)计算声音延迟时间*time_frame = 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;。
主函数:
int main(int argc,char* argv[])
{
**调用 AddExcept()注册异常处理函数
** initmplayer(); //初始化,创建快进和暂停的信号量
**InitTimer();初始化计时器
**mp_msg_init();初始化消息系统
**set_path_env();设置路径、环境
**ipu_image_start();ipu初始化
**mplayer_showmode(1);设置显示模式
**parse_codec_cfg(NULL);解析codec配置寄存器
**打开数据流
**分析播放树
**添加播放树列表
**初始化预填充缓存
**打开播放的文件
**创建buffer
**打开数据流
**检测数据流类型(音频格式和视频格式)
**分析音频流视频流的信息(原始视频尺寸、分辨率、帧频率、码流大小)
**启动相应的分离器
**分析剪辑信息
**初始化codec(多媒体数字信号编解码器)
**选择打开相应的视频解码器
**初始化视频解码器,分析视频流信息
**选择打开相应的音频解码器
**初始化音频解码器、PCM,分析音频信息
**同步音频视频输出
**开始播放
}
阅读(1076) | 评论(0) | 转发(0) |