Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47919
  • 博文数量: 13
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-24 14:46
文章分类

全部博文(13)

文章存档

2009年(4)

2008年(9)

我的朋友
最近访客

分类: C/C++

2009-02-19 11:23:26

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) |
0

上一篇:gdb调试方法

下一篇:MIPS上的C语言编程

给主人留下些什么吧!~~