mplayer demux

转载 2012年03月21日 09:40:36
mplayer音视频同步浅度学习 && VLC视频处理代码浅析
2010年08月25日 星期三 10:45

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;

VLC视频处理代码浅析

序言

         最近看了vlc代码(版本0.5.0)视频处理播放过程,写个总结把视频数据主要流程整理一下。Vlc视频处理及播放的过程主要是三个循环:demux , decoder, display.

视频处理播放过程介绍

     1,demux循环

     在src/input/input.c中__input_CreateThread()创建一个线程RunThread()。该线程中的while()循环,起到一个守护作用,例如对seek的处理等;其中的p_input->pf_demux( p_input )函数进行demux处理。该函数是在InitThread()时,由p_input->p_demux = module_Need( p_input, "demux",p_input->psz_demux );进行关联的。以TS流为例,demux/mpeg/ts.c 中的activate()会被激活,进而设置p_input->pf_demux = Demux; 所以,TS.C中的Demux()为执行demux的函数。其中的p_demux->mpeg.pf_read_ts和p_demux->mpeg.pf_demux_ts是在activate()时由p_demux->p_module = module_Need( p_input, "mpeg-system", NULL )关联到mpeg/system.c中的Readts()和Demuxts()。

     2,decoder循环

在Demux()函数执行时会调用PSI_CALLBACK宏,通过调用该宏最终会调用src/input/input_program.c中的input_SelectEs()函数。该函数会调用src/input/input_dec.c中的input_RunDecoder()。input_RunDecoder()中会创建Decoder线程RunDecoder( ) (见ffmpeg/ffmpeg.c) 。RunDecoder( )包含一个while( )循环,在循环中如果数据为VIDEO_ES,会调用codec/ffmpeg/video.c中的void E_( DecodeThread_Video )( vdec_thread_t *p_vdec )函数进行解码,该函数会调用ffmpeg_CreateVout()来创建视频输出线程。

     3,display循环

ffmpeg_CreateVout()函数会调用vout_request( )函数,进而通过vlc_thread_create( p_vout, "video output", RunThread,

                           VLC_THREAD_PRIORITY_OUTPUT, VLC_FALSE )创建线程RunThread()。该线程中的while( )中循环执行的函数的主要功能如下:1)找到最近的需要显示的图像,2)rendering 图像 ,3)睡眠到显示图像的时间,4)显示图像, 5)事件处理。其中p_vout->pf_render( )是由src/video_output/video_output.c文件__vout_create( )函数中module_Need()关联的。

其它

1,关于VLC的音视频同步

对于音频数据,前面的过程跟视频类似 ,不同的是音频输出环节。视频播放处理是在一个线程内循环完成的,但音频播放的不同模块运行在不同的线程上。音视频的同步完全是按照demux后音视频各自的PTS进行的,原理上跟mplayer 的同步机制完全不同。


相关文章推荐

白话浅谈MPEG2-TS之demux

TS都是一个TS包组成,每个包都是固定188个字节,每个包都是4个字节包头开始,包头第一个字节是固定的0x47。那其他184个字节是什么呀,里面基本都装的是音频或者视频解码数据。如果给定一个TS文件,...

vlc_demux_mpg

  • 2012-11-27 11:55
  • 379KB
  • 下载

ffmpeg学习之路(一)Demux过程(解复用)1

上一篇文章说了一下媒体文件解码的流程,在该基础上再对其中的第一个过程Demux在ffmpeg中是如何实现的进行说明。 ffmpeg中用来进行Demux的关键函数是avformat_open_input...

demux中的SEC 和PES说明

  • 2014-11-15 11:53
  • 40KB
  • 下载

ts demux解复用

  • 2014-12-14 21:04
  • 338KB
  • 下载

ffmpeg之demux

今天学习解析媒体文件。 写了一个用例,解析MP4文件得到视频帧和音频帧,并分别保存到不同的文件。 照惯例,先学习,再代码。 学习 av_register_all /** * 初始化 libavf...

FLV_Demux_H264_AAC_本地文件_1

  • 2013-05-29 11:38
  • 5.05MB
  • 下载

关于音视频的一些知识(demux、filter等)

转自:http://blog.csdn.net/haomcu/article/details/7072707 MUX和DEMUX Mux 是 Multiplex 的缩写,意为“...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)