以前用过qt4+mplayer来用过一个播放器。感觉只是加个外壳,没什么意思。我同学还跟我说,mplayer不是那么容易做的。
直到现在,我还记住这句话。
那时,我们一起学linux,感觉能用qt做个二次开发已经不错。
直到现在,我真正接触ffmpeg,sdl,OSS,OpenGL。我才感觉到,原来开发一款播放器是这么有趣。
在这里,我想整理一下思路,因为确实遇到了不少问题。
播放器的一般流程(转自网上资料)
1. 输入 : 从文件或网络等读取原数据,如 x.avi, x.mov, rtsp://xxx, 对原数据进行解析,比如文件,首先要分析文件格式,从文件中取得音视频编码参数,视频时间长度等信息,然后要从其中取出音频编码数据和视频编码数据送到解码部分,这里暂称这种编码源数据块为 packet。
2. 解码 : 初始化时,利用输入端从源数据中取得的信息调用不同的解码库初始化;然后接收输入端传送来的音视频编码数据,分别进行音频解码和视频解码,视频解码出来的 数据一般是 YUV 或 RGB 数据,这里暂称为 picture, 音频解码出来的数据是采样数据,是声卡可以播放的数据,这里暂称为 sample。 解码所得的数据接下来送到输出部分。
3. 输出 : 接收解码部分送来的 picture 和 sample 并显示。 视频显示一般使用某个图形库,如 SDL, Xlib, DirectDraw, OpengGL, FrameBuffer等, 音频输出是把 sample 写入系统的音频驱动,由音频驱动送入声卡播放, 可用的音频输出有 ALSA, OSS, SDL, DirectSound, WaveOut等。
ffplay流程图大概如下:
图一
图二
由些可见,ffplay实现方案为
一个packet队列,一个picture队列
一个input(主)线程,一个decode线程,两个output(音视频输出)线程
参考阅读:
《An ffmpeg and SDL Tutorial》
FBI888XH的博客:http://blog.chinaunix.net/uid-24203478-id-3035890.html
转自:http://blog.csdn.net/losophy/article/details/7754868